2012-04-27 141 views
34

我有一個RESTful API,我試圖通過Android和RestTemplate進行連接。所有對API的請求都通過HTTP身份驗證進行身份驗證,方法是設置HttpEntity的標題,然後使用RestTemplate的方法exchange()使用Spring RestTemplate進行身份驗證POST請求爲Android

所有的GET請求都以這種方式工作,但我無法弄清楚如何完成已驗證的POST請求。 postForObjectpostForEntity處理POST,但沒有簡單的方法來設置驗證標頭。

所以對於入眼,這個偉大的工程:

HttpAuthentication httpAuthentication = new HttpBasicAuthentication("username", "password"); 
HttpHeaders requestHeaders = new HttpHeaders(); 
requestHeaders.setAuthorization(httpAuthentication); 

HttpEntity<?> httpEntity = new HttpEntity<Object>(requestHeaders); 

MyModel[] models = restTemplate.exchange("/api/url", HttpMethod.GET, httpEntity, MyModel[].class); 

但顯然的POST,因爲它永遠不會發送定製的頭,我不明白如何使用exchange()設置請求主體不exchange()工作。

從RestTemplate進行已驗證POST請求的最簡單方法是什麼?

+1

requestHeaders.setAuthorization(httpAuthentication)..其undefined..no方法如setAuthorization .. – DEADEND 2017-09-12 09:00:24

回答

75

好的找到了答案。 exchange()是最好的方法。奇怪的是HttpEntity類沒有setBody()方法(它有getBody()),但是仍然可以通過構造函數設置請求體。

// Create the request body as a MultiValueMap 
MultiValueMap<String, String> body = new LinkedMultiValueMap<String, String>();  

body.add("field", "value"); 

// Note the body object as first parameter! 
HttpEntity<?> httpEntity = new HttpEntity<Object>(body, requestHeaders); 

MyModel model = restTemplate.exchange("/api/url", HttpMethod.POST, httpEntity, MyModel.class); 
+2

它拋出一個TypeMismatch錯誤 類型不匹配:不能從ResponseEntity 轉換爲MyModel .. 我想這應該是 ResponseEntity 模型= restTemplate.exchange( 「/ API/URL」,HttpMethod.POST,httpEntity,MyModel.class); – Sid 2016-04-07 10:19:20

+0

'MyModel myModel = restTemplate.exchange(completeServiceUrl,HttpMethod.GET,request,MyModel.class).getBody()'將幫助解決您提到的問題 – Isank 2017-08-31 16:07:41

+0

謝謝。這耗費了我兩個小時,直到我偶然發現你的帖子。 – guenhter 2018-01-08 15:26:50

7

非常有用的 我有一個稍微不同的情景,我請求XML本身就是該職位的身體,而不是設置了一個param。爲此,可以使用下面的代碼 - 發佈作爲答案,以防其他有類似問題的人受益。

final HttpHeaders headers = new HttpHeaders(); 
    headers.add("header1", "9998"); 
    headers.add("username", "xxxxx"); 
    headers.add("password", "xxxxx"); 
    headers.add("header2", "yyyyyy"); 
    headers.add("header3", "zzzzz"); 
    headers.setContentType(MediaType.APPLICATION_XML); 
    headers.setAccept(Arrays.asList(MediaType.APPLICATION_XML)); 
    final HttpEntity<MyXmlbeansRequestDocument> httpEntity = new HttpEntity<MyXmlbeansRequestDocument>(
      MyXmlbeansRequestDocument.Factory.parse(request), headers); 
    final ResponseEntity<MyXmlbeansResponseDocument> responseEntity = restTemplate.exchange(url, HttpMethod.POST, httpEntity,MyXmlbeansResponseDocument.class); 
    log.info(responseEntity.getBody()); 
14

略有不同的方法:

MultiValueMap<String, String> headers = new LinkedMultiValueMap<String, String>(); 
headers.add("HeaderName", "value"); 
headers.add("Content-Type", "application/json"); 

RestTemplate restTemplate = new RestTemplate(); 
restTemplate.getMessageConverters().add(new MappingJackson2HttpMessageConverter()); 

HttpEntity<ObjectToPass> request = new HttpEntity<ObjectToPass>(objectToPass, headers); 

restTemplate.postForObject(url, request, ClassWhateverYourControllerReturns.class); 
+2

ObjectToPass從何而來 – 2016-10-18 09:53:11

+0

@Ismail Iqbal - 它可以是任何需要傳遞的信息的對象(例如私人人員john = Person(「John」,24);)。它將被轉換爲json有效載荷並通過請求主體發送到服務器 – Andrey 2016-10-18 10:38:20

7

我最近處理的時候,我試圖同時使從Java中的REST調用來獲取過去的認證的問題,而在這個線程的答案(和其他線程)的幫助下,仍然有一些試驗和錯誤涉及到它的工作。

對我來說有效的是在Base64中編碼憑證並將它們添加爲基本授權標頭。然後我將它們添加爲HttpEntityrestTemplate.postForEntity,這給了我需要的響應。

這是我在全本寫的類(擴展RestTemplate):

public class AuthorizedRestTemplate extends RestTemplate{ 

    private String username; 
    private String password; 

    public AuthorizedRestTemplate(String username, String password){ 
     this.username = username; 
     this.password = password; 
    } 

    public String getForObject(String url, Object... urlVariables){ 
     return authorizedRestCall(this, url, urlVariables); 
    } 

    private String authorizedRestCall(RestTemplate restTemplate, 
      String url, Object... urlVariables){ 
     HttpEntity<String> request = getRequest(); 
     ResponseEntity<String> entity = restTemplate.postForEntity(url, 
       request, String.class, urlVariables); 
     return entity.getBody(); 
    } 

    private HttpEntity<String> getRequest(){ 
     HttpHeaders headers = new HttpHeaders(); 
     headers.add("Authorization", "Basic " + getBase64Credentials()); 
     return new HttpEntity<String>(headers); 
    } 

    private String getBase64Credentials(){ 
     String plainCreds = username + ":" + password; 
     byte[] plainCredsBytes = plainCreds.getBytes(); 
     byte[] base64CredsBytes = Base64.encodeBase64(plainCredsBytes); 
     return new String(base64CredsBytes); 
    } 
} 
相關問題