Я создаю REST API с использованием Java и Spring, и мне нужно обработать запрос POST в моем контроллере, но мне нужно извлечь тело из этого запроса, который является JSON, а также «источником» этого запроса,
@RequestMapping(value = "/create", method = RequestMethod.POST)
public XXX createMyObject(@RequestBody String data, YYY){
MyObject mo = new MyObject();
mo.setData = data;
mo.setOrigin = yyy;
myRepository.save(mo);
return XXX;
}
У меня есть несколько вопросов: во-первых, как я могу получить источник этого запроса (который, я думаю, является URL-адресом, который перемещается в заголовке?), Есть ли для этого аннотация, аналогичная @RequestBody ?.
Мой второй вопрос заключается в том, что обычно является правильным объектом, который следует возвращать в таких методах публикации в качестве ответа.




Вы должны иметь возможность получать заголовки и uris из объекта HttpServletRequest.
public XXX createMyObject(@RequestBody String data, HttpServletRequest request)
Что касается ответа, я бы сказал return String, который будет именем представления, которому вы можете передать некоторые атрибуты, говорящие, что операция была успешной или нет, или ModelAndView.
Чтобы ответить на ваши вопросы:
Если вы включите HttpServletRequest в параметры вашего метода, вы сможете получить информацию о происхождении оттуда. например.
public XXX createMyObject(@Requestbody String data, HttpServletRequest request) {
String origin = request.getHeader(HttpHeaders.ORIGIN);
//rest of code...
}
Для остальных ответов вам нужно будет вернуть представление объекта (json) или HttpStatus, чтобы уведомить клиентов, был ли вызов успешным или нет. например
Return ResponseEntity<>(HttpStatus.ok);
Попробуй это:
@RequestMapping(value = "/create", method = RequestMethod.POST)
public XXX createMyObject(HttpServletRequest request, @RequestBody String body) {
String origin = URI.create(request.getRequestURL().toString()).getHost();
System.out.println("Body: " + body + " Origin:" + origin);
return XXX;
}
Разве URL-адрес запроса не отличается от заголовка HTTP origin? Один должен быть адресом отправителя запроса, другой - доменом веб-сайта, который инициирует запрос?
@Autowired частный HttpServletRequest servletRequest;
Вы можете объявить объект запроса, а затем получить доступ к методу для получения Uri
Вы даже можете использовать константу
HttpHeaders.ORIGIN.