【问题标题】:Retrofit2: HTTP 404 Not FoundRetrofit2:未找到 HTTP 404
【发布时间】:2018-08-07 18:13:29
【问题描述】:

我在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 Not Found。该服务是可访问的并且有效。我以与 HoorayAPI 非常相似的方式为 login 编写了一个服务 API,使用 POST 方法,并且它可以工作。为什么它在这里不起作用?我的意思是,代码似乎是正确的。

【问题讨论】:

    标签: android rx-java retrofit2


    【解决方案1】:

    好的,我找到了答案。问题出在.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 以避免此问题。

    【讨论】:

      【解决方案2】:

      你确定手机连接的是同一个局域网吗?

      否则您可以尝试删除界面上的结束斜线,但这应该不是问题

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

      【讨论】:

      • 是的,手机连接到同一个局域网,不,斜线不是问题:/。正如我所说,使用另一个服务(登录)它确实有效,所以这种行为很奇怪。
      • 我可以试试服务吗?如果你使用 ngrok 来分享你本地的 WS 我可以尝试和你一起调试。
      • 只是好奇!如果你使用 ngrok url 你有同样的错误吗?
      • 所以我无法调试它。很奇怪,重启WS试试!如果我有任何想法,我会写信给你!如果你能解决,请写下答案:)
      • 好的,谢谢。对此,我真的非常感激。至少它目前适用于 ngrok ;P
      【解决方案3】:

      您应该将subscribeOn(Schedulers.newThread()) 的类型更改为.subscribeOn(Schedulers.single()) 这对我有帮助=)

      【讨论】:

      • 这实际上应该订阅Schedulers.io(),因为这是一个阻塞操作
      猜你喜欢
      • 2017-02-24
      • 2022-01-22
      • 2016-10-11
      • 2018-01-10
      • 2014-04-14
      • 2015-12-04
      • 2019-07-30
      • 2016-08-06
      • 1970-01-01
      相关资源
      最近更新 更多