web-dev-qa-db-ja.com

改造2を使用してPOSTリクエストを行う方法は?

ドキュメントからhello worldの例(GithubService)を実行することしかできませんでした。

問題は、コードを実行すると、onFailure()内に次のエラーが表示されることです

JsonReader.setLenient(true)を使用して、1行1列1パスで不正な形式のJSONを受け入れます$

私のAPIはPOST params値を取るので、JSONとしてエンコードする必要はありませんが、JSONで応答を返します。

応答には、ツールを使用して生成したApiResponseクラスを取得しました。

私のインターフェース:

public interface ApiService {
    @POST("/")
    Call<ApiResponse> request(@Body HashMap<String, String> parameters);
}

サービスの使用方法は次のとおりです。

HashMap<String, String> parameters = new HashMap<>();
parameters.put("api_key", "xxxxxxxxx");
parameters.put("app_id", "xxxxxxxxxxx");

Call<ApiResponse> call = client.request(parameters);
call.enqueue(new Callback<ApiResponse>() {
    @Override
    public void onResponse(Response<ApiResponse> response) {
        Log.d(LOG_TAG, "message = " + response.message());
        if(response.isSuccess()){
            Log.d(LOG_TAG, "-----isSuccess----");
        }else{
            Log.d(LOG_TAG, "-----isFalse-----");
        }

    }
    @Override
    public void onFailure(Throwable t) {
        Log.d(LOG_TAG, "----onFailure------");
        Log.e(LOG_TAG, t.getMessage());
        Log.d(LOG_TAG, "----onFailure------");
    }
});
12
Cool Do

JSONエンコードされたパラメーターが必要ない場合は、次のようにします。

@FormUrlEncoded
@POST("/")
Call<ApiResponse> request(@Field("api_key") String apiKey, @Field("app_id") String appId);
13
Vishal Raj

ポストパラメータをエンコードする方法を知っておく必要があります。以下の_@Header_アノテーションも重要です。これは、HTTPヘッダーで使用されるコンテンツタイプを定義するために使用されます。

_@Headers("Content-type: application/json")
@POST("user/savetext")
    public Call<Id> changeShortText(@Body MyObjectToSend text);
_

なんらかの方法で投稿パラメータをエンコードする必要があります。送信にJSONを使用するには、レトロフィット宣言に.addConverterFactory(GsonConverterFactory.create(gson))を追加する必要があります。

_Retrofit restAdapter = new Retrofit.Builder()
                .baseUrl(RestConstants.BASE_URL)
                .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
                .addConverterFactory(GsonConverterFactory.create(gson))
                .client(httpClient)
                .build();
_

問題の別の原因として、残りのバックエンドからのJSONが正しくないように見えることが考えられます。 json構文をバリデーターで確認する必要があります。 http://jsonlint.com/

4