【问题标题】:Passing username to a HttpGet request将用户名传递给 HttpGet 请求
【发布时间】:2017-12-31 15:51:08
【问题描述】:

我需要访问一个像这样工作的 API:

curl https://api.com/ratings/v1/ -u [your token here]:

令牌是应该传递给HttpGet 请求的用户名。我正在尝试使用 java 以下列方式做同样的事情:

CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials("usrname", "passwrd"));
HttpHost proxy = new HttpHost("proxy.com", 8080, "http");
HttpClient httpClient = HttpClients.custom().setProxy(proxy).setDefaultCredentialsProvider(credentialsProvider).build();

HttpGet toesGet = new HttpGet("https://api.com/ratings/v1/");

    toesGet.setHeader("Accept", "Application/Json");
    toesGet.addHeader("Username", "[your token here]");

    try {
        HttpResponse toes = httpClient.execute(toesGet);
        System.out.println(toes.getStatusLine());
        System.out.println(toes.getEntity().toString());

    } catch (Exception e) {
        e.printStackTrace();
    }

我是后台代理,因此我正在创建一个带有代理详细信息的HttpHost,为HttpClient 对象设置代理,并在以下代码行中使用credentialsProvider 传递代理身份验证凭据:

HttpHost proxy = new HttpHost("proxy.com", 8080, "http");
HttpClient httpClient = HttpClients.custom().setProxy(proxy).setDefaultCredentialsProvider(credentialsProvider).build();

我通过像这样添加headerusername 传递给HttpGet

toesGet.addHeader("Username", "[your token here]");

当我运行代码时,我得到这个响应:HTTP/1.1 401 UNAUTHORIZED

这表明我没有以正确的方式将username 传递给HttpGet 请求(或者这是否意味着别的?)。那么将用户名传递给get请求的正确方法是什么?

任何帮助将不胜感激,谢谢!

注意:我在credentialsProvider中设置的usrnamepasswrd是用于代理认证的。它们与 HttpGet 请求本身无关。我需要传递的令牌与凭据中提供的usrname 不同。

【问题讨论】:

  • 调用setDefaultCredentialsProvider 就足够了,假设您的用户名和密码正确。据我所知,Username 根本不是一个有效的标头,所以它可能什么也没做。
  • 感谢您的评论。我在credentialsProvider中设置的usernamepassword用于代理认证。它们与 HttpGet 请求本身无关。 @VGR

标签: java http http-headers http-get


【解决方案1】:

我没有使用过 Apache HttpComponents,但我的理解是你必须为特定主机设置凭据:

CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
HttpHost proxy = new HttpHost("proxy.com", 8080, "http");
credentialsProvider.setCredentials(new AuthScope(proxy),
    new UsernamePasswordCredentials("usrname", "passwrd"));
credentialsProvider.setCredentials(new AuthScope("api.com", AuthScope.ANY_PORT),
    new UsernamePasswordCredentials("apiuser", "apipassword"));

注意:实际上不要在代码中输入“apiuser”或“apipassword”。我仅将它们显示为占位符。用正确的用户名和密码替换它们以访问 api.com。 (我指出这一点是因为,根据您问题中的代码,我不确定您是否理解您不应该使用文字字符串 "[your token here]"。)

【讨论】:

  • 感谢您的回答。我试着按照你的建议去做。但我仍然得到相同的unauthorized 响应。
  • 最初我以错误的方式提供Authscope。现在纠正它,它正在工作!非常感谢! :)
【解决方案2】:

我猜,您的服务器使用基本身份验证,那么您需要添加“授权”标头而不是“用户名”:

String user = "[your token here]";
String pwd = ""; // blank
toesGet.addHeader("Authorization", "Basic " + Base64.encodeToString((user + ":" + pwd).getBytes(), Base64.NO_WRAP));

或者如果你的令牌包含用户和密码,那么试试这样:

String token = "[your token here]";
toesGet.addHeader("Authorization", "Basic " + Base64.encodeToString(token.getBytes(), Base64.NO_WRAP));

【讨论】:

  • 感谢您的回答。我尝试在我的代码中使用上述行,但出现以下错误:java: cannot find symbol symbol: variable NO_WRAP location: class jodd.util.Base64。我尝试删除Base64.NO_WRAP,但后来我得到java.lang.ClassNotFoundException: jodd.util.Base64。我很确定我已经为该类添加了 Maven 依赖项。我还尝试完全删除 Base64 像这样:toesGet.addHeader("Authorization", "Basic " + "token:"+"");,我仍然得到unauthorized 响应。我没有为token创建变量,直接输入为字符串。
猜你喜欢
  • 2013-06-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-16
  • 2014-08-02
  • 2017-02-25
  • 2010-12-30
相关资源
最近更新 更多