Как преобразовать вызов curl с помощью "-i --upload-file" в java Unirest или любой другой http-запрос? - PullRequest
0 голосов
/ 05 февраля 2019

В приведенном ниже примере для загрузки файла изображения, включенного в двоичный файл, используется cURL.

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

Работает нормально.Мне нужно сделать этот запрос из моего приложения Java.

Я попробовал следующий код

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();

Однако он возвращает статус 400 Bad Request.Есть ли способ вызвать такой запрос из Java?

Это запрос от 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

Ответы [ 2 ]

0 голосов
/ 27 февраля 2019

После нескольких часов удара головой о стену я наконец-то понял, как преобразовать вызов curl в RestClient (я использую Ruby on Rails).

Я думаю, проблема в том, что вы должны передать MIME-тип в качестве Content-Type в заголовках запроса.

Я использую MiniMagick , чтобы выяснить MIME-тип изображения, которое я загружаю в LinkedIn.MiniMagick также может дать вам двоичную строку изображения, которая требуется LinkedIn, так что это беспроигрышная ситуация.

Это вызов, который наконец сработал:

file = MiniMagick::Image.open(FILE_PATH)
RestClient.post(UPLOAD_URL, file.to_blob, { 'Authorization': 'Bearer TOKEN', 'Content-Type': file.mime_type })
0 голосов
/ 05 февраля 2019

Я думаю, что команда curl curl -i --upload-file /path/to/image.png --header "Authorization: Token" 'https://url....'

использует PUT, в то время как ваш клиент Java использует POST

Источник: справочная страница 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.

Не уверен, что это настоящая проблема.Ваша ссылка на документ API действительно указывает POST.

...