用消息“此处不允许的方法”来改写响应代码405

我正在使用改造,我有一个职位请求

interface NetworkApi { @Headers("Content-Type: application/json") @POST("/") fun startLoginRequest(@Body loginModel : LoginModel) : Call<BaseResponseModel> class Factory { var retrofit = Retrofit.Builder() .baseUrl(BASE_URL) .addConverterFactory(GsonConverterFactory.create()) .build() companion object{ fun getApi (): NetworkApi { val serverApi = NetworkApi.Factory() val api = serverApi.retrofit.create(NetworkApi::class.java) return api } } } 

}

当我使用这个方法和响应方法时,调用响应体总是空的。

 fun startLoginRequest(){ val api = NetworkApi.Factory.getApi() val request = api.startLoginRequest(loginRequestModel) request.enqueue(object : Callback<BaseResponseModel>{ override fun onFailure(call: Call<BaseResponseModel>?, t: Throwable?) { } override fun onResponse(call: Call<BaseResponseModel>?, response: Response<BaseResponseModel>?) { //here response.body is null } }) } 

奇怪的是,如果我将发送使用邮差相同的对象一切正常

这是httpClient拦截器日志

 --> POST http://myExampleHost.net/ http/1.1 Content-Type: application/json Content-Length: 95 Authorization: auth-value --> END POST (95-byte body) <-- 405 Method Not Allowed http://myExampleHost.net/ (198ms) Allow: GET, HEAD, OPTIONS, TRACE, COPY, PROPFIND, LOCK, UNLOCK Content-Type: text/html Server: Microsoft-IIS/7.5 X-Powered-By: ASP.NET X-Powered-By-Plesk: PleskWin Date: Thu, 17 Nov 2016 08:04:57 GMT Content-Length: 1107 <HTML> <HEAD> <TITLE>405 Method Not Allowed</TITLE> <BASE href="/error_docs/"><!--[if lte IE 6]></BASE><![endif]--> </HEAD> <BODY> <H1>Method Not Allowed</H1> The HTTP verb used to access this page is not allowed.<P> <HR> <ADDRESS> Web Server at example address </ADDRESS> </BODY> </HTML> 

现在我使用OkHttp RequestBuilder,一切正常,我没有意识到我在上面的例子中缺少的东西

 val client = OkHttpClient() val JSON = MediaType.parse("application/json; charset=utf-8") val body = RequestBody.create(JSON,json) val request1 = Request.Builder() .url("http:example.com") .addHeader("content-type", "application/json") .method("POST", body) .build() client.newCall(request1).enqueue(object : okhttp3.Callback{ override fun onFailure(call: okhttp3.Call?, e: IOException?) { } override fun onResponse(call: okhttp3.Call?, response: okhttp3.Response?) { response?.body()?.string()?.print("RETROFIT response") } }) 

我最好的猜测是,您正试图发布到错误的网址www.example.com/login//而不是www.example.com/login/ 。 API可以对帖子有点挑剔。

您可以添加日志记录拦截器,以便您可以看到您发布的内容和URL,以便更容易地进行调试。 要设置它,你需要将compile "com.squareup.okhttp3:logging-interceptor:$okhttp_version"到你的Gradle文件中,并将你的改造设置改为如下所示:

 val httpClient = OkHttpClient.Builder().apply { if (BuildConfig.DEBUG) { httpClient.addInterceptor(HttpLoggingInterceptor().apply { level = HttpLoggingInterceptor.Level.BODY }) } } var retrofit = Retrofit.Builder() .client(httpClient.build()) .baseUrl(BASE_URL) .addConverterFactory(GsonConverterFactory.create()) .build() 

这是我能看到错误日志的最好建议。

我找到了答案,问题是URL,我的http//www.example.com/url1/url2/...../servicehttp//www.example.com/url1/url2/...../service@POST("/")

当我看到POST端点是http // http://www.example.com / ,我不知道为什么

我只是改变了这个网址baseUrl = http//www.example.com/@POST("url1/url2/...../service")

我在POST请求中的URL末尾缺少“/”。 从更改网址

http://www.example.com/list_products

到www.example.com/list_products/为我工作。