使用消息"方法改进响应代码405"

时间:2016-11-16 17:11:34

标签: android http kotlin retrofit2

我正在使用改装,我有一个帖子请求

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
        }
    }
}

}

当我使用此方法并且在响应方法上调用响应体时始终为null。

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
        }
    })
}

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

这是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")
        }
    })

5 个答案:

答案 0 :(得分:5)

我最好的猜测是,您尝试发布错误的网址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()

在没有看到错误日志的情况下,这是我能给出的最佳建议。

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:1)

我在POST请求的url末尾错过了“/”。 从

更改网址

www.example.com/list_products

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

答案 3 :(得分:1)

对我来说,主要原因是我调用了 http 而不是 https 例如: 我使用这个 url 作为基本 url,这给了我这个错误

http://www.facebook.com/

当我把它改成这个时,它就像一个魅力

https://www.facebook.com/

答案 4 :(得分:0)

当我们不发送请求方法或发送错误的请求方法时,显示状态代码为405的方法不允许错误。

在我的场景中,Api属于POST类型,我正在检查GET请求类型

因此,请尝试更改正确的Request方法(GET / POST / PUT / DELETE)。