4


我想向服务器发送 POST 请求。我必须将 JSON 对象作为参数传递,并获取 JSON 作为响应,但出现此错误:

org.springframework.web.client.RestClientException: Could not extract response: no suitable HttpMessageConverter found for response type [com.package.Response] and content type [application/octet-stream]

代码

发送请求:

    @RestService
    RestClient restClient;
...
    String json = "{\"param\":3}"; 
    restClient.getRestTemplate().getMessageConverters().add(new GsonHttpMessageConverter());
    Response res = restClient.send(json);

休息客户端

@Rest("http://my-url.com")

    public interface RestClient
    {
        @Post("/something/")
        Response send(String json);

        RestTemplate getRestTemplate();

        void setRestTemplate(RestTemplate restTemplate);
    }

我正在使用这些 JAR 文件:

  • spring-android-rest-template-1.0.0.RC1
  • spring-android-core-1.0.0.RC1
  • spring-android-auth-1.0.0.RC1
  • gson-2.2.2

我做错了什么?
当我将send参数更改为时,JSONObject我得到了同样的错误。
顺便提一句。AA 文档真的很神秘——我可以使用 Gson 吗?
或者我应该使用杰克逊?
那我需要包含哪个文件?

谢谢你的帮助!

4

3 回答 3

4

您可以将 RestTemplate 与 Gson 或 Jackson 一起使用。

Gson 很好,更容易使用你有小的 json 数据集。如果你有一个复杂/深的 json 树,Jackson 更合适,因为 Gson 创建了很多导致停止世界 GC 的临时对象。

这里的错误说它找不到HttpMessageConverter能够解析的application/octet-stream.

如果您查看GsonHttpMessageConverter的源代码,您会注意到它仅支持 mimetype application/json

这意味着您有两个选择:

  • 从您的内容中返回application/jsonmimetype,这将非常合适
  • 或者只是更改支持的媒体类型GsonHttpMessageConverter
String json = "{\"param\":3}"; 
GsonHttpMessageConverter converter = new GsonHttpMessageConverter();
converter.setSupportedMediaTypes(new MediaType("application", "octet-stream", Charset.forName("UTF-8")));
restClient.getRestTemplate().getMessageConverters().add(converter);
Response res = restClient.send(json);
于 2012-09-14T14:53:24.283 回答
0

我刚遇到这个问题。几个小时后,我意识到我传递给 RestTemplate.postForObject 调用的类有 Date 变量。您需要确保它只包含简单的数据类型。希望这对其他人有帮助!

于 2014-03-11T11:10:30.713 回答
0

我必须对其进行少量修改才能工作:

final List<MediaType> list = new ArrayList<>();
list.addAll(converter.getSupportedMediaTypes());
list.add(MediaType.APPLICATION_OCTET_STREAM);
converter.setSupportedMediaTypes(list);
于 2016-03-01T12:42:20.823 回答