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が表示されます。
あなたはこのように試してみるべきです..。
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());
}
}
JsonObjectを確認してください。 jsonで応答を取得する場合は、JSONObjectではなく応答タイプJsonObjectを定義する必要があります。そうでない場合は、インターフェイスでpojoクラスを指定します。
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'
私はあなたが改造哲学を理解していないと思います。正しいインターフェースは次のとおりです。
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を返します。これはメインスレッドから行う必要があります。
レトロフィット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);
}
これにより、呼び出しは非同期になります。
Call <Void> getSlots()は私のために働いた。
ここでも同じ問題があり、 curiousMindからの回答 私の一日を救った。
同じテーマの詳細:ペアから値を取得する必要がある場合は、次を使用します。
String value = response.body().getAsJsonObject().get("pair_name").getAsString();
@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();
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