Как опубликовать данные формы с помощью 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";
метод 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 смогите получить, столб, положить, заплата etc..
- HttpEntity requestEntity
- класс responseType / / это ответ от службы