我需要使用适用于 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/