【问题标题】:HttpUrlConnection authentication not workingHttpUrlConnection 身份验证不起作用
【发布时间】:2015-10-07 04:03:56
【问题描述】:

这是我尝试复制的 curl 命令:

以下是 curl 请求。

    curl user:password@localhost:8080/foo/bar -d property_one=value_one -d property_two=value_two -d property_three=value_three

这里是httpurlconnection的代码

    URL thisurl = new URL ("http://localhost:8080/foo");
    String encoding = Base64Encoder.base64Encode("user:password");

    HttpURLConnection connection = (HttpURLConnection) thisurl.openConnection();
    connection.setRequestMethod("GET");
    connection.setDoOutput(true);
    connection.addRequestProperty("property_one", "value_one");
    connection.addRequestProperty("property_two", "value_two");
    connection.addRequestProperty("property_three", "property_three");
    connection.setRequestProperty  ("Authorization", "Basic " + encoding);
    InputStream content = (InputStream)connection.getInputStream();

在 connection.getInputStream() 行我收到 401 错误。我是不是做错了身份验证?

【问题讨论】:

  • 不知道这是否重要,但您的网址不同。
  • 你试过没有connection.setDoOutput(true);吗?获取请求不允许输出。
  • 1) cURL 请求是一个POST 请求。任何带有-d 的请求都将隐含地生成POST。 2) 数据应该在请求正文中作为 url 编码的表单参数发送,而不是在请求属性中。 3) Content-Type 标头在 cURL 请求中隐式设置为 application/x-www-form-urlencoded。你应该在 Java 代码中做同样的事情。

标签: java curl httpurlconnection


【解决方案1】:
connection.setRequestMethod("GET");

在这里,您将方法设置为“GET”,这与您在 curl 中使用的相同。

connection.setDoOutput(true);

在这里,您将其隐式设置为“POST”,这是不一样的,因此您没有任何理由期待相同的结果。

不要手动进行所有这些身份验证。使用java.net.Authenticator. 这就是它的用途。

【讨论】:

    【解决方案2】:

    401 error 因为关闭了用户身份验证。您可能没有正确编码身份验证标头。使用此代码对我有用。您可以在此处获取详细信息here

     URL url = new URL ("http://localhost:8080/foo");
     String encoding = org.apache.catalina.util.Base64.encode(credentials.getBytes("UTF-8"));
    
    URLConnection uc = url.openConnection();
    uc.setRequestProperty("Authorization", String.format("Basic %s", encoding));
    

    【讨论】:

      猜你喜欢
      • 2012-10-04
      • 1970-01-01
      • 2012-04-29
      • 2012-03-18
      • 2011-07-05
      • 2013-12-02
      • 2013-06-29
      相关资源
      最近更新 更多