在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

假设我想用Java发出HTTP请求。我想我可以做一些像
新建URL(“http://example.com“”。openConnection()
。看来对于简单的事情我确实可以做到。然而,我已经遇到了两种情况,我不知道如何在不修改全局状态的情况下实现这一点。如果我严重误读了文件,我希望有人能纠正我

  • 假设我想使用HTTP身份验证。我希望能够使用标准的URL语法来处理这样的事情:
    http://user:pass@example.com
    。这似乎不起作用,显然我应该调用
    Authenticator.setDefault
    。如果我控制程序中的所有代码,这是可行的,但完全不适合于通用库代码
  • 假设站点可能会设置cookie。默认情况下,它将进入一个全局进程范围的cookiejar。同样,对于图书馆来说,这是粗鲁的行为。我可以通过调用
    CookieHandler.setDefault
    来更改此行为,但这会再次修改全局状态
  • 我做错了什么

  • 对于基本身份验证,您可以为每个请求设置身份验证标头,首先base64编码
    用户:密码
    字符串,然后将字符串设置为请求标头:

    urlConnection.setRequestProperty(“授权”、“基本”+encodedAuthStr)

  • 对于cookie,您可以将cookie策略设置为临时接受\u NONE,并从响应头获取设置的cookie头,恢复cookie策略,然后使用cookie字符串:

    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请求,则存在竞争条件。