2016-02-05 61 views
2

我試圖從我的服務器上使用OkHttp從android應用程序調用put方法。Okhttp Put方法返回'方法不允許'

這是API方法簽名:

public void Put(int userId, string regId) { }

這是Android的代碼來調用上面的方法...

private boolean SendGCMRegIdToServer(String registrationId, Integer userId) throws IOException { 
    HttpUrl url = new HttpUrl.Builder() 
      .scheme("http") 
      .host(serverApiHost) 
      .addPathSegment("AppDashboard") 
      .addPathSegment("api") 
      .addPathSegment("GCM/") 
      .build(); 

    MediaType JSON 
      = MediaType.parse("application/json; charset=utf-8"); 

    String json = "{'userId':" + userId + "," 
      + "'regId':'" + registrationId + "'" 
      + "}"; 

    RequestBody requestBody = RequestBody.create(JSON, json); 

    Request request = new Request.Builder() 
      .url(url) 
      .put(requestBody) 
      .build(); 

    //this should post the data to my server 
    Response response = client.newCall(request).execute(); 
    if(response.code() == 400) 
     return false; 

    return true; 
} 

現在的問題是我得到錯誤代碼405在答覆說法不允許,但我不明白問題在哪裏,因爲我可以用postma成功調用方法n個服務器本身如下的:

http://localhost/AppDashboard/api/GCM?userId=5&regId=123

我想它可能有一些做的整數或字符串正在JSON字符串錯誤地傳遞了,但不能爲生命明白爲什麼這不工作...

任何幫助是非常感謝感謝...

+0

你確定你還使用PUT在郵遞員? – njzk2

回答

1

我看到你的REST API調用兩種不同的方法。在OkHttp之一中,你發送一個帶有序列化JSON對象的PUT方法,並且在POSTMAN中,你發送一個PUT(儘管我猜你做了一個GET)請求,並在URL中包含參數,我的意思是不在JSON體結構中。

無論如何,HTTP 405告訴你,你的後端不支持PUT方法,可能它的expecting a POST method"X-HTTP-Method-Override:PUT" HTTP頭,因爲POST是比REST更標準的方法比PUT。

我應該做的是仔細檢查您的POSTMAN請求,並將Android中的一個調整爲相同的方法,參數和標頭,而不是更多。

答案更新(如問題已更新)

當然有與動詞的問題,正如我所說的上述IIS只處理標準的方法和PUT是不是其中之一。您有三種選擇:

  1. 將您的PUT更改爲POST。
  2. 使用POST和X-HTTP-Method-Override to PUT。 (reference
  3. 修改IIS配置以支持非標準REST方法。 I 個人不會建議第三個,因爲它連接到 後端配置(例如,想象你將IIS更改爲NancyFX)。
+0

所以有沒有發送Okhttp放置請求沒有一個身體,但與url參數的方式,而不是... – jjharrison

+0

當然,但你爲什麼要那樣做?我建議像大家一樣使用JSON。但是,如果你想這樣做並使用表單參數,請調整你的MediaType並做這樣的事情:https://github.com/square/okhttp/wiki/Recipes#posting-form-parameters – GoRoS

1

我有同樣的問題,服務器返回。經過一番搜索,我意識到這是一個配置問題上IIS,不讓請求。所以在android代碼中沒有問題,你應該配置你的服務器來讓這種請求。 看到thisthisthis

1

好感謝球員的答覆,但似乎我得到我所用的PARAMS傳遞給我的API兩種方法之間有點困惑。

這裏就是我所做的:

改變了方法的簽名後與設置了一個param [FromBody]作爲一種模式(僅支持一個paramater)...

public void Post([FromBody]UserGcmRegIdModel model) 
{ 
} 

我就能夠到我的方法調用更改爲使用更好JSONBuilder和要求製造商使用。員額,而不是下面。把

JSONObject jsonObject = new JSONObject(); 

    try { 
     jsonObject.put("UserId", userId); 
     jsonObject.put("RegId", registrationId); 
    } catch (JSONException e) { 
     e.printStackTrace(); 
    } 

    String json = jsonObject.toString(); 

    RequestBody requestBody = RequestBody.create(JSON, json); 

    Request request = new Request.Builder() 
      .url(url) 
      .post(requestBody) 
      .build(); 

我仍然不知道在IIS上put()方法是否存在問題,但是在我的案例中使用了一個帖子是絕對沒問題的,所以我正在與...

+0

我已經更新了我的答案,因爲你的問題也已更新。 – GoRoS

相關問題