首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Spring (用于Android)和Jackson2: as application/x form-urlencoded

Spring (用于Android)和Jackson2: as application/x form-urlencoded
EN

Stack Overflow用户
提问于 2014-02-01 18:07:56
回答 3查看 2K关注 0票数 2

我对Android上的HTTP操作有些陌生,我正在使用一台服务器使用PUT命令来处理更新。我很难在Jackson2中使用Spring (用于Android)。服务器似乎不适用于application/json put请求(尽管它将与它们一起响应),而只适用于application/x-www-form-urlencoded版本(用python测试)。在python上,如果我将头类型设置为application/json,它将失败。

我正在使用最新版本的Spring和Jackson2,并且我知道一切都是正确的,因为我对同一个URL的get请求获得了所有正确的信息。

我正在使用Robospice,但我并不认为这是相关的。这是我的请求代码。

代码语言:javascript
复制
@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();
}

我得到了一个异常,说明它无法找到转换的方法:

代码语言:javascript
复制
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对象做同样多的工作。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-02-10 17:37:13

如果您可以将想要发送的数据格式化为MultiValueMap<String, String>,那么一种可能的方法就是使用FormHttpMessageConverter

FormHttpMessageConverter:(您可以在链接中看到示例)

可以从HTTP请求和响应读取和写入表单数据的HttpMessageConverter实现。默认情况下,此转换器读取和写入媒体类型应用程序/x form-urlencoded。表单数据是从MultiValueMap<String,String>中读取并写入的。

票数 1
EN

Stack Overflow用户

发布于 2014-02-03 18:43:41

在重新阅读之后,下面是一个真正的答案--通过使用这个x-www-form-urlencoded,您可以显式地使用RequestHeader内容类型

代码语言:javascript
复制
HttpHeaders requestHeaders = new HttpHeaders(); 
requestHeaders.setContentType(MediaType.APPLICATION_FORM_URLENCODED);

你应该使用APPLICATION_JSON - 这是Javadoc

您还应该考虑在头中指定字符集和数据类型。Jaxson对此非常具体,如果您没有访问服务器代码的权限,您就不知道他们期望的标头是什么。

票数 0
EN

Stack Overflow用户

发布于 2014-02-10 14:31:26

伙计,我正在使用Loopj的AsyncHttpClient作为rest和json数据集。下面是这里下面的链接

很简单很容易理解。你可以试试这个东西。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21501630

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档