Robospice:在HTTP请求体内发送JSON数据

时间:2013-10-01 06:09:01

标签: java android json spring robospice

我需要使用Robospice for Android发送 POST HTTP请求,其中包含以下格式的数据:

  

Content-Type:application / json

     

{ 'VAR1': 'var1val', 'telNumber': 'var2val'}

里面可能还有其他的HTTP标头,但这是服务器所需的唯一标头 - 我用一个简单的HelloWorld请求测试了它,它不需要正文中的任何特定对象。

问题是我无法以正确的格式发送请求正文。我按照Robospice tutorial做了一切。

loadDataFromNetwork() method

public T loadDataFromNetwork() throws Exception { // I'm making generic requests, T is a class representing given request
    Uri.Builder uriBuilder = Uri.parse(mUrl).buildUpon(); // mURL is just a full URL, including the method (just HTTP, not HTTPS)
    MultiValueMap<String, String> body = new LinkedMultiValueMap<String, String>();
    for (NameValuePair nvp : mPostParams) { // From the constructor: mPostParams = new ArrayList<NameValuePair>();
        body.add(nvp.getName(), nvp.getValue());
    }

    HttpEntity<?> requestEntity = new HttpEntity<Object>(body, mHttpHeaders);
    RestTemplate restTemplate = new RestTemplate();

    ResponseEntity<T> responseEntity = getRestTemplate().exchange(
            uriBuilder.build().toString(), HttpMethod.POST, requestEntity,
            mClazz);
    return responseEntity.getBody();
}
createRestTemplate()类中的

JsonSpiceService(扩展了SpringAndroidSpiceService)

public RestTemplate createRestTemplate() {
    RestTemplate restTemplate = new RestTemplate(true);

    MappingJacksonHttpMessageConverter jsonConverter = new MappingJacksonHttpMessageConverter();
    FormHttpMessageConverter formHttpMessageConverter = new
    FormHttpMessageConverter();
    StringHttpMessageConverter stringHttpMessageConverter = new StringHttpMessageConverter();
    final List<HttpMessageConverter<?>> listHttpMessageConverters = restTemplate
            .getMessageConverters();

    setTimeout(restTemplate);

    listHttpMessageConverters.add(jsonConverter);
    listHttpMessageConverters.add(formHttpMessageConverter);
    listHttpMessageConverters.add(stringHttpMessageConverter);
    restTemplate.setMessageConverters(listHttpMessageConverters);
    return restTemplate;
}

这样做,我不断得到500 Internal Server Error,我很确定它与身体的格式有关。有没有办法获得原始 HTTP请求(不是某些方法的toString()版本只是一个原始请求)?还有什么我可以做错的 - 它可以是关于身体的编码吗?

请注意,我正在使用Chrome应用发送REST请求和curl(工作正常)测试相同的请求。

1 个答案:

答案 0 :(得分:0)

您对SpringAndroid的使用感到困惑。查看HttpEntity的文档,您将看到使用MultiValueMap作为Body。在这种情况下,你是对的,调用body.toString。

MultiValueMap以您认为仅用于标题的方式使用。对于正文,HttpEntity基本上需要一个Pojo,因此将MultiValueMap视为Pojo。

一个简单的解决方法是手动创建要作为正文发布的字符串:

String body = "key=value&key=value&key=value"

这个参数可以用作HttpEntity构造函数的第一个参数。