java - Robospice:在 HTTP 请求正文中发送 JSON 数据

标签 java android json spring robospice

我需要使用适用于 Android 的 Robospice 发送一个 POST HTTP 请求,该请求将包含以下格式的数据:

Content-Type: application/json

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

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

问题是我无法以正确的格式发送请求正文。我正在根据 Robospice tutorial 做所有事情.

loadDataFromNetwork() 方法

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() 版本只是原始请求)?我还能做错什么 - 是否与 body 编码有关?

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

最佳答案

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

MultiValueMap 以您认为仅用于 header 的方式使用。对于主体,HttpEntity 基本上期望一个 Pojo,因此将您的 MultiValueMap 视为一个 Pojo。

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

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

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

关于java - Robospice:在 HTTP 请求正文中发送 JSON 数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19109144/

相关文章:

java - 如何使用 BoxLayout 让组件与 JPanel 中的顶部对齐?

java - 不支持的SignatureMethodException : HMAC-SHA1 exception in tomcat with jerseyoauth

java - Android Studio findViewById(R.id.button1) 错误

linux - 解析json数据时文本编码错误

python - 如何在 JSON 中编码字节? json.dumps() 抛出 TypeError

java - 数据表参数为 Null ,导致 NumberFormatException :Null. 有解决方案吗?

java - 如何知道 Swing 中两个线程何时完成

android - 如何将 TableLayout 列缩小到 minWidth?

android - 如何在静态方法中访问 getSupportFragmentManager()?

.net - 是否有等效于 xsd.exe 的 JSON?