3

Robospice for Android を使用して、次の形式のデータを持つPOST HTTP リクエストを送信する必要があります。

コンテンツ タイプ: アプリケーション/json

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

内部には他の HTTP ヘッダーが含まれている可能性がありますが、これはサーバーが必要とする唯一のヘッダーです。ボディに特定のオブジェクトを必要としない単純な HelloWorld リクエストでテストしました。

問題は、リクエスト本文を正しい形式で送信できないことですRobospice チュートリアルに従ってすべてを行っています。

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()生のリクエストだけのメソッドのバージョンではありません)。他に何が間違っている可能性がありますか?それはボディのエンコーディングに関するものですか?

RESTリクエストを送信するためのChromeアプリと(正常に機能した)両方でまったく同じリクエストをテストしていたことに注意してくださいcurl

4

1 に答える 1

0

SpringAndroid の使用法に混乱しています。HttpEntityのドキュメントを見ると、 MultiValueMap を Body として使用していることがわかります。その場合、そうです、 body.toString が呼び出されます。

MultiValueMap は、ヘッダー専用だと思われる方法で使用されます。本体については、HttpEntity は基本的に Pojo を想定しているため、MultiValueMap を Pojo と見なします。

簡単な回避策は、本文として投稿する文字列を手動で作成することです。

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

この引数は、HttpEntity のコンストラクターの最初のパラメーターとして使用できます。

于 2013-10-11T09:26:33.697 に答える