Как разместить данные формы с помощью Spring RestTemplate?
Я хочу преобразовать следующий (рабочий) фрагмент curl в вызов RestTemplate:
curl -i -X POST -d "email=first.last@example.com" https://app.example.com/hr/email
Как правильно передать параметр электронной почты? Следующий код приводит к 404 не найден ответ:
String url = "https://app.example.com/hr/email";
Map<String, String> params = new HashMap<String, String>();
params.put("email", "first.last@example.com");
RestTemplate restTemplate = new RestTemplate();
ResponseEntity<String> response = restTemplate.postForEntity( url, params, String.class );
Я попытался сформулировать правильный вызов в PostMan, и я могу заставить его работать правильно, указав параметр электронной почты в качестве параметра "form-data" в теле. Каков правильный способ достижения этой функциональности в RestTemplate?
5 ответов:
метод POST должен быть отправлен по объекту HTTP-запроса. И запрос может содержать либо заголовок HTTP, либо тело HTTP, либо оба.
следовательно, давайте создадим http-объект и отправим заголовки и параметр в теле.
HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED); MultiValueMap<String, String> map= new LinkedMultiValueMap<String, String>(); map.add("email", "first.last@example.com"); HttpEntity<MultiValueMap<String, String>> request = new HttpEntity<MultiValueMap<String, String>>(map, headers); ResponseEntity<String> response = restTemplate.postForEntity( url, request , String.class );
Как разместить смешанные данные: файл, строка[], строка в одном запросе.
Вы можете использовать только то, что вам нужно.
private String doPOST(File file, String[] array, String name) { RestTemplate restTemplate = new RestTemplate(true); //add file LinkedMultiValueMap<String, Object> params = new LinkedMultiValueMap<>(); params.add("file", new FileSystemResource(file)); //add array UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl("https://my_url"); for (String item : array) { builder.queryParam("array", item); } //add some String builder.queryParam("name", name); //another staff String result = ""; HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.MULTIPART_FORM_DATA); HttpEntity<LinkedMultiValueMap<String, Object>> requestEntity = new HttpEntity<>(params, headers); ResponseEntity<String> responseEntity = restTemplate.exchange( builder.build().encode().toUri(), HttpMethod.POST, requestEntity, String.class); HttpStatus statusCode = responseEntity.getStatusCode(); if (statusCode == HttpStatus.ACCEPTED) { result = responseEntity.getBody(); } return result; }
запрос POST будет иметь файл в своем теле и следующую структуру:
POST https://my_url?array=your_value1&array=your_value2&name=bob
вот полная программа для выполнения вызова POST rest с помощью RestTemplate spring.
import java.util.HashMap; import java.util.Map; import org.springframework.http.HttpEntity; import org.springframework.http.ResponseEntity; import org.springframework.util.LinkedMultiValueMap; import org.springframework.util.MultiValueMap; import org.springframework.web.client.RestTemplate; import com.ituple.common.dto.ServiceResponse; public class PostRequestMain { public static void main(String[] args) { // TODO Auto-generated method stub MultiValueMap<String, String> headers = new LinkedMultiValueMap<String, String>(); Map map = new HashMap<String, String>(); map.put("Content-Type", "application/json"); headers.setAll(map); Map req_payload = new HashMap(); req_payload.put("name", "piyush"); HttpEntity<?> request = new HttpEntity<>(req_payload, headers); String url = "http://localhost:8080/xxx/xxx/"; ResponseEntity<?> response = new RestTemplate().postForEntity(url, request, String.class); ServiceResponse entityResponse = (ServiceResponse) response.getBody(); System.out.println(entityResponse.getData()); } }
ваша строка url нуждается в переменных маркерах для карты, которую вы передаете на работу, например:
String url = "https://app.example.com/hr/email?{email}";
или вы можете явно закодировать параметры запроса в строку для начала и не передавать карту вообще, например:
String url = "https://app.example.com/hr/email?email=first.last@example.com";
Смотрите также https://stackoverflow.com/a/47045624/1357094
метод POST должен содержать объект HTTP-запроса, заголовок HTTP.
затем вы должны создать http-объект и отправить заголовки и параметр в теле.
обычно вы можете использовать exchange
method
СRestTemplate
.внутренний механизм обмена приведен ниже:
public <T> ResponseEntity<T> exchange(String url, HttpMethod method, HttpEntity<?> requestEntity, Class<T> responseType, Object... uriVariables) throws RestClientException
он принимает ниже параметры:
- строка url / / URL конечной точки rest
- HttpMethod метод / / It может,пост,ставить,патч и т. д..
- HttpEntity requestEntity
- класс responseType // это ответ от службы