android - Retrofit-http 405 响应?

标签 android django rx-java retrofit2 http-status-code-405

我正在尝试创建一个登录页面,并且使用 django 作为后端。使用的身份验证是基于 token 的。我尝试发布用户名和密码,这给了我一个 405 http 代码错误,这不是我预期的情况。而且它还说它不期望 GET 方法,而我不这样做。它在https://www.hurl.it/中以正确的方式工作.我已经在这里发布了图像和代码。请帮忙!

LoginPresenter.java

subscription = RxUtil.io(restProvider.authenticate(userId, password))
                .subscribe(new Subscriber<JsonObject>() {
                    @Override
                    public void onCompleted() {
                        getMvpView().showProgress(false);
                    }

                    @Override
                    public void onError(Throwable e) {
                        Timber.e(e);
                        getMvpView().showProgress(false);
                    }

                    @Override
                    public void onNext(JsonObject jsonObject) {
                        Timber.d(jsonObject.toString());
                    }
                });

RestProvider.java

public interface RestProvider {

    @FormUrlEncoded
    @POST("/api-token-auth")
    Observable<JsonObject> authenticate(@Field("username") String user, @Field("password") String pass);

}

拦截器日志为

POST http://mylink.com/mypath http/1.1
Content-Type: application/x-www-form-urlencoded
Content-Length: 52
username=myusername&password=mypassword
--> END POST (52-byte body)
<-- 405 Method Not Allowed http://mylink.com/mypath (84ms)
Date: Sat, 07 Jan 2017 04:36:48 GMT
Server: Apache/2.4.18 (Ubuntu)
Vary: Cookie
X-Frame-Options: SAMEORIGIN
Allow: POST, OPTIONS
Keep-Alive: timeout=5, max=99
Connection: Keep-Alive
Transfer-Encoding: chunked
Content-Type: application/json
{"detail":"Method \"GET\" not allowed."}
<-- END HTTP (40-byte body)

后端是 Django,我使用基于 token 的身份验证。它在 hurl.it 中完美运行。

request in hurl

response in hurl

这是木材。

retrofit2.adapter.rxjava.HttpException: HTTP 405 Method Not Allowed
                                                                        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:48)
                                                                        at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:30)
                                                                        at rx.Observable.unsafeSubscribe(Observable.java:10142)
                                                                        at rx.internal.operators.OperatorSubscribeOn$1.call(OperatorSubscribeOn.java:94)
                                                                        at rx.internal.schedulers.CachedThreadScheduler$EventLoopWorker$1.call(CachedThreadScheduler.java:230)
                                                                        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:761)

最佳答案

我在我的程序中发现了这个错误。实际上,这是我提供给 Restprovider 类的 Url 的问题。本来应该是 “/api-token-auth/” 只需一个斜杠就可以改变一切。感谢所有尝试过的人。

关于android - Retrofit-http 405 响应?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41517964/

相关文章:

android - 线性布局在设计中可见但在运行时不可见?

android - 如何自定义ZXingScannerView边框

java - Android - 使用 GSON 解析 JSON

Django多表继承: specify custom one-to-one column name

django - MongoEngine——如何为身份验证()自定义用户模型/自定义后端

java - 如何使一个 Observable 发出由 RxJava 2 中另一个 Observable 发出的组合项?

android - bindService() with BIND_AUTO_CREATE 是否总是创建新的服务实例?

Python:如何将变量用作字符串?

android - 使用 RX-Java 进行相关操作和 http 请求

java - 如何重新创建或重置缓存的 Observable,与 Retrofit 一起使用以获取新数据?