/ / Retrofit2: HTTP 404 не е намерен - android, rx-java, retrofit2

Retrofit2: HTTP 404 не е намерен - android, rx-java, retrofit2

Имам тази проста услуга на сървъра си в http://192.168.1.12:8080/api/hooray:

router.route("/hooray/")
.get(function (req, res) {
res.status(200).send({ result: true, message: "hooray" })
})

Той работи от Postman, но от моето приложение за Android не успях да стигна до този URL адрес и не знам защо.

Това е (опростен) код:

Интерфейс на услугата

public interface HoorayAPI {
@GET("hooray/")
Observable<HoorayResponse> hooray();
}

Моят персонализиран клас отговори: HoorayResponse

public class HoorayResponse{
@SerializedName("result")
@Expose
private boolean result;

@SerializedName("message")
@Expose
private String message;

public HoorayResponse(boolean result, String message) {
this.result = result;
this.message = message;
}

// Getter and setter ...
}

посетител

public void foo(){
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("http://192.168.1.12:8080/api/")
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.addConverterFactory(GsonConverterFactory.create())
.build();

HoorayAPI service = retrofit.create(HoorayAPI.class);

Observable<HoorayResponse> hoorayObservable = service.hooray();

hoorayObservable
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber<HoorayResponse>() {
@Override
public void onCompleted() {}

@Override
public void onError(Throwable e) { e.printStackTrace(); }

@Override
public void onNext(HoorayResponse response) {
System.out.println("Hooray!!!");
}
});
}

Когато се обадя на метода foo (), получавам тази грешка:

retrofit2.adapter.rxjava.HttpException: HTTP 404 Not Found
at retrofit2.adapter.rxjava.OperatorMapResponseToBodyOrError$1.onNext(OperatorMapResponseToBodyOrError.java:43)
at retrofit2.adapter.rxjava.OperatorMapResponseToBodyOrError$1.onNext(OperatorMapResponseToBodyOrError.java:38)
at retrofit2.adapter.rxjava.RxJavaCallAdapterFactory$RequestArbiter.request(RxJavaCallAdapterFactory.java:173)
at rx.internal.operators.OperatorSubscribeOn$1$1$1.request(OperatorSubscribeOn.java:80)
at rx.Subscriber.setProducer(Subscriber.java:211)
at rx.internal.operators.OperatorSubscribeOn$1$1.setProducer(OperatorSubscribeOn.java:76)
at rx.Subscriber.setProducer(Subscriber.java:205)
at retrofit2.adapter.rxjava.RxJavaCallAdapterFactory$CallOnSubscribe.call(RxJavaCallAdapterFactory.java:152)
at retrofit2.adapter.rxjava.RxJavaCallAdapterFactory$CallOnSubscribe.call(RxJavaCallAdapterFactory.java:138)
at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:50)
at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:30)
at rx.Observable.unsafeSubscribe(Observable.java:8460)
at rx.internal.operators.OperatorSubscribeOn$1.call(OperatorSubscribeOn.java:94)
at rx.internal.schedulers.ScheduledAction.run(ScheduledAction.java:55)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:428)
at java.util.concurrent.FutureTask.run(FutureTask.java:237)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:272)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607)
at java.lang.Thread.run(Thread.java:776)

Не мога да разбера, защото грешката: HTTP 404 не е намерен, Тази услуга е достъпна и работи. Написах API за услуга за Влизам по подобен начин на HoorayAPI, с метод POST и работи. Защо не работи тук? Кодът изглежда правилен.

Отговори:

1 за отговор № 1

Добре, намерих отговора. Проблемът беше

.baseUrl("http://192.168.1.12:8080/api/")

Беше под маркера за низове

<string name="url">http://192.168.1.12:8080/api/</string>

в getResources () getString (R.string.url).

Имах тази ситуация в string.xml:

<string name="url">http://192.168.1.12:8080/api/</string>
<!--<string name="url">https://myapp-api.mydomain.io/api</string> -->

и странно, дори ако втората беше коментирана, програмата го разпознава (https://myapp-api.mydomain.io/api) като url


0 за отговор № 2

Сигурни ли сте, че мобилният телефон е свързан към една и съща локална мрежа?

В противен случай можете да опитате да премахнете крайната наклонена черта на интерфейса, но това не би трябвало да е проблемът

public interface HoorayAPI {
@GET("hooray")
Observable<HoorayResponse> hooray();
}

0 за отговор № 3

Трябва да промените типа си subscribeOn(Schedulers.newThread()) до това .subscribeOn(Schedulers.single()) Това помага за мен =)