我正在尝试使用Android应用程序中的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,说不允许方法,但我看不出问题出在哪里,因为我可以在服务器本身上使用postman成功调用方法,如下所示:
我认为它可能与在JSON字符串中错误传递的整数或字符串有关,但在生命中不能看到为什么这不起作用......
任何帮助都非常感谢...
答案 0 :(得分:1)
我在REST api调用中看到了两种不同的方法。在OkHttp中你发送一个PUT方法和一个序列化的JSON对象,并在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 :(得分:1)
我遇到了同样的问题,服务器正在返回 405 。经过一些搜索,我发现 IIS 上的配置问题不允许发送请求。所以在Android代码中没有问题,你应该配置你的服务器来让这种请求。 请参阅this,this和this
答案 2 :(得分:1)
好的,谢谢回复的人,但似乎我在使用两种方法将params传递给我的API时有点混淆。
这就是我的所作所为:
将方法的签名更改为使用param [FromBody]作为模型发布(仅支持一个参数)...
public void Post([FromBody]UserGcmRegIdModel model)
{
}
然后,我可以使用更好的JSONBuilder并在请求构建器中使用.post而不是.put
将我的方法调用更改为以下内容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()方法是否有问题,但在我的案例中使用帖子绝对没问题,所以我就是这样......