在Java中发出http请求而不修改全局状态
假设我想用Java发出HTTP请求。我想我可以做一些像在Java中发出http请求而不修改全局状态,java,http,url,cookies,http-authentication,Java,Http,Url,Cookies,Http Authentication,假设我想用Java发出HTTP请求。我想我可以做一些像新建URL(“http://example.com“”。openConnection()。看来对于简单的事情我确实可以做到。然而,我已经遇到了两种情况,我不知道如何在不修改全局状态的情况下实现这一点。如果我严重误读了文件,我希望有人能纠正我 假设我想使用HTTP身份验证。我希望能够使用标准的URL语法来处理这样的事情:http://user:pass@example.com。这似乎不起作用,显然我应该调用Authenticator.setDe
新建URL(“http://example.com“”。openConnection()
。看来对于简单的事情我确实可以做到。然而,我已经遇到了两种情况,我不知道如何在不修改全局状态的情况下实现这一点。如果我严重误读了文件,我希望有人能纠正我
http://user:pass@example.com
。这似乎不起作用,显然我应该调用Authenticator.setDefault
。如果我控制程序中的所有代码,这是可行的,但完全不适合于通用库代码CookieHandler.setDefault
来更改此行为,但这会再次修改全局状态用户:密码
字符串,然后将字符串设置为请求标头:
urlConnection.setRequestProperty(“授权”、“基本”+encodedAuthStr)代码>
urlConnection.setRequestProperty(“Cookie”,cookieStr)代码>
你没有做错什么。您在JRE中至少遇到了一个设计错误。我从未理解过
验证器的设计。您应该能够为每个HttpURLConnection
提供一个。另一方面,在我看来,一个全局cookie罐是必不可少的,因为cookies的寿命超过了连接。是的,cookies的寿命超过了连接。处理这个问题的一种方法是为每个请求显式地传递一个cookie jar。处理什么?Cookie应该比连接寿命长。它们没有其他用途。是的,Cookie应该比连接寿命长。这并不意味着Cookie必须可用于进程发出的每个HTTP请求。考虑命令行工具<代码>卷曲< /代码>。它接受两个与cookie相关的命令行参数。(嗯,也许更多,但两个与我的观点相关。)特别是,它需要两个文件名。第一个文件是一个已填充的cookie jar,其中包含可能随当前请求一起发送的cookie。如果远程服务器尝试设置任何cookie,它们将保存在第二个文件中。Java可以使用类似的设计,或者再举一个例子,以Perl的HTTP::Tiny
为例。它显式地将cookie jar作为参数。不过,我现在不再唠叨了。我投你赞成票,也许我应该接受这个答案,因为它比我预期的要好。事实上,对于auth来说,这是一个完整的解决方案,尽管不必要的尴尬(这应该是库的工作!为什么我必须知道什么需要base64和什么需要百分比转义!?)。但对于饼干来说,这不行,原因有二。显而易见的一点是:“恢复”旧政策如何?我不知道那是什么,也没办法知道。它可能不是默认值!微妙的原因是,如果其他人从另一个线程发出HTTP请求,则存在竞争条件。