2

我正在尝试使用 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 一起使用吗?

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

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

4

2 回答 2

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 并使用调试器运行它,看看为什么它没有找到正确的转换器。如果没有看到来自服务器的响应和标头,我很难说出原因。

于 2012-12-18T17:08:10.333 回答
0

错字还是您连接到 https 端口?

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

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

于 2012-12-18T16:22:31.307 回答