2016-02-05 86 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