Java 将用户名传递给HttpGet请求
我需要访问一个API,其工作原理如下:Java 将用户名传递给HttpGet请求,java,http,http-headers,http-get,Java,Http,Http Headers,Http Get,我需要访问一个API,其工作原理如下: curl https://api.com/ratings/v1/ -u [your token here]: toesGet.addHeader("Username", "[your token here]"); 令牌是应传递给HttpGet请求的用户名。我正在尝试使用java以以下方式执行相同的操作: CredentialsProvider credentialsProvider = new BasicCredentialsProvider(); c
curl https://api.com/ratings/v1/ -u [your token here]:
toesGet.addHeader("Username", "[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();
我通过添加标题将用户名
传递给HttpGet
,如下所示:
curl https://api.com/ratings/v1/ -u [your token here]:
toesGet.addHeader("Username", "[your token here]");
当我运行代码时,我得到以下响应:HTTP/1.1
这表明我没有以正确的方式将username
传递给HttpGet
请求(或者这是否意味着其他什么?)。那么,将用户名传递给get请求的正确方法是什么
任何帮助都将不胜感激,谢谢
注意:凭证提供程序中设置的usrname
和passwrd
用于代理身份验证。它们与HttpGet请求本身无关。我需要传递的令牌与凭据中提供的usrname
不同。我想,您的服务器使用基本身份验证,然后您需要添加“Authorization”头而不是“Username”:
或者,如果您的令牌包含user和pwd,则可以这样尝试:
String token = "[your token here]";
toesGet.addHeader("Authorization", "Basic " + Base64.encodeToString(token.getBytes(), Base64.NO_WRAP));
我没有使用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的正确用户和密码替换它们。(我指出这一点是因为,根据你问题中的代码,我不确定你是否理解不应该使用文本字符串“[你的令牌在这里]”
)调用setDefaultCredentialsProvider
就足够了,假设你的用户名和密码是正确的。据我所知,Username
根本不是一个有效的标题,所以它可能什么都没做。谢谢你的评论。在credentialsProvider
中设置的用户名
和密码
用于代理身份验证。它们与HttpGet请求本身无关@谢谢你的回答。我试图在我的代码中使用上述行,但我得到了以下错误:java:找不到符号符号:变量NO\u WRAP location:class jodd.util.Base64
。我试图删除Base64.NO\u WRAP
,但我得到了java.lang.ClassNotFoundException:jodd.util.Base64
。我非常确定我已经为该类添加了maven依赖项。我还尝试像这样完全删除Base64:toesGet.addHeader(“授权”,“基本”+”标记“+”)代码>我仍然得到未经授权的响应。我没有为令牌创建变量,直接以字符串形式输入。谢谢您的回答。我试着按照你的建议去做。但是我仍然得到了相同的未经授权的响应。最初我以错误的方式给出了Authscope
。现在更正它,它正在工作!非常感谢!:)