2017-07-25 58 views
1

我需要访问其工作原理是这样的API:传递用户名到HTTPGET请求

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(); 

我传递了usernameHttpGet通过添加header这样的:

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

当我运行的代码,我得到这样的回应:(?或者这是否意味着别的东西)HTTP/1.1 401 UNAUTHORIZED

这表明我没有通过usernameHttpGet请求以正确的方式。那么将用户名传递给获取请求的正确方法是什么?

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

说明:usrnamepasswrd我在credentialsProvider中设置了代理验证。它们与HttpGet请求本身无关。我需要通过的令牌与凭证中提供的usrname不同。

+0

调用'setDefaultCredentialsProvider'应该是足够的,假设你的用户名和密码都是正确的。据我所知,'Username'根本不是一个有效的头文件,所以它可能什么都不做。 – VGR

+0

感谢您的评论。我在'credentialsProvider'中设置的'username'和'password'用于代理验证。他们与HttpGet请求本身无关。 @VGR –

回答

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]"。)

+0

感谢您的回答。我试图做你的建议。但我仍然得到同样的“未经授权”的回应。 –

+0

最初我以错误的方式给出了'Authscope'。现在纠正它,它正在工作!非常感谢! :) –

1

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

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

,或者如果您的令牌包含用户和pwd,然后尝试这样说,这:

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

感谢您的回答。我试图在我的代码中使用上面的行,我得到以下错误:'java:找不到符号符号:变量NO_WRAP位置:class jodd.util.Base64'.I尝试删除'Base64.NO_WRAP',但然后我得到'java.lang.ClassNotFoundException:jodd.util.Base64'。我很确定我已经添加了该类的Maven依赖项。我也尝试彻底删除Base64就像这样:'toesGet.addHeader(“授权”,“基本”+“标记:”+“”);'我仍然得到'未经授权'的回应。我没有为标记创建一个变量,直接将它作为字符串输入。 –