使用身份验证令牌RestTemplate POST图像文件请求

时间:2016-07-17 04:39:03

标签: spring spring-mvc spring-rest

使用以下代码

private def uploadImageFile(assetId: String, apiKey: String, authToken: String, file: MultipartFile, hostUrl: String, restTemplate: RestTemplate): ResponseEntity[util.Map[String, String]] = {

  val assignFileToAssetUrl = s"$hostUrl/..."

  var multipartRequest: MultiValueMap[String, Object] = new LinkedMultiValueMap[String, Object]()
  multipartRequest.add("file", file.getBytes)
  multipartRequest.add("name", "file")
  multipartRequest.add("filename", file.getOriginalFilename)
  multipartRequest.add("apiKey", apiKey)
  multipartRequest.add("authToken", authToken)
  println("Created multipart request: " + multipartRequest)

  var  headers: HttpHeaders= new HttpHeaders()
  headers.setContentType(MediaType.MULTIPART_FORM_DATA)

  val request: HttpEntity[Object]  = new HttpEntity[Object](multipartRequest, headers);
  println("request: " + request)

  var messageConverters: util.List[HttpMessageConverter[_]] = new util.ArrayList[HttpMessageConverter[_]]();
  messageConverters.add(new FormHttpMessageConverter());
  messageConverters.add(new MappingJackson2HttpMessageConverter());
  restTemplate.setMessageConverters(messageConverters);

  val httpResponse: ResponseEntity[util.Map[String, String]] = restTemplate.postForEntity(assignFileToAssetUrl, multipartRequest, classOf[java.util.Map[String, String]])
  if (!httpResponse.getStatusCode().equals(HttpStatus.OK)){
    println("Problems with the request. Http status: " + httpResponse.getStatusCode());
  }
  httpResponse
}

日志文件显示

2016-07-16 20:47:01.744 DEBUG 4423 --- [nio-8080-exec-1] o.s.web.client.RestTemplate              : Writing [{file=[[B@6abe44a9], name=[file], filename=[TB1YvKKKVXXXXXQXpXXXXXXXXXX-492-660.jpg], apiKey=[...], authToken=[...]}] using [org.springframework.http.converter.FormHttpMessageConverter@230f7e0d]

表示使用了FormHttpMessageConverter,它产生400错误。如果我切换添加到列表中的两个消息转换器的顺序。日志消息将显示使用MappingJackson2HttpMessageConverter并产生500错误。

将图像文件与其他一些数据一起发布的正确方法是什么?

上面的代码在Scala中。我将Java代码移植到Scala中。它对Java人来说应该是稳定的。

更新: 我没有运气就根据答案做出改变。我仍然得到400错误。注意我替换了" authToken"密钥与"授权"。以下是更改后的代码:

 private def assignFileToAsset(assetId: String, apiKey: String, authToken: String, file: MultipartFile, hostUrl: String, restTemplate: RestTemplate): ResponseEntity[util.Map[String, String]] = {

   val assignFileToAssetUrl = s"$hostUrl/..."

   var multipartRequest: MultiValueMap[String, Object] = new LinkedMultiValueMap[String, Object]()
   multipartRequest.add("file", file.getBytes)
   multipartRequest.add("name", "file")
   multipartRequest.add("filename", file.getOriginalFilename)
   println("Created multipart request: " + multipartRequest)

   var  headers: HttpHeaders= new HttpHeaders()
   headers.add("apiKey", apiKey)
   headers.add("Authorization", authToken)
   headers.setContentType(MediaType.MULTIPART_FORM_DATA)

   val request: HttpEntity[Object]  = new HttpEntity[Object](multipartRequest, headers);
   println("request: " + request)
   println("Posting request to: " + assignFileToAssetUrl)

   val httpResponse: ResponseEntity[util.Map[String, String]] = restTemplate.postForEntity(assignFileToAssetUrl, multipartRequest, classOf[java.util.Map[String, String]])
   if (!httpResponse.getStatusCode().equals(HttpStatus.OK)){
     println("Problems with the request. Http status: " + httpResponse.getStatusCode());
   }
   httpResponse
 }

1 个答案:

答案 0 :(得分:0)

我认为您可能需要使用http标头发送访问令牌,其他参数和文件内容应该沿着http主体发送。预期的代码(没有精确的语法)

@RequestMapping(value = "/yourMapping", method = RequestMethod.POST)
public @ResponseBody String yourMethod(HttpServletRequest request) {

      RestTemplate template = new RestTemplate();
      HttpHeaders headers = new HttpHeaders();
      headers.setContentType(MediaType.MULTIPART_FORM_DATA);
      headers.add("Authorization", authToken);

      LinkedMultiValueMap<String, Object> map =  

                  new LinkedMultiValueMap<>();
      map.add("your_param_key", "your_param_value");
      map.add("files", your_file_content_in_byte_array);

      HttpEntity<LinkedMultiValueMap<String, Object>> 

              requestEntity = new HttpEntity<>(map, headers);

      String response = restTemplate.postForObject

 (uploadFilesUrl, requestEntity, String.class);

}

请参阅以下帖子了解更多信息。

http://techie-mixture.blogspot.com/2016/07/authentcation-with-rest-template.html

http://techie-mixture.blogspot.com/2016/07/sending-multipart-files-using-spring.html