ชุดติดตั้งเพิ่มเติม 2: ไม่พบ HTTP 404

ฉันมีบริการง่ายๆ นี้บนเซิร์ฟเวอร์ของฉันที่ http://192.168.1.12:8080/api/hooray:

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

มันใช้งานได้จากบุรุษไปรษณีย์ แต่จากแอปพลิเคชัน 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 และใช้งานได้ ทำไมมันใช้งานไม่ได้ที่นี่? ฉันหมายถึงรหัสดูเหมือนจะถูกต้อง


person s.dallapalma    schedule 07.09.2017    source แหล่งที่มา


คำตอบ (3)


ตกลง ฉันพบคำตอบแล้ว ปัญหาอยู่ใน .baseUrl(getResources().getString(R.string.url)) URL ถูกจัดเก็บไว้ในไฟล์ทรัพยากร values/string.xml เป็น

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

อย่างไรก็ตาม ในไฟล์ทรัพยากรอื่น values-it/string.xml มีดังต่อไปนี้:

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

เนื่องจากภาษาของสมาร์ทโฟนของฉันถูกตั้งค่าเป็นภาษาอิตาลี จึงมีการใช้ไฟล์ทรัพยากร values-it/string.xml ดังนั้นโปรแกรมจึงรู้จัก https://myapp-api.mydomain.io/api เป็น url แทนที่จะเป็น http://192.168.1.12:8080/api/

โปรดทราบว่าควรอัปเดต URL ทั้งหมดในไฟล์ทรัพยากรอย่างถูกต้องเพื่อหลีกเลี่ยงปัญหานี้

person s.dallapalma    schedule 07.09.2017

คุณแน่ใจหรือไม่ว่าโทรศัพท์มือถือเชื่อมต่อกับระบบ LAN เดียวกัน?

มิฉะนั้น คุณสามารถลองลบเครื่องหมายทับท้ายบนอินเทอร์เฟซออกได้ แต่ไม่น่าจะเป็นปัญหา

public interface HoorayAPI {
    @GET("hooray")
    Observable<HoorayResponse> hooray();
}
person Andrea Vassallo    schedule 07.09.2017
comment
ใช่ โทรศัพท์มือถือเชื่อมต่อกับ LAN เดียวกัน และไม่ เครื่องหมายทับไม่ใช่ปัญหา :/ อย่างที่ฉันบอกไปแล้วว่าด้วยบริการอื่น (การเข้าสู่ระบบ) มันใช้งานได้ ดังนั้นพฤติกรรมนี้จึงแปลก - person s.dallapalma; 07.09.2017
comment
ฉันสามารถลองใช้บริการได้หรือไม่? หากคุณใช้ ngrok เพื่อแชร์ WS ในพื้นที่ของคุณ ฉันสามารถลองแก้ไขข้อบกพร่องกับคุณได้ - person Andrea Vassallo; 07.09.2017
comment
แค่อยากรู้! คุณมีข้อผิดพลาดเดียวกันถ้าคุณใช้ ngrok url หรือไม่? - person Andrea Vassallo; 07.09.2017
comment
ดังนั้นฉันจึงไม่สามารถแก้ไขข้อบกพร่องได้ แปลกมาก ลองรีบูต WS! หากฉันมีความคิดใด ๆ ฉันจะเขียนถึงคุณ! หากคุณสามารถแก้ปัญหาได้โปรดเขียนคำตอบ :) - person Andrea Vassallo; 07.09.2017
comment
โอเคขอบคุณ. ฉันซาบซึ้งจริงๆ อย่างน้อยมันก็ใช้ได้กับ ngrok ในตอนนี้ ;P - person s.dallapalma; 07.09.2017
comment
ฉันโพสต์คำตอบ ฉันไม่รู้ว่าทำไมพฤติกรรมนี้ ขอบคุณครับ ถ้าไม่ลองกับ ngrok ก็คงแก้ปัญหาไม่ได้ครับ - person s.dallapalma; 07.09.2017
comment
มันเป็นความสุข. อย่างไรก็ตาม ฉันใช้สิ่งนี้เพื่อช่วยฉันในการแก้ไขข้อบกพร่อง: stackoverflow.com/a/33256827/5650222 ลองเลย :) - person Andrea Vassallo; 07.09.2017

คุณควรเปลี่ยนประเภท subscribeOn(Schedulers.newThread()) ของคุณเป็น .subscribeOn(Schedulers.single()) ซึ่งช่วยฉันได้ =)

person Sasha Balyas    schedule 24.03.2018
comment
นี่ควรจะสมัครรับข้อมูลจาก Schedulers.io() เนื่องจากเป็นการดำเนินการบล็อก - person William Reed; 06.02.2019