当前位置: 首页 > 知识库问答 >
问题:

Spring boot RestTemplate-多部分/混合

姜学海
2023-03-14

有一个只接受内容类型multipart/mixed的REST API。

正在尝试使用restTemplate并生成内容类型为multipart/mixed的REST请求。如果注释setContentType restTemplate默认为多部分/表单数据。

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;
}

共有1个答案

龚彬
2023-03-14

因此,不幸的是,对于“spring-web-4.3.12. RELEASE. jar”中的Springs RestTemboard的当前实现,确实没有办法解决您的问题。它假设在所有情况下,唯一类型的多部分数据是“multipart/form-data:,因此它不会重新点燃您请求的多部分性质。

组织。springframework。http。转换器。FormHttpMessageConverter:第247-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);
    }

它检查您是否声明了“多部分/表单数据”,但您的声明是“多部分/混合”,因此它会失败。

还有许多其他方面也可能失败,但这是问题的根源。

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

您还可以编写自己的RestTemplate变体,方法是对其进行扩展、复制粘贴和修改,或者从头创建一个客户端,该客户端使用一些更基本的东西,如apaches HttpClient(我想甚至是核心java)。

 类似资料:
  • 我想写一个REST服务,它用一个zipFile和一些json数据来响应,所有的东西都在一个多部分/混合请求中。 现在我尝试使用多部分/混合响应并返回一个MultiValueMap MyMultiValueMap存在以防止类型擦除(泛型)。 这给出了

  • 我有一个基于泽西的网络服务,它产生一个“多部分/混合”响应如下:该方法读取一个文件,并应以八位字节格式返回。此外,它读取该文件的元数据,并以json形式返回。 方法: 我的问题是,我得到了以下错误,这对我来说没有意义: 据我所知,是os。toByteArray()正在将我的对象转换为字节数组。 任何想法? 编辑:我正在使用Jersey 1.15

  • 我正在开发基于Spring 3.2的RESTful服务。我遇到了一个控制器处理混合多部分HTTP请求的问题,第二部分是XML或JSON格式的数据,第二部分是图像文件。 我正在使用@Request estPart注释来接收请求 User.java会这样- 据我所知,使用@RequestPart注释,我希望根据XML多部分部分的内容类型对其进行评估,并最终将其解编组到我的用户类中(我使用的是Jaxb2

  • 问题内容: 我收到对我需要解析的http请求的响应。响应的一部分是pdf文件,我需要将其保存到磁盘。有图书馆可以帮我吗? 问题答案: 这是我在常规操作中所做的。所需的Java邮件库:

  • 我需要向我的Spring控制器发送一个带有json的文件。我有以下控制器类: 但当我在服务器上使用以下命令时: 我得到415不支持的媒体类型! 有线索吗?

  • 我有一个基于jersey的web服务,它生成一个“多部分/混合”响应,如下所示:该方法读取一个文件,并应以八位字节格式返回它。 我的问题是:如何确保响应为八位字节流类型?我知道我也可以将上述方法注释为: 但是我特别要求在发送八位流格式的文件时将响应内容类型设置为“多部分/混合”。 上面的方法做到了吗?我的假设是有,但我没有具体的理由。 提前谢谢你!