【问题标题】:Spring RestTemplate PostforObject: Unsupported Media TypeSpring RestTemplate PostforObject:不支持的媒体类型
【发布时间】:2012-09-04 06:09:15
【问题描述】:

我正在尝试执行 RESTful Web 服务,但是,当我发送请求时,发生 HttpClientErrorException,并显示“415 Unsupported Media Type”作为消息。

这是服务调用的代码:

MultiValueMap<String, String> request = new LinkedMultiValueMap<String, String>();
request.add(val1, "xxxxx");
request.add(val2, "************");
request.add(val3, "xxx");
request.add("type", "AUTHENTICATE");

String response = restTemplate.postForObject(url, request, String.class);
System.out.println(response.toString());

restTemplate 是从 applicationContext.xml 连接的,使用 FormHttpMessageConverter 作为它的 messageConverter。

<bean id="restTemplate" class="org.springframework.web.client.RestTemplate">
<constructor-arg name="requestFactory" ref="httpClientFactory"/>
<property name="messageConverters">
    <list>
        <bean class="org.springframework.http.converter.FormHttpMessageConverter"/>
</list>
</property>
</bean>

<bean id="httpClientFactory" class="org.springframework.http.client.CommonsClientHttpRequestFactory">
    <constructor-arg ref="httpClient"/>
</bean>
<bean id="httpClientParams" class="org.apache.commons.httpclient.params.HttpClientParams">
    <property name="authenticationPreemptive" value="true"/>
    <property name="connectionManagerClass"
                  value="org.apache.commons.httpclient.MultiThreadedHttpConnectionManager"/>
</bean>
<bean id="httpClient" class="org.apache.commons.httpclient.HttpClient">
    <constructor-arg ref="httpClientParams"/>
</bean>

这是发生的异常:

Exception in thread "main" org.springframework.web.client.HttpClientErrorException: 415 Unsupported Media Type
    at org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:76)
    at org.springframework.web.client.RestTemplate.handleResponseError(RestTemplate.java:486)
    at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:443)
    at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:401)
    at org.springframework.web.client.RestTemplate.postForObject(RestTemplate.java:279)
    at ph.com.smart.drawbridge.commons.diameter.DiameterClient.post(DiameterClient.java:21)

有什么想法吗?

【问题讨论】:

    标签: spring http rest


    【解决方案1】:

    当您的客户端发送服务器不知道如何处理的媒体类型的请求时,会发生此问题。例如,处理url 的服务器方法可以处理application/json 类型的请求,但您发送了text/xml。服务器无法处理此类请求。为了解决这个问题,找出服务器期望的content-type(媒体类型),在设置content-type:application/jsonrestTemplate对象中设置一个标头(将application/json替换为服务器期望的任何内容)。此外,请确保以正确的格式发送请求(如果我们谈论的是json,您需要拥有可以将您的对象序列化为json 对象的jackson 依赖项)。

    【讨论】:

      【解决方案2】:

      您现在可能不需要这个,但我将把它分享给将来遇到此类问题的任何人。

      正如@Avi 指出的那样,当您的服务器期望与您在请求中发送的内容不同的媒体类型时,确实会发生此问题。

      在我的情况下,我使用 MediaType.APPLICATION_JSON 发送表单数据,而我的服务器需要 Mutipart 表单数据。在我的请求中添加以下标头解决了我的问题:

      HttpHeaders headers = getBasicAuthHttpHeaders();
      headers.setContentType(MediaType.MULTIPART_FORM_DATA);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-09-22
        • 1970-01-01
        • 2020-11-03
        • 2013-01-13
        • 2013-08-08
        • 2014-02-13
        • 1970-01-01
        相关资源
        最近更新 更多