【问题标题】:Robospice: Sending JSON data inside HTTP request bodyRobospice:在 HTTP 请求正文中发送 JSON 数据
【发布时间】:2013-10-07 04:44:02
【问题描述】:

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

内容类型: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();
}

JsonSpiceService 类中的createRestTemplate()(扩展 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,我很确定它与正文的格式有关。有没有办法获得 raw HTTP 请求(不是 toString() 某些方法的版本只是一个原始请求)?我还能做错什么 - 可能是关于身体的编码吗?

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

【问题讨论】:

    标签: java android json spring robospice


    【解决方案1】:

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2017-05-15
      • 1970-01-01
      • 2019-08-15
      • 1970-01-01
      • 1970-01-01
      • 2017-05-04
      • 1970-01-01
      • 2020-10-04
      • 2018-05-14
      相关资源
      最近更新 更多