【问题标题】:Why is it OkHttp post method sends get request instead of post request?为什么 OkHttp post 方法发送 get 请求而不是 post 请求?
【发布时间】:2015-08-06 19:39:42
【问题描述】:

我正在使用需要通过 POST 请求从 web api 获取令牌的 android 应用程序,我使用的是 OkHttp 库版本 2.3.0,但奇怪的是 post 方法正在执行 GET 请求,结果我得到 405 状态代码这是服务器不允许响应的方法。

这是我的代码。

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

public String executePOST(){

    OkHttpClient client = new OkHttpClient();

    .
    .
    .
    .

    String url = API_URL + "/oauth/access_token/";
    String strResponse = null;

    RequestBody body = RequestBody.create(JSON, jsonBody);

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

    Response response;

    try {

        response = client.newCall(request).execute();
        strResponse = response.body().string(); 

      } catch (IOException e) {
            e.printStackTrace();
      }

      return strResponse;
   }

当我调试代码时,响应对象具有此内容...

知道这有什么问题吗?这个可能的解决方法是什么?对你的帮助表示感谢!谢谢...

【问题讨论】:

  • 您是否尝试过删除网址末尾的 /?我曾经遇到过类似的问题,并为我解决了这个问题。

标签: java android post get okhttp


【解决方案1】:

当我将 POST 发送到 http:// 而不是 https:// 时,我遇到了这种问题。

我想,它会自动将我重定向到方法类型丢失的 https://。

【讨论】:

    【解决方案2】:

    注意您的 HTTP 响应的 priorResponse() 成员。您的 POST 请求正在被重定向,并且网络服务器正在拒绝重定向的请求。很可能无论网络服务器正在执行重定向,都应该返回 307 或 308(保留请求方法),而不是它当前返回的任何重定向响应代码。

    【讨论】:

    • 这也发生在我身上......这是因为我在 API_URL 中包含了“www”
    【解决方案3】:

    我的问题是 URL 中多了一个斜杠,以前是这样的

    mysite.com/api/v1/question/attend/

    删除斜线后,如​​下所示

    mysite.com/api/v1/question/attend

    【讨论】:

      【解决方案4】:

      您需要在构建请求时设置 call post,如下所示:

        String postBody = "postBody\n";
      
          Request request = new Request.Builder()
              .url("https://api.github.com/markdown/raw")
              .post(RequestBody.create(MEDIA_TYPE_MARKDOWN, postBody))
              .build();
      

      但我明白了,您正在调用 post... 也许 media_type 应该不同。

        public static final MediaType MEDIA_TYPE_MARKDOWN
            = MediaType.parse("text/x-markdown; charset=utf-8");
      

      但你可能需要这个:

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

      【讨论】:

      • 好的,我会试试的... :)
      • MEDIA_TYPE_MARKDOWN 常量是什么?我在哪里可以获得它?
      • 是的,但我应该在两者之间使用什么?我正在使用 JSON MediaType。
      • 看起来图书馆正在根据媒体类型选择使用哪种方法......但它的工作很糟糕。尝试使用降价,看看服务器是否会接受。