如何将带有“-i --upload-file”的 curl 调用转换为 java Unirest 或任何其他 http 请求?

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

以下示例使用 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();

但是,它 returns 状态 400 错误请求。 有什么方法可以从 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

我认为 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 文档 link 实际上指定 POST.

在用头撞墙几个小时后,我终于想出了如何将 curl 调用转换为 RestClient 调用(我在 Rails 上使用 Ruby ).

我认为您遇到的问题是您必须在请求 headers 中将 MIME 类型作为 Content-Type 传递。

我正在使用 MiniMagick 来确定我上传到 LinkedIn 的图像的 MIME 类型。 MiniMagick还可以给你LinkedIn需要的图片的二进制字符串,所以是win-win的情况。

这是最终起作用的调用:

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

下面的方法会将图片上传到linkedIn

参考:https://docs.microsoft.com/en-us/linkedin/marketing/integrations/community-management/shares/vector-asset-api#upload-the-image

private void uploadMedia(String uploadUrl,String accessToken) throws IOException {           
           RestTemplate restTemplate = new RestTemplate();
           HttpHeaders headers = new HttpHeaders();
           headers.add("Authorization","Bearer "+accessToken);
           byte[] fileContents = Files.readAllBytes(new 
           File("path_to_local_file").toPath());
           HttpEntity<byte[]> entity = new HttpEntity<>(fileContents, headers);
           restTemplate.exchange(uploadUrl,HttpMethod.PUT, entity, String.class);
      }