2016-11-16 2 views
1

Я использую переоснащение и у меня есть пост запросдооснащения кода ответа 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> 

Interceptor На данный момент я использую 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") 
     } 
    }) 

ответ

1

Я нашел ответ, проблема была URL, мои BaseUrl были http//www.example.com/url1/url2/...../service и @POST("/")

, когда я увидел POST конечной точки это было HTTP // www.example.com/, и я не знаю, почему

Я только что изменил этот URLS baseUrl = http//www.example.com/ и @POST("url1/url2/...../service")

3

Мое лучшее предположение, что вы пытаетесь опубликовать неправильный URL-адрес 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() 

Это лучший совет, который я могу дать, не видя журналы ошибок.

+0

Я добавил журнал ошибок –

1

мне не хватало «/» в конце моего URL в запросе POST. Изменение URL из

www.example.com/list_products

к www.example.com/list_products/ работал для меня.

0

Метод не допускается ошибка с кодом состояния -405 отображается, когда мы не отправляем наш метод запроса или получает неправильный метод запроса.

В моем случае Апи имеет тип POST, и я проверялся GET типа запроса,

Так что попробуйте изменить соответствующий метод запроса (GET/POST/PUT/DELETE).