无法通过Spring RestTemplate将图片上传到LinkedIn,收到400错误请求:[无正文]

dly7yett  于 2022-10-23  发布在  Spring
关注(0)|答案(2)|浏览(234)

您好,我正在尝试通过Spring RestTemplate将图片上传到LinkedIn,步骤如下:1.初始化上传和上传url 2.使用上传url将图片链接到服务器
下面是步骤2的方法

public String uploadImageToURL(MultipartFile file, String uploadURL) throws IOException {
    HttpHeaders headers = new HttpHeaders();
    headers = new HttpHeaders();
    headers.setContentType(MediaType.MULTIPART_FORM_DATA);
    headers.add("Authorization", "Bearer Redacted");

    MultiValueMap<String, Object> body = new LinkedMultiValueMap<>();
    body.add("file", file.getBytes());

    HttpEntity<MultiValueMap<String, Object>> reqEntity = new HttpEntity<>(body, headers);
    try {
        ResponseEntity<String> resp = new RestTemplate().exchange(uploadURL, HttpMethod.PUT, reqEntity, String.class);
    } catch (HttpClientErrorException e) {
        e.printStackTrace();
    }
}

方法是给出-

org.springframework.web.client.HttpClientErrorException$BadRequest: 400 Bad Request: [no body]

我也不能从LinkedIn API的文档中找出哪里出了问题。不清楚他们给出了一个基本的cURL请求,它在 Postman 上工作得很好,但在编程上却不起作用
根据文档,上述方法的CURL
任何帮助是感激的,我已经尝试给内容类型的标题为图像/PNG,但没有效果。
PS:我已经引用了这个链接Linkedin v2 API Image upload get error 400 Bad Request,但它没有帮助

kh212irz

kh212irz1#

您可以尝试如下操作:1-生成并打印/获取图片必须上传到的URL(上传过程的第一部分)。2-尝试使用cURL工具上传它,就像在文档中一样。如果2有效,那么您就知道前面的步骤运行良好,问题出在您发布的方法上。否则,你知道你必须寻找其他地方(步骤2之前)。
在cURL工作的情况下,上载链接的服务器可能只是接受请求,而不是使用HTTP(S),而是接受FTP或类似的格式。在这种情况下,您需要找到该协议的解决方案。
关于您当前的实施:

  • 不鼓励使用RestTemplate,因为它很快就不再受支持。
  • 改用WebClient:指向定义请求正文的链接
  • 不要使用MultiValueMap,因为它将文件添加为键-值对,并且从文档上的示例来看,没有您定义的“file”键。

最后一种方法是,如果cURL调用有效,而其他任何调用都不起作用,您可以创建一个简单的Bash/Shell脚本,该脚本仅在流程的第2部分调用。编码快乐!:)

gr8qqesn

gr8qqesn2#

找到了解决方案,实际使用ByteArrayResource和正确的content-type解决了问题,这里是更新的代码

private void uploadImage(MultipartFile file, String token, String uploadURL) throws IOException {
    HttpHeaders headers = new HttpHeaders();
    headers.add("Authorization", "Bearer " + token);
    headers.add("X-Restli-Protocol-Version", "2.0.0");
    headers.add("Content-Type", file.getContentType());

    ByteArrayResource bytes = new ByteArrayResource(file.getBytes()) {
        @Override
        public String getFilename() {
            return file.getName();
        }
    };
    HttpEntity<ByteArrayResource> reqEntity = new HttpEntity<ByteArrayResource>(bytes, headers);
    try {
        ResponseEntity<String> imageUpload = new RestTemplate().exchange(uploadURL, HttpMethod.PUT, reqEntity, String.class);
    } catch (HttpClientErrorException e) {
        e.printStackTrace();
    }
}

我审阅了这篇question以寻求见解。

相关问题