我对Android上的HTTP操作有些陌生,我正在使用一台服务器使用PUT命令来处理更新。我很难在Jackson2中使用Spring (用于Android)。服务器似乎不适用于application/json put请求(尽管它将与它们一起响应),而只适用于application/x-www-form-urlencoded版本(用python测试)。在python上,如果我将头类型设置为application/json,它将失败。
我正在使用最新版本的Spring和Jackson2,并且我知道一切都是正确的,因为我对同一个URL的get请求获得了所有正确的信息。
我正在使用Robospice,但我并不认为这是相关的。这是我的请求代码。
@Override
public GPIO loadDataFromNetwork() throws Exception {
String url = String.format("http://%s/api/control/gpio", ip);
RestTemplate rt = getRestTemplate();
DefaultHttpClient client = new DefaultHttpClient();
Credentials defaultcreds = new UsernamePasswordCredentials("admin",
password);
client.getCredentialsProvider().setCredentials(
new AuthScope(routerip, 80, AuthScope.ANY_REALM), defaultcreds);
// Makes authentication work.
rt.setRequestFactory(new HttpComponentsClientHttpRequestFactory(client));
HttpHeaders requestHeaders = new HttpHeaders();
requestHeaders.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
HttpEntity request = new HttpEntity(data, requestHeaders);
List<HttpMessageConverter<?>> messageConverters = new ArrayList<HttpMessageConverter<?>>();
MappingJackson2HttpMessageConverter map = new MappingJackson2HttpMessageConverter();
messageConverters.add(map);
messageConverters.add(new FormHttpMessageConverter());
rt.setMessageConverters(messageConverters);
ResponseEntity<GPIO> r = rt.exchange(url, HttpMethod.PUT, request, GPIO.class);
return r.getBody();
}我得到了一个异常,说明它无法找到转换的方法:
02-01 10:59:29.466: E//DefaultRequestRunner.java:138(30086):
10:59:29.474 Thread-11651 An exception occurred during request network
execution :Could not write request: no suitable HttpMessageConverter
found for request type [com.xxxxx.control.gpio.GPIO] and content
type [application/x-www-form-urlencoded]GPIO是我的POJO对象。我想把它“放”到服务器上,就像序列化和放置它一样。
我看过以下似乎相当相关的问题:
但是,我需要put命令的结果,这要求我使用exchange(),因为Spring的put()什么也不返回。
我尝试了几个不同的项目(例如删除GPIO引用,设置特定的标题.)而且似乎都没有用。我有一种感觉,这可能是一个简单的解决方案,我不知道如何解决。如果有人能帮我那就太好了。
TLDR:我用SpringforAndroidandJackson2。我希望序列化我的对象(在本例中是GPIO),这样我就可以使用内容类型application/x form-urlencoded执行PUT请求。但是,我不能让jackson转换成那种类型,只转换为application/json,这对我来说不管用。我不知道如何解决这个问题,我的想法已经用完了。如果我找不到解决办法的话,我可能得找只笨知更鸟了。(或者杰克逊,还不确定是哪一个。)
溶液
Spring似乎并没有简化事情,所以我将其转储,直接在loadDataFromNetwork()方法中使用apache。罗布斯皮斯处理得很好,我可以得到我需要的回应。如果您对HTTP很陌生,就像我花时间学习apache客户端一样,在我看来,这要容易得多。调整ObjectMapper (比如创建一个JsonTree和解析)可以更容易地获得我所需要的数据,而不必对POJO对象做同样多的工作。
发布于 2014-02-10 17:37:13
如果您可以将想要发送的数据格式化为MultiValueMap<String, String>,那么一种可能的方法就是使用FormHttpMessageConverter。
FormHttpMessageConverter:(您可以在链接中看到示例)
可以从HTTP请求和响应读取和写入表单数据的HttpMessageConverter实现。默认情况下,此转换器读取和写入媒体类型应用程序/x form-urlencoded。表单数据是从
MultiValueMap<String,String>中读取并写入的。
发布于 2014-02-03 18:43:41
在重新阅读之后,下面是一个真正的答案--通过使用这个x-www-form-urlencoded,您可以显式地使用RequestHeader内容类型
HttpHeaders requestHeaders = new HttpHeaders();
requestHeaders.setContentType(MediaType.APPLICATION_FORM_URLENCODED);你应该使用APPLICATION_JSON - 这是Javadoc。
您还应该考虑在头中指定字符集和数据类型。Jaxson对此非常具体,如果您没有访问服务器代码的权限,您就不知道他们期望的标头是什么。
发布于 2014-02-10 14:31:26
伙计,我正在使用Loopj的AsyncHttpClient作为rest和json数据集。下面是这里下面的链接
很简单很容易理解。你可以试试这个东西。
https://stackoverflow.com/questions/21501630
复制相似问题