Retrofit2: HTTP 404 Tidak Ditemukan

Saya memiliki layanan sederhana ini di server saya di http://192.168.1.12:8080/api/hooray:

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

Ini berfungsi dari Tukang Pos, tetapi dari aplikasi Android saya, saya tidak dapat menjangkau url itu, dan saya tidak tahu alasannya.

Itulah kode (yang disederhanakan):

Antarmuka Layanan

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

Kelas Respons khusus saya: HoreResponse

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 ...
}

Penelepon

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!!!");
                }
            });
}

Saat saya memanggil metode foo(), saya mendapatkan kesalahan ini:

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)

Saya tidak tahu karena kesalahannya: HTTP 404 Not Found. Layanan itu dapat dijangkau dan berfungsi. Saya menulis API layanan untuk login dengan cara yang sangat mirip dengan HoorayAPI, dengan metode POST, dan berhasil. Mengapa ini tidak berhasil di sini? Maksudku, kodenya sepertinya benar.


person s.dallapalma    schedule 07.09.2017    source sumber


Jawaban (3)


Oke, saya sudah menemukan jawabannya. Masalahnya ada di .baseUrl(getResources().getString(R.string.url)). Urlnya disimpan dalam file sumber daya values/string.xml sebagai

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

Namun, dalam file sumber daya lain values-it/string.xml terdapat yang berikut:

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

Karena bahasa ponsel cerdas saya disetel ke bahasa Italia, file sumber daya values-it/string.xml digunakan, sehingga program mengenali https://myapp-api.mydomain.io/api sebagai url, bukan http://192.168.1.12:8080/api/.

Berhati-hatilah untuk memperbarui semua url di file sumber daya dengan benar untuk menghindari masalah ini.

person s.dallapalma    schedule 07.09.2017

Apakah Anda yakin ponsel terhubung ke LAN yang sama?

Jika tidak, Anda dapat mencoba menghapus garis miring pada antarmuka tetapi ini seharusnya tidak menjadi masalah

public interface HoorayAPI {
    @GET("hooray")
    Observable<HoorayResponse> hooray();
}
person Andrea Vassallo    schedule 07.09.2017
comment
Ya, ponsel terhubung ke LAN yang sama, dan tidak, garis miringnya bukan masalahnya :/. Seperti yang saya katakan, dengan layanan lain (login) ini berfungsi, jadi perilaku ini aneh. - person s.dallapalma; 07.09.2017
comment
Bolehkah saya mencoba layanannya? Jika Anda menggunakan ngrok untuk membagikan WS lokal Anda, saya dapat mencoba melakukan debug dengan Anda. - person Andrea Vassallo; 07.09.2017
comment
Hanya rasa ingin tahu! Apakah Anda mengalami kesalahan yang sama jika menggunakan ngrok url? - person Andrea Vassallo; 07.09.2017
comment
Jadi saya tidak bisa men-debugnya. Aneh sekali, coba reboot WS! Jika saya mendapat ide, saya akan menulis surat kepada Anda! Kalau bisa, tolong tuliskan jawabannya :) - person Andrea Vassallo; 07.09.2017
comment
OK terima kasih. Saya sangat menghargainya. Setidaknya berhasil di ngrok, untuk saat ini ;P - person s.dallapalma; 07.09.2017
comment
Saya memposting jawabannya, saya tidak tahu mengapa perilaku ini. Terima kasih, jika saya tidak mencobanya dengan ngrok saya tidak akan bisa menyelesaikan masalah - person s.dallapalma; 07.09.2017
comment
Itu adalah kenikmatan. Namun, saya menggunakan ini untuk membantu saya dalam debugging: stackoverflow.com/a/33256827/5650222 Cobalah :) - person Andrea Vassallo; 07.09.2017

Anda harus mengubah jenis subscribeOn(Schedulers.newThread()) Anda menjadi .subscribeOn(Schedulers.single()) Ini membantu saya =)

person Sasha Balyas    schedule 24.03.2018
comment
Ini seharusnya berlangganan pada Schedulers.io() karena ini adalah operasi pemblokiran - person William Reed; 06.02.2019