okhttp post 请求认证
okhttp post request with authentication
我正在使用 okhttp (4.4.0) java 库向我创建的网络服务发送 post 请求。
此外,该网络服务需要基本身份验证,并且只接受 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();
}
...
请求失败并出现以下错误:
Unexpected code Response{protocol=http/1.1, code=501, message=Not Implemented, url=https://localhost/myWebApp/}
Web 服务的 'myWebApp' doGet 方法配置为发送 501 未实现状态消息。
但是当我执行 post 请求时,不应调用 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请求。
看起来首先尝试发送 post 正文(没有身份验证?),然后是一个带有身份验证的获取请求,但被我的网络服务拒绝了。
有什么办法可以让我用这个吗?我错过了什么吗?请帮忙!
您的服务器应该 return 一个 401 质询,以便客户端进行身份验证。但是由于某种原因正在发送 302。是否设置为在具有自定义登录页面的浏览器中为用户重定向?
看来我解决了我自己的问题。感谢@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 客户端似乎在那里挣扎。
我正在使用 okhttp (4.4.0) java 库向我创建的网络服务发送 post 请求。 此外,该网络服务需要基本身份验证,并且只接受 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();
}
...
请求失败并出现以下错误:
Unexpected code Response{protocol=http/1.1, code=501, message=Not Implemented, url=https://localhost/myWebApp/}
Web 服务的 'myWebApp' doGet 方法配置为发送 501 未实现状态消息。 但是当我执行 post 请求时,不应调用 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请求。 看起来首先尝试发送 post 正文(没有身份验证?),然后是一个带有身份验证的获取请求,但被我的网络服务拒绝了。
有什么办法可以让我用这个吗?我错过了什么吗?请帮忙!
您的服务器应该 return 一个 401 质询,以便客户端进行身份验证。但是由于某种原因正在发送 302。是否设置为在具有自定义登录页面的浏览器中为用户重定向?
看来我解决了我自己的问题。感谢@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 客户端似乎在那里挣扎。