我正在使用okhttp(4.4.0)Java库将发布请求发送到我创建的Web服务。 此外,该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未实现状态消息。 但是,当我执行请求后,不应调用doGet方法。
通过查看我的Web服务器的访问日志,我发现了以下内容:
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
因此,既有发布请求,也有获取请求。 似乎首先尝试发送帖子正文(不进行身份验证?),然后尝试通过身份验证获取get请求,但我的网络服务拒绝了该请求。
有什么办法可以帮助我完成这项工作吗?我想念什么吗?请帮忙!
答案 0 :(得分:1)
所以看来我解决了自己的问题。感谢@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客户端似乎在此苦苦挣扎。
答案 1 :(得分:0)
您的服务器应返回401质询,以使客户端进行身份验证。但是由于某种原因发送了302。是否设置了具有自定义登录页面的浏览器中的用户重定向功能?