2013-10-01 1 views
3

мне нужно отправить запрос HTTP на POST с помощью Robospice для Android, которые будут иметь данные в следующем формате:Robospice: Отправка данных в формате JSON в HTTP теле запроса

Content-Type: применение/JSON

{ «var1»: «var1val», «telNumber»: «var2val»}

Там могут быть и другие HTTP-заголовки внутри, но это только заголовок требует сервер - я тестировал с простой HelloWorld req uest, который не требует каких-либо конкретных объектов в теле.

Проблема в том, что Я не могу отправить тело запроса в правильном формате. Я делаю все согласно 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 raw HTTP (а не версию toString() некоторых методов только необработанный запрос)? Что еще я могу делать неправильно - может быть, это о кодировании тела?

Обратите внимание, что я тестировал тот же запрос с обоими приложениями Chrome для отправки запросов REST и curl (работал отлично).

ответ

0

Вы теряете смысл в использовании SpringAndroid. Посмотрите на документы HttpEntity, вы увидите, что вы используете MultiValueMap как Тело. В этом случае вы правы, вызывается body.toString.

MultiValueMap используется так, как вы думаете, это только для заголовков. Для тела HttpEntity ожидает Pojo в основном, и, таким образом, вы считаете MultiValueMap как Pojo.

Простое решение было бы создать вручную строку, которую вы хотите опубликовать как тело:

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

Этот аргумент может быть использован в качестве первого параметра конструктора HttpEntity.