Прежде чем вдаваться в подробности, я знаю, что в Stackoverflow было много разговоров и связанных вопросов. Все они мне помогают по-разному, поэтому я думал, что все свои выводы я собрал в виде единого организованного FAQ, чтобы обобщить мои выводы.
Понятия, связанные с данным
Конечно, вы знаете об этом, но я просто пишу их как быстрый обзор. Не стесняйтесь редактировать, если я что-то не хватает.
Запрос HTTP POST:
Пост-запрос используется, когда вы хотите отправить объект в веб-службу или на серверное приложение.
Сериализация:
Является процессом получения объекта из вашего веб-браузера до вашего приложения на стороне сервера. Можно использовать вызов jQuery Ajax или запрос на публикацию Curl.
Протоколы сериализации:
Наиболее популярными тезисами являются JSON и XML. XML становится менее популярным, поскольку сериализованные объекты xml относительно большие по размеру из-за характера тегов XML. В этом FAQ основное внимание уделяется сериализации JSON2.
Spring:
Spring и его мощная аннотация позволяет эффективно публиковать веб-службу. В Spring существует множество разных библиотек. Здесь мы сосредоточены на Spring веб-MVC.
Curl vs JQuery:
Это инструменты, которые вы можете использовать для создания почтового запроса на своей стороне клиента. Даже если вы планируете использовать JQuery ajax-вызов, я предлагаю вам использовать Curl для целей отладки, так как он предоставляет вам подробный ответ после создания запроса на отправку.
@RequestBody vs @RequestParam/@PathVariable vs @ModelAttribute:
В случаях, когда у вас есть веб-сервис, который не зависит от вашей модели Java EE, необходимо использовать @RequestBody. Если вы используете модель и ваш объект JSON добавлен в модель, вы можете получить доступ к объекту через @ModelAttribute. Только в тех случаях, когда ваш запрос является либо запросом GET, либо комбинацией запросов GET и POST, вам нужно будет использовать @RequestParam/@PathVariable.
@RequestBody vs @ResposeBody:
Как вы можете видеть из имени, это так просто, вам нужно только @ResponseBody, если вы отправляете ответ, после того, как клиентский метод обработал запрос.
RequestMappingHandlerAdapter vs AnnotationMethodHandlerAdapter:
RequestMappingHandlerAdapter - это новый обработчик сопоставления для фрейма Spring, который заменил AnnotationMethodHandlerAdapter с Spring 3.1. Если ваша существующая конфигурация все еще находится в AnnotationMethodHandlerAdapter, вы можете найти это сообщение полезным. Конфигурация, предоставленная в моем сообщении, даст вам представление о том, как настроить RequestMappingHandlerAdapter.
Настройка
Вам нужно будет настроить конвертер сообщений. Таким образом, ваше сериализованное тело сообщения JSON преобразуется в локальный объект Java на стороне вашего сервера.
Базовая конфигурация здесь. Преобразователями были MarshallingHttpMessageConverter и CastorMarshaller в базовом образце конфигурации, я заменил их MappingJackson2HttpMessageConverter и MappingJacksonHttpMessageConverter.
Где разместить конфигурацию
Как мой проект настроен, у меня есть два файла конфигурации:
- Контекст приложения XML: Один из них - это XML файл контекста приложения, в котором расположены ваши sessionFactory bean, dataSource bean и т.д.
- MVC Dispatcher Servlet XML: Здесь вы обнаружите свой преобразователь вида bean и импортируете XML-контекст приложения.
haslerAdapter bean должен быть расположен в более поздней версии, это файл MVC Dispatcher XML.
<bean name="handlerAdapter"
class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
<property name="messageConverters">
<list>
<bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"/>
<ref bean="jsonConverter"/>
</list>
</property>
<property name="requireSession" value="false"/>
</bean>
<bean id="jsonConverter" class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
<property name="supportedMediaTypes" value="application/json"/>
</bean>
У вас может быть несколько конвертеров сообщений. здесь я создал обычный JSON, а также конвертер сообщений JSON 2. Оба формата Ref и normal bean в файле XML были использованы (лично я предпочитаю тег ref как его опрятный).
API REST
Вот пример контроллера, который предоставляет API REST.
Контроллер
Здесь отображается ваш REST API для HTTP-запроса.
@Component
@Controller
@RequestMapping("/api/user")
public class UserController {
@RequestMapping(value = "/add", method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody
public String insertUser(@RequestBody final User user) {
System.out.println(user.toString());
userService.insertUser(user);
String userAdded = "User-> {" + user.toString() + "} is added";
System.out.println(userAdded);
return userAdded;
}
}
Объект Java
@JsonAutoDetect
public class User {
private int id;
private String username;
private String name;
private String lastName;
private String email;
public int getId() {
return externalId;
}
public void setId(final int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(final String name) {
this.name = name;
}
public String getEmail() {
return email;
}
public void setEmail(final String email) {
this.email = email;
}
public String getUsername() {
return username;
}
public void setUsername(final String username) {
this.username = username;
}
public String getLastName() {
return lastName;
}
public void setLastName(final String lastName) {
this.lastName = lastName;
}
@Override
public String toString() {
return this.getName() + " | " + this.getLastName() + " | " + this.getEmail()
+ " | " + this.getUsername() + " | " + this.getId() + " | ";
}
}
CURL Почтовый вызов
curl -i -H "Content-Type: application/json" -X POST -d '{"id":100,"username":"JohnBlog","name":"John","lastName":"Blog","email":"[email protected]"}' http://localhost:8080/[YOURWEBAPP]/api/user/add
Связанные сообщения и вопросы
Этот FAQ не был возможен, если бы это было не для всех людей, которые предоставили следующие должности и вопросы (этот список будет расширяться, если я столкнусь с полезными сообщениями/вопросами):
- Каков правильный тип содержимого JSON?
- Spring 3.0 делает ответ JSON с помощью конвертера сообщений Jackson
- Как получить данные POST JSON с помощью Curl из Terminal/Commandline для тестирования Spring REST?
- Публикация API JSON для REST
- https://github.com/geowarin/spring-mvc-examples
- Как отправить JSON на PHP с завитком
- Spring ОТДЫХ | MappingJacksonHttpMessageConverter производит недействительный JSON
- https://github.com/eugenp/REST
- Spring Веб-MVC - проверка отдельных параметров запроса
- Как отправлять данные POST JSON с помощью Curl из терминала/командной строки для тестирования Spring REST?
- Как вернуть объект JSON из Java-сервлета
- Какой тип MIME, если JSON возвращается API REST?