API возвращает 404 для дооснащения

117
4

У меня есть API, который возвращает простой ответ JSON просто отлично (код ответа 200). Но когда я запрашиваю тот же URL-адрес из моего приложения для Android, он получает 404.

Вот зависимости

compile 'com.squareup.retrofit:retrofit:2.0.0-beta2'
compile 'com.squareup.okhttp:okhttp:2.6.0'
compile 'com.squareup.retrofit:converter-gson:2.0.0-beta2'
compile 'com.google.code.gson:gson:2.4'

Это мой интерфейс

public interface ExampleApi {
@GET("/test/drink/")
Call<Example> getExample();
}

Эти коды работают в MainActivity

Retrofit retrofit = new Retrofit.Builder()
.baseUrl("https://localpro.herokuapp.com/api")
.addConverterFactory(GsonConverterFactory.create())
.build();

ExampleApi api = retrofit.create(ExampleApi.class);
Call<Example> call = api.getExample();
call.enqueue(new Callback<Example>() {
@Override
public void onResponse(Response<Example> response, Retrofit retrofit) {
try {
Log.i("Response code", " " + response.code());
Log.i("Response", " " + response.body().toString());
} catch (Exception e) {
e.printStackTrace();
}

}

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

Журнал

12-11 16:59:44.235 8885-8885/com.wealthpack.retrofitfinal I/Response code:  404 
12-11 16:59:44.236 8885-8885/com.wealthpack.retrofitfinal W/System.err: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String java.lang.Object.toString()' on a null object reference
12-11 16:59:44.236 8885-8885/com.wealthpack.retrofitfinal W/System.err: at com.wealthpack.retrofitfinal.MainActivity$1.onResponse(MainActivity.java:45)
12-11 16:59:44.236 8885-8885/com.wealthpack.retrofitfinal W/System.err: at retrofit.ExecutorCallAdapterFactory$ExecutorCallback$1.run(ExecutorCallAdapterFactory.java:86)
12-11 16:59:44.236 8885-8885/com.wealthpack.retrofitfinal W/System.err: at android.os.Handler.handleCallback(Handler.java:746)
12-11 16:59:44.236 8885-8885/com.wealthpack.retrofitfinal W/System.err: at android.os.Handler.dispatchMessage(Handler.java:95)
12-11 16:59:44.236 8885-8885/com.wealthpack.retrofitfinal W/System.err: at android.os.Looper.loop(Looper.java:148)
12-11 16:59:44.236 8885-8885/com.wealthpack.retrofitfinal W/System.err: at android.app.ActivityThread.main(ActivityThread.java:5443)
12-11 16:59:44.236 8885-8885/com.wealthpack.retrofitfinal W/System.err: at java.lang.reflect.Method.invoke(Native Method)
12-11 16:59:44.236 8885-8885/com.wealthpack.retrofitfinal W/System.err: at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:728)
12-11 16:59:44.236 8885-8885/com.wealthpack.retrofitfinal W/System.err: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)

Примечание. Я совершенно не знаком с разработкой Android и использованием Java через несколько лет.

спросил(а) 2021-01-25T16:40:04+03:00 6 месяцев назад
1
Решение
78

Это проблема синтаксиса,

вы должны написать свое обслуживание следующим образом:

Retrofit retrofit = new Retrofit.Builder()
.baseUrl("https://localpro.herokuapp.com/api/")
.addConverterFactory(GsonConverterFactory.create())
.build();

public interface ExampleApi {
@GET("test/drink/")
Call<Example> getExample();

для более подробной информации проверьте эту приятную презентацию от Jake Wharton https://youtu.be/KIAoQbAu3eA?t=32m24s :)

ответил(а) 2021-01-25T16:40:04+03:00 6 месяцев назад
45

Запросить свою услугу

new Thread(new Runnable() {
@Override
public void run() {
Response response = App.retrofit().buildRequest(TestActivity.this).universityService().getExample(); //getExample("json")
if(response.getStatus() == 200){
System.out.println(response.getBody().toString());
}else{
System.out.println(response.getStatus());
}
}
}).start();

Чтобы получить услугу

@GET("/test/drink/")
Response getExample();

или

@GET("/test/drink/")
Response getExample(@Query("format") String format);

Ваши модели

public class Example {
public boolean success;
public List<Drink> drinks;
}

public class Drink {
public String name;
public String description;
}

Адаптер для дооснащения, im с использованием версии модернизации версии 1.9.0

private static final String url = "http://localpro.herokuapp.com/api";

restAdapter = new RestAdapter.Builder()
.setEndpoint(url)
.build();

Это работает для меня.

ответил(а) 2021-01-25T16:40:04+03:00 6 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема