使用Spring RestTemplate for Android发出经过身份验证的POST请求

2022-08-31 13:25:38

我有一个RESTful API,我正在尝试通过Android和RestTemplate进行连接。对 API 的所有请求都通过 HTTP 身份验证进行身份验证,方法是设置 HttpEntity 的标头,然后使用 RestTemplate 的方法。exchange()

所有GET请求都以这种方式工作得很好,但我无法弄清楚如何完成经过身份验证的POST请求。 并处理 POST,但没有简单的方法来设置身份验证标头。postForObjectpostForEntity

因此,对于GETs来说,这非常有效:

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

好的找到了答案。 是最好的方法。奇怪的是,该类没有方法(它有),但仍然可以通过构造函数设置请求正文。exchange()HttpEntitysetBody()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);

ResponseEntity<MyModel> response = restTemplate.exchange("/api/url", HttpMethod.POST, httpEntity, MyModel.class);

答案 2

略有不同的方法:

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

推荐