[android] Retrofitを使用してparamsでポストリクエストを送信する


Answers

私は解決策を見つけました。 問題は私のクラス構造の問題でした。 だから私は次のサンプルのようにそれらを更新しました。

public class LandingPageReport {

    private ArrayList<LandingPageReportItem> GetDetailWithMonthWithCodeResult;

    // + Getter Setter methods
}

public class LandingPageReportItem {

    private String code;

    private String field1;

    // + Getter Setter methods
}

そして、私はこの改造構成を使用します

@POST("/GetDetailWithMonthWithCode")
void getLandingPageReport(@Field("code") String code,
                          @Field("monthact") String monthact,
                          Callback<LandingPageReport> cb);
Question

私はRetrofitライブラリを使用してAndroid上でAPIを使用するのに失敗していますが、POSTMANを使用している間は期待される結果が見えます。

POSTMANの設定

  • api url(ベース+コントローラ)

  • POSTに設定されたHTTPメソッド

  • from-dataまたはx-www-form-urlencodedをクリックしました。

  • 次に、キー/値フィールドに2つのパラメータを渡します。

アンドロイド復帰設定

@POST("/GetDetailWithMonthWithCode")
void getLandingPageReport(@Query("code") String code,
                          @Query("monthact") String monthact,
                          Callback<LandingPageReport> cb);

@FormUrlEncoded
@POST("/GetDetailWithMonthWithCode")
void getLandingPageReport(@Field("code") String code,
                          @Field("monthact") String monthact,
                          Callback<LandingPageReport> cb);

このオプションはどれも動作しません。 しかし結果として{}を得ています。

更新

標準のHttpClient (とHttpPost )クラスを使って同じ設定がうまく動作します。

HttpClient client = new DefaultHttpClient();
HttpPost post = new HttpPost(url);

List<NameValuePair> urlParameters = new ArrayList<NameValuePair>();
urlParameters.add(new BasicNameValuePair("code", "testcode"));
urlParameters.add(new BasicNameValuePair("monthact", "feb-2015"));

post.setEntity(new UrlEncodedFormEntity(urlParameters));

HttpResponse response = client.execute(post);

なぜ私はこの要求をしてRetrofitで正しい応答を得ることができないのですか?

更新2

@POST("/GetDetailWithMonthWithCode")
void getLandingPageReport(@Query("code") String code,
                          @Query("monthact") String monthact,
                          Callback<List<LandingPageReport>> cb);

@FormUrlEncoded
@POST("/GetDetailWithMonthWithCode")
void getLandingPageReport(@Field("code") String code,
                          @Field("monthact") String monthact,
                          Callback<List<LandingPageReport>>> cb);

周りを遊んだ後、私は問題の原因を見つけたと思う。 私はList<LandingPageReport>を受け取るように私のレトロフィットコードを更新しました。 しかし今、このエラーが発生します

retrofit.RetrofitError:com.google.gson.JsonSyntaxException:java.lang.IllegalStateException:BEGIN_ARRAYが必要ですが、BEGIN_OBJECTが1行目のカラム2のパス$

理由は、私は2 api(webapiとwcf)を消費することです。 私の他のすべてのjsonレスポンスはオブジェクトの配列です。 [{}、{}]しかし、この呼び出しで私はこれを受け取りました

{
  "GetDetailWithMonthWithCodeResult": [
     {
        "code": "test",
        "field1": "test",
     }
   ]
}

しかし、私はまだ応答を解析することはできません。




私の意見では、もっともセクシーな方法は、 POST Bodyで送信することです。これは、新しいPOJOを作成することを意味しますが、この実装が最も好きな人もいます。

public interface APIInterface {
    @POST("/GetDetailWithMonthWithCode")
    List<LandingPageReport> getLandingPageReport(@Body Report report);
}

次に、コンストラクタ、getters、setterを使ってPOJOを作成します。

public static class Report {
    private String code;
    private String monthact;

    public Report(String code, String monthact) {
        this.code = code;
        this.monthact = monthact;  
    }

    // Getters and Setters...
}

そしてそれを普通の方法と呼んでください。

Call<List<Report>> request = apiInterface
    .createRetrofitAPIInterface()
    .getLandingPageReport(new Report(code, monthact));

私はそれが十分明確だったことを願っています






Related