Как сформировать данные POST с помощью Spring RestTemplate?
Я хочу преобразовать следующий (рабочий) фрагмент завивки в вызов RestTemplate:
curl -i -X POST -d "[email protected]" https://app.example.com/hr/email
Как правильно передать параметр электронной почты? Следующий код приводит к ответу 404 Not Found:
String url = "https://app.example.com/hr/email";
Map<String, String> params = new HashMap<String, String>();
params.put("email", "[email protected]");
RestTemplate restTemplate = new RestTemplate();
ResponseEntity<String> response = restTemplate.postForEntity( url, params, String.class );
Я попытался сформулировать правильный вызов в PostMan, и я могу заставить его работать корректно, указав параметр электронной почты как параметр "form-data" в теле. Каков правильный способ достижения этой функциональности в RestTemplate?
Ответы
Ответ 1
Метод 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", "[email protected]");
HttpEntity<MultiValueMap<String, String>> request = new HttpEntity<MultiValueMap<String, String>>(map, headers);
ResponseEntity<String> response = restTemplate.postForEntity( url, request , String.class );
http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/web/client/RestTemplate.html#postForObject-java.lang.String-java.lang.Object-java.lang.Class-java.lang.Object...-
Ответ 2
вот полная программа для вызова POST-отдыха с использованием spring RestTemplate.
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());
}
}
Ответ 3
Как добавить смешанные данные POST: Файл, String [], Строка в одном запросе.
Вы можете использовать только то, что вам нужно.
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
Ответ 4
Ваш URL-адрес Строка требует переменных маркеров для карты, которую вы передаете, например:
String url = "https://app.example.com/hr/email?{email}";
Или вы можете явно запрограммировать параметры запроса в String для начала и не должны передавать карту вообще, например:
String url = "https://app.example.com/hr/[email protected]";
См. также fooobar.com/info/137423/...