java - 带身份验证的 okhttp post 请求

标签 java post okhttp http-authentication

我正在使用 okhttp (4.4.0) java 库向我创建的 web 服务发送 post 请求。 此外,该网络服务需要基本身份验证,并且仅接受后期请求。 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();
    }
    ...

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

意外代码响应{protocol=http/1.1, code=501, message=Not Implemented, url=https://localhost/myWebApp/}

Web 服务的“myWebApp”doGet 方法配置为发送 501 未实现状态消息。 但当我执行后请求时,不应调用 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请求。 看起来首先是尝试发送帖子正文(没有身份验证?),然后是带有身份验证的获取请求,但我的网络服务拒绝了该请求。

有什么办法可以让这个工作适合我吗?我错过了什么吗?请帮忙!

最佳答案

看来我解决了我自己的问题。感谢@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();
...

由于某种原因(我还不知道,但也许其他人可以启发我)任何没有尾部斜杠的给定网址都会被重定向到带有尾部斜杠的相同网址。 标准浏览器可以处理这种情况,okhttp 客户端似乎在这方面很困难。

关于java - 带身份验证的 okhttp post 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60926594/

相关文章:

java - 从 Maven 资源文件夹获取正确的文件路径 - iText

php - Ajax 和 Google 图书

带 header 的 Ruby https POST

android - 改造 - 是否可以避免从应用程序拦截器调用实际 api 并返回硬编码响应?

java - Let's Encrypt + Hitch : Android OkHttp java. security.cert.CertPathValidatorException: 响应不可靠:它的有效期间隔已过期

java - 使用 PowerMockito 验证调用最终类上的私有(private)静态方法

java - 在 JPA 环境中声明 Hibernate 事件监听器

java - 改进 ngram 生成的方法?

javascript - 如何将原始数据主体添加到 axios 请求?

java - Android 确保 HTTP 响应到达