web-dev-qa-db-ja.com

後付け応答で空のボディを受け取る

HttpURLからデータを取得するためにレトロフィットを使用しています。私のインターフェースクラス:

public interface SlotsAPI {

    /*Retrofit get annotation with our URL
      And our method that will return a Json Object
    */
    @GET(url)
    retrofit.Call<JSONObject> getSlots();
}

私のリクエストメソッド。

public void getResponse(){

    Retrofit retrofit = new Retrofit.Builder()
                    .baseUrl(URL)
                    .addConverterFactory(GsonConverterFactory.create())
                    .build();

    //Creating an object of our api interface
    SlotsAPI api = retrofit.create(SlotsAPI.class);
    retrofit.Call<JSONObject> callback = api.getSlots();
    callback.enqueue(new Callback<JSONObject>() {
    @Override
    public void onResponse(Response<JSONObject> response) {
        if (response != null) {
            Log.d("OnResponse", response.body().toString());
        }
    }

    @Override
    public void onFailure(Throwable t) {
        t.printStackTrace();
    }
    });
}

応答では、空の本体を受け取ります。サーバーは200OKで応答します。

D/OnResponse: {}

しかし、ブラウザでURLを開くと、画面にJSONObjectが表示されます。

10
Viking93

あなたはこのように試してみるべきです..。

public interface SlotsAPI {

/*Retrofit get annotation with our URL
  And our method that will return a Json Object
*/
@GET(url)
Call<JsonElement> getSlots();
}

リクエストメソッドで

 retrofit.Call<JsonElement> callback = api.getSlots();
callback.enqueue(new Callback<JsonElement>() {
@Override
public void onResponse(Response<JsonElement> response) {
    if (response != null) {
        Log.d("OnResponse", response.body().toString());
    }
}
14
curiousMind

JsonObjectを確認してください。 jsonで応答を取得する場合は、JSONObjectではなく応答タイプJsonObjectを定義する必要があります。そうでない場合は、インターフェイスでpojoクラスを指定します。

6
Ashik Abbas
            call.enqueue(new Callback<ResponseBody>() {
                @Override
                public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
                   try {
                        Log.d(TAG, "GetProspectlistresponse" + "" + response.isSuccessful());
                        utility.hideProgressDialog();
                        if (response.isSuccessful()) {

                            String remoteResponse = new String(response.body().string());
                            Log.d(TAG, "Holidaylistresponse" + "" + remoteResponse);
                            try {

            JSONObject object = new JSONObject(remoteResponse);
            JSONArray array = object.getJSONArray("Holidays_Details");

            if (array.toString().equals("[]")) {
                holiday_recyclerView.setVisibility(View.GONE);
            } else {
                holiday_recyclerView.setVisibility(View.VISIBLE);
                for (int i = 0; i < array.length(); i++) {
                    JSONObject c = array.getJSONObject(i);
                    String holidayDate = c.getString(TAG_HOLIDAYDATE);
                    String holidayName = c.getString(TAG_HOLIDAYName);
                    String holidaytype = c.getString(TAG_HOLIDAYtype);

                    HashMap<String, String> customers = new HashMap<String, String>();

                    customers.put(TAG_HOLIDAYDATE, holidayDate);
                    customers.put(TAG_HOLIDAYName, holidayName);
                    customers.put(TAG_HOLIDAYtype, holidaytype);
                    arrayList.add(customers);
                }

                getHolidaylistAdapter.notifyDataSetChanged();
            }

                            } catch (JSONException e) {
                                e.printStackTrace();
                            }
                        } else {
                            utility.hideProgressDialog();
    }
                } catch (IOException e) {
                            e.printStackTrace();
            }
            @Override
            public void onFailure(Call<ResponseBody> call, Throwable t) {
                Log.i("ErrorResponsestring", call.toString());
            }
        });
    }
String JSONURL = "https://demonuts.com/Demonuts/JsonTest/Tennis/";
    @GET("json_parsing.php")
    Call<ResponseBody> getString();
//    @POST("getProspectList")
//    @FormUrlEncoded
//    Call<ResponseBody> getProspectList(@FieldMap HashMap<String, String> body);
 implementation 'com.squareup.retrofit2:retrofit:2.0.2'
    implementation 'com.squareup.retrofit2:converter-gson:2.0.2'
    implementation 'com.squareup.okhttp3:okhttp:4.0.0'
0
HachINsta

私はあなたが改造哲学を理解していないと思います。正しいインターフェースは次のとおりです。

public interface SlotsAPI {

    /*Retrofit get annotation with our URL
      And our method that will return a Json Object
    */
    @GET(url)
    JSONObject getSlots();
}

GetSlotsメソッドを呼び出すと、retrofitは自動的にHTTPリクエストを実行し、JSONObjectを返します。これはメインスレッドから行う必要があります。

0
Clêrton Leal

レトロフィット2または1を使用していますか?バージョン2はまだベータ版です。バージョン1を使用している場合。これを使用します。

public interface SlotsAPI {

    /*Retrofit get annotation with our URL
      And our method that will return a Json Object
    */
    @GET(url)
    void getSlots(Callback<JsonElement> callback);
}

これにより、呼び出しは非同期になります。

0
Clêrton Leal

Call <Void> getSlots()は私のために働いた。

0
pgp

ここでも同じ問題があり、 curiousMindからの回答 私の一日を救った。
同じテーマの詳細:ペアから値を取得する必要がある場合は、次を使用します。

String value = response.body().getAsJsonObject().get("pair_name").getAsString();
0
Diego Thoms

@GetのURLが相対パスであることを確認してください

  • @Base URL:常に/で終わります

  • @Url:/で始めないでください

例:

  String URL = http://api.co/base/ ;

そして

  @GET("webservice/syncdown")
  JSONObject getSlots();

スロットのリストを受け取る場合があります。 jsonの配列を送信すると、Gsonコンバーターがそれを処理します

 @GET(url)
 retrofit.Call<List<Slot>> getSlots();
0
Ahmed Khamis
 private void APIRetrofit_method() {
      Retrofit  retrofit = new Retrofit.Builder()
                .baseUrl(RecyclerInterface.JSONURL)
               // .client(okHttpClient)
                .addConverterFactory(GsonConverterFactory.create())
                .build();
        RecyclerInterface api = retrofit.create(RecyclerInterface.class);

        Call<ResponseBody> call = api.getString(); /// GET METHOD without passing params
        // Post METHOD CODE START
//        HashMap<String, String> params = new HashMap<String, String>();
//        params.put("name", "yuva");
//        params.put("pass", "" + "123");
     //   Call<ResponseBody> call1 = api.getProspectList(params);
        // Post METHOD CODE END
0
HachINsta