Android 第2部分:未找到HTTP 404

Android 第2部分:未找到HTTP 404,android,rx-java,retrofit2,Android,Rx Java,Retrofit2,我的服务器上有以下简单服务: 它确实可以在Postman上运行,但在我的Android应用程序中,我无法访问该url,我也不知道为什么 这是(简化的)代码: 服务接口 呼叫者 我无法找出原因,因为出现错误:未找到HTTP 404。该服务是可访问的,并且可以工作。我用与HoorayAPI非常相似的方式编写了一个用于登录的服务API,并使用了POST方法,它可以正常工作。为什么它在这里不起作用?我的意思是,代码似乎是正确的。您确定移动电话连接到同一局域网吗 否则,您可以尝试删除接口上的结束斜杠,但这

我的服务器上有以下简单服务:

它确实可以在Postman上运行,但在我的Android应用程序中,我无法访问该url,我也不知道为什么

这是(简化的)代码:

服务接口 呼叫者
我无法找出原因,因为出现错误:未找到HTTP 404。该服务是可访问的,并且可以工作。我用与HoorayAPI非常相似的方式编写了一个用于登录的服务API,并使用了POST方法,它可以正常工作。为什么它在这里不起作用?我的意思是,代码似乎是正确的。

您确定移动电话连接到同一局域网吗

否则,您可以尝试删除接口上的结束斜杠,但这应该不是问题所在

public interface HoorayAPI {
    @GET("hooray")
    Observable<HoorayResponse> hooray();
}
公共接口HoorayAPI{
@得到(“万岁”)
可观察的万岁();
}

好的,我找到答案了。问题出在
.baseUrl(getResources().getString(R.string.url))
中。url存储在资源文件values/string.xml中,如下所示:

http://192.168.1.12:8080/api/
但是,在另一个资源文件values-it/string.xml中有以下内容:

<string name="url">https://myapp-api.mydomain.io/api</string>
https://myapp-api.mydomain.io/api
由于我的智能手机的语言设置为意大利语,因此使用了资源文件值it/string.xml,因此程序将识别为url,而不是url


请注意正确更新资源文件中的所有url以避免此问题。

您应该将
订阅(Schedulers.newThread())
的类型更改为this
。订阅(Schedulers.single())
对我有帮助=)

是的,移动电话连接到同一局域网,否,斜杠不是问题:/。正如我所说,对于另一个服务(登录),它确实可以工作,所以这种行为很奇怪。我可以试试这个服务吗?如果你使用ngrok来分享你的本地WS,我可以试着和你一起调试。只是好奇而已!如果你使用ngrok url,你也会犯同样的错误吗?所以我无法调试它。这很奇怪,尝试重新启动WS!如果我有任何想法,我会写信给你!如果你能解答,请写下答案:)好的,谢谢。我真的很感激。至少目前它对ngrok有效;p这实际上应该是在
Schedulers.io()上订阅,因为这是一个阻塞操作
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!!!");
                }
            });
}
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)
public interface HoorayAPI {
    @GET("hooray")
    Observable<HoorayResponse> hooray();
}
<string name="url">http://192.168.1.12:8080/api/</string>
<string name="url">https://myapp-api.mydomain.io/api</string>