Okhttp Put方法返回'方法不允许'

时间:2016-02-05 19:19:05

标签: android asp.net-web-api okhttp http-status-code-405

我正在尝试使用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成功调用方法,如下所示:

Decimal

我认为它可能与在JSON字符串中错误传递的整数或字符串有关,但在生命中不能看到为什么这不起作用......

任何帮助都非常感谢...

3 个答案:

答案 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. 将您的PUT更改为POST。
  2. 使用POST和X-HTTP-Method-Override进行PUT。 (reference
  3. 修改IIS配置以支持非标准REST方法。一世 个人不会建议第三个,因为它附属于 后端配置(例如,假设您将IIS更改为NancyFX)。

答案 1 :(得分:1)

我遇到了同样的问题,服务器正在返回 405 。经过一些搜索,我发现 IIS 上的配置问题不允许发送请求。所以在Android代码中没有问题,你应该配置你的服务器来让这种请求。 请参阅thisthisthis

答案 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()方法是否有问题,但在我的案例中使用帖子绝对没问题,所以我就是这样......