2017-07-25 60 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(「授權」,「基本」+「標記:」+「」);'我仍然得到'未經授權'的迴應。我沒有爲標記創建一個變量,直接將它作爲字符串輸入。 –