2017-10-19 71 views
0

有一个只接受内容类型multipart/mixed的REST API。Spring引导RestTemplate - 多部分/混合

尝试使用restTemplate并生成内容类型为multipart/mixed的REST请求。 如果我评论setContentType restTemplate默认为multipart/form-data。

setContentType(MediaType.parseMediaType("multipart/mixed")) 

但没有运气,任何示例如何调用API生成多部分/混合请求?

也许这有助于

HttpHeaders publishHeaders = new HttpHeaders(); 
publishHeaders.set(HEADER_TABLEAU_AUTH, token); 
publishHeaders.setContentType(MediaType.parseMediaType("multipart/mixed")); 
String response; 
LinkedMultiValueMap<String, Object> map = new LinkedMultiValueMap<>(); 
String payload = "<tsRequest>\n" + 
     ............................ 
     "</tsRequest>"; 
map.add(TABLEAU_PAYLOAD_NAME, payload); 
map.add("tableau_datasource", new FileSystemResource("/extract/test.tde")); 
HttpEntity<LinkedMultiValueMap<String, Object>> entity = new HttpEntity<>(map, publishHeaders); 
try { 
response = restTemplate.postForObject(url + PUBLISH_DATASOURCE_SINGLE_CHUNK, entity, String.class, siteId); 
} catch (RestClientException restEx) { 
    log.error(....); 
    throw restEx; 
} 
+0

你可以分享控制器的方法,或者它的一个例子吗? – Pytry

+0

在此处添加了示例代码 – fastlearner

+0

您是否期待任何回应作为响应主体?或者只是一个HTTP 200? – Pytry

回答

0

所以,很遗憾,实在是没有办法与“春天的web-4.3.12.RELEASE.jar”目前执行泉RestTemplate的为您解决问题。它假设所有情况下唯一类型的多部分数据是“multipart/form-data:”,因此它不会重新标注请求的多部分性质。 -272

@Override 
@SuppressWarnings("unchecked") 
public void write(MultiValueMap<String, ?> map, MediaType contentType, HttpOutputMessage outputMessage) 
     throws IOException, HttpMessageNotWritableException { 

    if (!isMultipart(map, contentType)) { 
     writeForm((MultiValueMap<String, String>) map, contentType, outputMessage); 
    } 
    else { 
     writeMultipart((MultiValueMap<String, Object>) map, outputMessage); 
    } 
} 


private boolean isMultipart(MultiValueMap<String, ?> map, MediaType contentType) { 
    if (contentType != null) { 
     return MediaType.MULTIPART_FORM_DATA.includes(contentType); 
    } 
    for (String name : map.keySet()) { 
     for (Object value : map.get(name)) { 
      if (value != null && !(value instanceof String)) { 
       return true; 
      } 
     } 
    } 
    return false; 
} 

如果你看一下私有方法“isMultipart”的第一部分,你会看到:

if (contentType != null) { 
     return MediaType.MULTIPART_FORM_DATA.includes(contentType); 
    } 

它检查,看看是否已经声明“的multipart/form-data的“,但你的是”多部分/混合“,所以它失败了。

还有其他各种可能导致失败的问题,但这是问题的根源。

如果你想继续使用RestTemplate,唯一的解决方案是实现自己的消息转换器,它可以识别所需的媒体类型,并将其添加到模板消息转换器中。

你也可以通过扩展它,复制粘贴和修改,或者从头开始创建一个客户端,使用像apaches HttpClient(甚至是CORE Java我想的那样)更基本的东西来编写自己的RestTemplate版本。

+0

感谢您的解释和输入,最终编写了自己的RestTemplate的HttpClient变体。 – fastlearner

+0

接受此作为答案,因为没有重写它就没有办法解决。 – fastlearner

+0

很高兴我能帮忙:) – Pytry

相关问题