Как вы можете передать массив в POST с Spring RestTemplate?
У меня возникают трудности при передаче массива в POST с использованием Spring RestTemplate. Вот мой код, который я использую:
Я называю RestTemplate здесь:
private static void sendEntries() {
RestTemplate restTemplate = new RestTemplate();
String uri = "http://localhost:8080/api/log/list.json";
// Both LogEntry and ExceptionEntry extend Entry
LogEntry entry1 = new LogEntry();
ExceptionException entry2 = new ExceptionEntry();
Entry[] entries = {entry1, entry2};
entries = restTemplate.postForObject(uri, entries, Entry[].class);
System.out.println(new Gson().toJson(entries));
}
И Контроллер содержит:
@RequestMapping(value = "api/log/list", method = RequestMethod.POST)
public @ResponseBody Entry[] saveList(@RequestBody Entry[] entries) {
for (Entry entry : entries) {
entry = save(entry);
}
return entries;
}
Это приводит к:
org.springframework.web.client.HttpClientErrorException: 400 Bad Request
Не похоже, что массив добавляется в запрос. Все остальные запросы POST работают, когда я не пытаюсь передать массив. Я просто не уверен, что мне нужно сделать, чтобы массив прошел должным образом.
Это правильный способ сделать это? Можно ли вместо этого передать коллекцию?
3 ответа
Вы можете проверить это сообщение: Как передать массив List или String в getForObject с помощью Spring RestTemplate, решение для этого сообщения:
Список или другой тип объектов можно публиковать с помощью метода postForObject RestTemplate. Мое решение, как показано ниже:
контроллер:
@RequestMapping(value="/getLocationInformations", method=RequestMethod.POST)
@ResponseBody
public LocationInfoObject getLocationInformations(@RequestBody RequestObject requestObject)
{
// code block
}
Создайте объект запроса для публикации в сервисе:
public class RequestObject implements Serializable
{
public List<Point> pointList = null;
}
public class Point
{
public Float latitude = null;
public Float longitude = null;
}
Создайте объект ответа для получения значений из сервиса:
public class ResponseObject implements Serializable
{
public Boolean success = false;
public Integer statusCode = null;
public String status = null;
public LocationInfoObject locationInfo = null;
}
Разместите список точек с объектом запроса и получите объект ответа от сервиса:
String apiUrl = "http://api.website.com/service/getLocationInformations";
RequestObject requestObject = new RequestObject();
// create pointList and add to requestObject
requestObject.setPointList(pointList);
RestTemplate restTemplate = new RestTemplate();
ResponseObject response = restTemplate.postForObject(apiUrl, requestObject, ResponseObject.class);
// response.getSuccess(), response.getStatusCode(), response.getStatus(), response.getLocationInfo() can be used
Как разместить массив:
private String doPOST(String[] array) {
RestTemplate restTemplate = new RestTemplate(true);
//add array
UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl("https://my_url");
for (String item : array) {
builder.queryParam("array", item);
}
//another staff
String result = "";
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.MULTIPART_FORM_DATA);
HttpEntity<LinkedMultiValueMap<String, Object>> requestEntity =
new HttpEntity<>(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
На стороне сервера:
public class MyServlet extends HttpServlet {
@Override
public void doPost(HttpServletRequest req, HttpServletResponse response) {
try {
String[] array = req.getParameterValues("array");
String result = doStaff(array);
response.getWriter().write(result);
response.setStatus(HttpServletResponse.SC_ACCEPTED);
} catch (Exception e) {
response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
}
}
}
Попробуйте этот пример
Измените сопоставление вашего запроса с
@RequestMapping(value = "/train", method = RequestMethod.POST)
в
@RequestMapping(value = "/train/{category}/{positiveDocId[]}/{negativeDocId[]}", method = RequestMethod.GET)
и ваш URL в restTemplate
изменить URl в приведенном ниже формате
http://localhost:8080/admin/train/category/1,2,3,4,5/6,7,8,9