繁体   English   中英

带身份验证的 okhttp 发布请求

[英]okhttp post request with authentication

我正在使用 okhttp (4.4.0) java 库向我创建的 web 服务发送 post 请求。 此外,该 Web 服务需要基本身份验证,并且只接受后请求。 Web 服务位于一个代理之后,该代理只是将 https 请求转发到端口 8080 上的 http 请求。我的代码如下所示:

    ...
    RequestBody formBody = new FormBody.Builder()
                        .add("foo", this.foo)
                        .add("bar", this.bar)
                        .build();

    Request request = new Request.Builder()
                        .url("https://localhost/myWebApp")
                        .addHeader("User-Agent", "OkHttp Bot")
                        .addHeader("Authorization", Credentials.basic("myUser", "myPwd"))
                        .post(formBody)
                        .build();
    try (Response response = client.newCall(request).execute()) {
      if (!response.isSuccessful()) {
        throw new IOException("Unexpected code " + response);
      }
      return response.body().bytes();
    } catch (IOException e) {
      e.printStackTrace();
    }
    ...

请求失败并出现以下错误:

Unexpected code Response{protocol=http/1.1, code=501, message=Not Implemented, url=https://localhost/myWebApp/}

Web 服务的“myWebApp”doGet 方法被配置为发送 501 未实现状态消息。 但是当我做一个 post-request 时,doGet 方法不应该被调用。

通过查看我的网络服务器的访问日志,我发现了以下内容:

    127.0.0.1 - - [30/Mar/2020:09:05:24 +0200] "POST /myWebApp HTTP/1.1" 302 -
    127.0.0.1 - myUser [30/Mar/2020:09:05:25 +0200] "GET /myWebApp/ HTTP/1.1" 501 1029

所以有一个post请求和一个get请求。 看起来首先尝试发送帖子正文(未经身份验证?),然后是带有身份验证的 get 请求,但我的 Web 服务拒绝了该请求。

有没有办法让这对我有用? 我错过了什么吗? 请帮忙!

所以看来我解决了我自己的问题。 感谢@Yuri 指出我在那里。 我只是在我的代码中的 url 末尾添加了一个“/”,它就像一个魅力。

...
 Request request = new Request.Builder()
                        .url("https://localhost/myWebApp/")
                        .addHeader("User-Agent", "OkHttp Bot")
                        .addHeader("Authorization", Credentials.basic("myUser", "myPwd"))
                        .post(formBody)
                        .build();
...

出于某种原因(我还不知道,但也许其他人可以启发我)任何没有尾部斜杠的给定 url 都被重定向到带有尾部斜杠的同一个 url。 标准浏览器可以处理这种情况,okhttp 客户端似乎在那里挣扎。

您的服务器应返回 401 质询以供客户端进行身份验证。 但是由于某种原因正在发送 302。 是否设置为在具有自定义登录页面的浏览器中为用户重定向?

https://github.com/square/okhttp/blob/master/samples/guide/src/main/java/okhttp3/recipes/Authenticate.java

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM