【问题标题】:Always get null response in ResponseEntity when using RestTemplate.postForEntity使用 RestTemplate.postForEntity 时总是在 ResponseEntity 中得到空响应
【发布时间】:2012-12-18 15:52:17
【问题描述】:

我正在尝试使用 Jackson 库从我的 Android 应用程序向 Web 服务器发送 JSON 请求,但响应始终为空。我仅使用 HttpRequest API 对其进行了测试,一切正常 - 我得到了回应。但是现在我尝试使用 Spring RestTemplate 并且我无法收到结果。这是我的代码:

protected Void doInBackground(String... params) {
    LinkedHashMap<String, Object> _map = new LinkedHashMap<String, Object>();
    _map.put("login", "Fred");
    _map.put("password", "pass");
    ObjectMapper _mapper = new ObjectMapper ();
    StringWriter _writer = new StringWriter();
    try {
        _mapper.writeValue(_writer,_map);
    } catch (JsonGenerationException e) {
        e.printStackTrace();
    } catch (JsonMappingException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }

    String _baseURL = "https...."//Address of the server;
    HttpHeaders requestHeaders = new HttpHeaders();
    requestHeaders.setContentType(MediaType.APPLICATION_JSON); 
     HttpEntity<String> _entity = new HttpEntity<String>(_writer.toString(),requestHeaders);
    RestTemplate templ = new RestTemplate();

    templ.setRequestFactory(new HttpComponentsClientHttpRequestFactory());
    templ.getMessageConverters().add(new StringHttpMessageConverter());
    ResponseEntity<String> _response = templ.postForEntity(_baseURL, _entity,String.class);
    String _Test =  _response.getBody();

所以我在 _Test 中总是有 null。 我怀疑这是因为 https 协议。 RestTemplate 可以与 https 一起使用吗?

那么该代码有什么问题。如何解决这个问题?

提前致谢。我真的需要帮助!

【问题讨论】:

  • 响应状态码是什么? (即 _response.getStatusCode() )
  • @ben75 响应码是200。一切OK。这里有问题。 JSON结构也是正确的。可能都是因为 postForEntity 中的空响应?
  • 你可以试试 templ.getMessageConverters().add(new StringHttpMessageConverter()); ?
  • @ben75 是的,我试过了。我仍然得到空响应。状态仍然是 200。我还使用 StringHttpMessageConverter() 将 postForEntity(_baseURL, _entity, null) 更改为 postForEntity(_baseURL, _entity, String.class) ,但我仍然得到空值。可能是服务器使用https协议的原因吗? RestTemplate 可以与 https 一起使用吗?

标签: java android spring resttemplate


【解决方案1】:

您必须设置 responseType,否则 RestTemplate 将丢弃您的响应正文。它需要 responseType 来找到正确的消息转换器。使用 null responseType,下面的委托将为 null...

        if (delegate != null) {
            T body = delegate.extractData(response);
            return new ResponseEntity<T>(body, response.getHeaders(), response.getStatusCode());
        }
        else {
            return new ResponseEntity<T>(response.getHeaders(), response.getStatusCode());
        }

使用 RestTemplate 默认构造函数,Spring 几乎包含除了 RSS、XML 和 JSON 之外的所有转换器,这取决于 Rome、JAXB 或 Jackson 是否在类路径中。我会将 responseType 设置为 String 并使用调试器运行它,看看为什么它没有找到正确的转换器。如果没有看到来自服务器的响应和标头,我很难说出原因。

【讨论】:

  • 我已经编辑了我的问题。我将响应类型设置为 String.class 并添加 StringHttpMessageConverter() 而不是 Jackson。但响应仍然为空。
  • 您不需要添加任何一个转换器,Spring 会为您包含它们(假设 Jackson 在您的类路径中)。如果没有看到服务器返回的内容,我将无法再为您提供帮助。您确定服务器甚至返回任何内容而不仅仅是状态代码吗?您使用的是哪个版本的 Spring?
  • 好的。谢谢你。我检查了 _response.getHeaders()。一切正常。我看到服务器类型、PHP 版本等。但是 _response.getBody() 返回 null 或 []。可能是因为 android 中的 RestTemplate 不支持 https?
  • hyness,虽然标准 Spring 框架确实如此,但 Android 版本的 RestTemplate 不会自动包含所有消息转换器。您可以在构造函数中传递true 来实现相同的结果。请参阅参考文档:static.springsource.org/spring-android/docs/1.0.x/reference/…
【解决方案2】:

错字还是连接到 https 端口?

String _baseURL = "https...."//服务器地址;

我认为您应该监视您尝试连接的端口,看看是否建立了连接。我这样做的一种简单方法是让笔记本电脑成为一个 ad-hoc 网络并让一个 Android 设备连接到它,然后,您应该能够使用像 wireshark 这样的数据包嗅探器监控来自您的 Android 设备的所有流量。

【讨论】:

  • 是的,我正在连接到 https.https://noticemed.com/app
  • 我正在使用 org.springframework.http 类 HttpHeaders。不是标准的api。我在我的问题中写了这个
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-15
  • 1970-01-01
  • 2020-03-04
  • 1970-01-01
  • 1970-01-01
  • 2020-07-22
相关资源
最近更新 更多