使用RestTemplate.postForEntity时,始终在ResponseEntity中获得null响应

时间:2012-12-18 15:52:17

标签: java android spring resttemplate

我正在尝试使用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中总是有空。 我怀疑这是因为https协议。 RestTemplate可以与https一起使用吗?

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

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

2 个答案:

答案 0 :(得分: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并使用调试器运行它以查看为什么它找不到正确的转换器。如果没有看到服务器的响应和标题,我很难说出原因。

答案 1 :(得分:0)

错字或您是否正在连接到https端口?

  

String _baseURL =“https ....”//服务器的地址;

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