2017-06-23 4 views
0

Android AppでAPIを呼び出すためにRetrofit 2を使用しています。 POSTを使用してAPIを使用していますが、クエリタグに文字列パラメータがあります。私はdocのようなことをすべて行い、テストページでこのAPIを正常にテストします。ここでレスポンスコード400不正なリクエストクエリタグのJson String paramを使用してください。Retrofit 2 Android

@POST("https://stackoverflow.com/users/{userId}/get_list_friends") 
    Call<GetListFriendDataResponse> getListFriend(@Path("userId") int userId, @Query("list") String list, @Query("page") int page, @Query("size") int size, @Header("hash") String hash); 

は私の実装です:

ArrayList<String> id = new ArrayList<>(); 
     id.add("4782947293"); 
     JSONArray jsonArray = new JSONArray(id); 
     JSONObject jsonObject = new JSONObject(); 

     try { 
      jsonObject.put("list", jsonArray); 
     } catch (JSONException e) { 
      e.printStackTrace(); 
     } 
     String list = jsonObject.toString(); 
      Log.e(TAG, "list: " + list); 
     apiInterface.getListFriend(21, list, 1,1,"AHHIGHTJGI").enqueue(new Callback<GetListFriendDataResponse>() { 
      @Override 
      public void onResponse(Call<GetListFriendDataResponse> call, Response<GetListFriendDataResponse> response) { 
       Log.e(TAG, " response code: "+ response.code()); 
           } 

      @Override 
      public void onFailure(Call<GetListFriendDataResponse> call, Throwable t) { 

      } 
     }); 

私は常に応答コードを取得する:問題は、私はここで改修2. を使用する方法が私のインターフェイスではないので、私は正しく、別のAPIを実行することができます400このAPIを使用する場合 私は "list" varに注目しています。 "list"はJSONテキストですが、Retrofit 2で使用できるJSONObjectからStringを取得するには "jSon.toString()"メソッドが正しいかどうか疑問です。List param form is:{"list":["12332" ]}。

私を助けてください!

+0

あなたが直面している問題は何ですか?エラーがある場合は、ログを投稿してください –

+0

申し訳ありません。私は私の質問を更新しました。 plsは質問の最後を読んでいます。 –

+0

は、それが最初のコードブロックのあなたの「addFriendToLeaderboard」インターフェイス – adafrwefsefr

答えて

0

質問 1)自分でJSONObjectとJSONArrayを作成する理由は何ですか? 2)あなたはjsonを作成しているものを使用して文字列を作成しています。 例:{list:["123"、 "456"]} あなたはjson全体を渡そうとしていますが、代わりに文字列の配列をリストのキーに渡す必要があります。

要求

{ 
list:["123","456"] 
} 

は、上記のJSONあなたは、今すぐサーバー に送信モデルクラスの後藤http://jsonschema2pojo.orgを作成し、JSONを貼り付けると、右側にJSONとgsonを選択して、プレビューをクリックし、要求されたとの送信。

モデルにjsonをマップするクラスを表示します。このモデルクラスを使用してjson内のキーにリストを設定する

+0

があります。1.このAPIをテストするためにJSONObjectとJSONArrayを単独で作成します。 2. Json形式のテキストは、サーバー側のプログラマーから提供されています。私はこの形式に従います。 –

+0

あなたはjsonオブジェクトを作成する必要はありません、文字列を作成し、特定のキーに文字列を割り当てる必要がありますjson、 –

+0

私はjsonオブジェクトbcs文字列はjsonテキストが必要です:(と。 、私はJSONObjectを使ってJSON形式のテキストを作るために値を動的に取得する必要があります –

0

私の問題が見つかりました。 JSONテキストには特殊文字が含まれているため、URLエンコードに変換する必要があります。このような 正しい要求URL:レトロフィット2を使用することにより

http://54.169.215.161:8080/users/29/add_friend?list=%7B%22list%22%3A%5B%2215536%22%5D%7D&platform=google 

は、それはURLを使用しています:

http://54.169.215.161:8080/users/29/add_friend?list={%22list%22:[%2215536%22]}&platform=google 

だから私は悪い要求応答コードを取得します。 Retrofit 2は、charシーケンスをURLエンコードに変換する方法も提供しますが、それだけでは不十分です。ですから、私はこのコードを使ってRetrofitのconvertメソッドを使用しません:encode = true。 ので、私のインターフェイスは、次のとおりです。

@POST("https://stackoverflow.com/users/{userId}/get_list_friends") 
    Call<GetListFriendDataResponse> getListFriend(@Path("userId") int userId, @Query(value = "list",encoded = true) String list, @Query("page") int page, @Query("size") int size, @Header("hash") String hash); 

そして、私は手動でコードでURLエンコードにJSONテキストに変換:すべてのです

 list = list.replace("{", "%7B"); 
     list=list.replace("]", "%5D"); 
     list=list.replace("[", "%5B"); 
     list=list.replace(":", "%3A"); 
     list=list.replace("}","%7D"); 
     list = list.replace("\"", "%22"); 

を。今私はAPIを使用してデータを取得できます。

提案:同じ問題がある場合は、URLの改訂後の返品を確認し、正しいURLと比較して、URLエンコードに変換されない特殊文字を確認してください。

関連する問題