2017-03-11 56 views
1

我使用下面通過RestTemplate在春季4檢索JSON:春RestTemplate收到「401未授權」

protected DocInfoResponse retrieveData(String urlWithAuth) { 
    RestTemplate restTemplate = new RestTemplate(); 
    HttpHeaders headers = new HttpHeaders(); 
    headers.add("Authorization", "Basic " + auth.getSig()); 
    HttpEntity<String> request = new HttpEntity<String>(headers); 
    ResponseEntity<DocInfoResponse> response = restTemplate.exchange(urlWithAuth, HttpMethod.GET, request, DocInfoResponse.class); 
    return response.getBody(); 
} 

我使用相同的代碼(具有不同響應等級)成功地得到了一個JSON文檔同一網站(使用不同的參數獲取不同的文檔)。

當我執行上面的代碼,我收到下面的堆棧跟蹤(部分):

Caused by: org.springframework.web.client.HttpClientErrorException: 401 Unauthorized 
at 
org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:91) ~[spring-web-4.3.7.RELEASE.jar:4.3.7.RELEASE] 

任何人都可以點我,爲什麼這可能是接收例外呢?

+0

您是否嘗試過從瀏覽器或郵遞員訪問相同內容?它是否使用此身份驗證在那裏工作? – Coder

+0

是的,我已經獲得了相同的URL以成功返回瀏覽器中的預期結果。 – Squigglylot

+0

它肯定是一個身份驗證問題。您是否生成用於身份驗證的數字簽名?簽名URL是特定的嗎? – Coder

回答

0

我發現上面最初發布的問題是由於在auth params上發生了雙重加密。我通過使用UriComponentsBuilder並明確地在exchange()上調用encode()來解決它。

SyncResponse retrieveData(UriComponentsBuilder builder) { 
    RestTemplate restTemplate = new RestTemplate(); 
    HttpHeaders headers = new HttpHeaders(); 
    headers.set("Accept", MediaType.APPLICATION_JSON_VALUE); 
    HttpEntity<String> request = new HttpEntity<String>(headers); 
    ResponseEntity<SyncResponse> response = restTemplate.exchange(builder.build().encode().toUri(), HttpMethod.GET, request, SyncResponse.class); 
    return response.getBody(); 
} 

UriComponentsBuilder使用建:

UriComponentsBuilder buildUrl(String urlString) { 
    UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(urlString); 

    return auth.appendAuth(builder); 
} 

(該auth.appendAuth()增加在urlString由目標服務需要額外.queryParams()。)

的調用來執行,這是retrieveData(buildUrl(urlString));

0

在調查了我自己的問題之後,我意識到FireFox RESTClient成功了,因爲我已連接到目標URL。畢竟,我認爲我使用的基本認證並不那麼基礎。

最後,我讀了我試圖連接的應用程序的文檔,並意識到他們提出了連接令牌機制。現在它可以工作。

看完你的代碼後,我說它看起來相當不錯,雖然我不確定你的對象auth你叫getSig。首先要做的是:嘗試從任何客戶端訪問您的服務,如Web瀏覽器,PostMan或RESTClient。確保你沒有連接到你的應用程序成功檢索你的信息!

根據結果,我說你應該嘗試手動加密你的Authorization標記(你會很容易在這個網站上找到帖子向你展示如何)或嘗試另一種連接機制。

+0

在我的情況下,授權字符串被雙重加密。 我使用'UriComponentsBuilder'來解決這個問題。 – Squigglylot

+0

很高興這有幫助!你的問題也有幫助:) – avi613