How to convert curl call with “-i --upload-file” into java Unirest or any other http request?

。_饼干妹妹 提交于 2019-12-29 07:08:29

问题


The example below uses cURL to upload image file included as a binary file.

curl -i --upload-file /path/to/image.png --header "Authorization: Token" 'https://url....' 

It works fine. I need to make this request from my Java application.

I have tried next code

URL image_url = Thread.currentThread().getContextClassLoader().getResource("jobs_image.jpg");
String path = image_url.getFile();
HttpResponse<String> response = Unirest.post(uploadUrl)
  .header("cache-control", "no-cache")
  .header("X-Restli-Protocol-Version", "2.0.0")
  .header("Authorization", "Bearer " + token + "")
  .field("file", new File(path))
  .asString();

However, it returns status 400 Bad Request. Is there any way to call such request from Java?

This is a request from LinkedIn v2 API: https://docs.microsoft.com/en-us/linkedin/consumer/integrations/self-serve/share-on-linkedin?context=linkedin/consumer/context#upload-image-binary-file


回答1:


After several hours of banging my head against the wall, I finally figured out how to convert the curl call into a RestClient one (I'm using Ruby on Rails).

I think the problem you're having is that you have to pass the MIME type as the Content-Type in the request headers.

I'm using MiniMagick to figure out the MIME type of the image I'm uploading to LinkedIn. MiniMagick can also give you the binary string of the image that LinkedIn requires, so it's a win-win situation.

This is the call that finally worked:

file = MiniMagick::Image.open(FILE_PATH)
RestClient.post(UPLOAD_URL, file.to_blob, { 'Authorization': 'Bearer TOKEN', 'Content-Type': file.mime_type })



回答2:


I think the curl command curl -i --upload-file /path/to/image.png --header "Authorization: Token" 'https://url....'

uses PUT while your Java client uses POST

Source: The man page of curl.

       -T, --upload-file <file>
              This  transfers  the  specified local file to the remote URL. If
              there is no file part in the specified URL, Curl will append the
              local file name. NOTE that you must use a trailing / on the last
              directory to really prove to Curl that there is no file name  or
              curl will think that your last directory name is the remote file
              name to use. That will most likely cause the upload operation to
              fail. If this is used on an HTTP(S) server, the PUT command will
              be used.

Not sure if this is the actual problem though. Your API doc link actually specifies POST.



来源:https://stackoverflow.com/questions/54538939/how-to-convert-curl-call-with-i-upload-file-into-java-unirest-or-any-other

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!