在我們開發(fā)過程中,我們經(jīng)常使用的參數(shù)絕大多少事HTML和JSON格式的請(qǐng)求和響應(yīng)處理,但是我們?cè)趯?shí)際開發(fā)過程中,我們可能經(jīng)歷一些,比如對(duì)于XML格式的請(qǐng)求,我們?cè)诤蠖藨?yīng)該如何接收,并且如何將XML格式的參數(shù)變成對(duì)象,然后返回一個(gè)XML對(duì)象呢?
實(shí)現(xiàn)原理
我們?cè)谔幚鞽ML格式的數(shù)據(jù)的時(shí)候,需要知道我們最初學(xué)習(xí)Spring系列中的Spring MVC。因?yàn)樵赟pring MVC中我們有一個(gè)消息轉(zhuǎn)換器的概念,其主要負(fù)責(zé)處理不同格式的請(qǐng)求數(shù)據(jù)進(jìn)行處理,然后將這個(gè)數(shù)據(jù)包裝成為對(duì)象,以便提供更加友好的變成體驗(yàn)。
我們研究Spring MVC的源碼可以得到在Spring MVC中定義了一個(gè)HttpMessageCoverter接口,抽象了消息轉(zhuǎn)換器對(duì)類型的判斷,對(duì)讀寫的判斷與操作,具體如下:
public interface HttpMessageConverter<T> {
boolean canRead(Class<?> clazz, @Nullable MediaType mediaType);
boolean canWrite(Class<?> clazz, @Nullable MediaType mediaType);
List<MediaType> getSupportedMediaTypes();
T read(Class<? extends T> clazz, HttpInputMessage inputMessage) throws IOException, HttpMessageNotReadableException;
void write(T t, @Nullable MediaType contentType, HttpOutputMessage outputMessage) throws IOException, HttpMessageNotWritableException;
}
-
boolean canRead(Class<?> clazz, @Nullable MediaType mediaType)
:判斷給定的類和媒體類型是否可以被讀取。在處理請(qǐng)求時(shí),用于判斷是否可以將請(qǐng)求的消息體轉(zhuǎn)換為指定的類對(duì)象。 -
boolean canWrite(Class<?> clazz, @Nullable MediaType mediaType)
:判斷給定的類和媒體類型是否可以被寫入。在處理響應(yīng)時(shí),用于判斷是否可以將指定的類對(duì)象轉(zhuǎn)換為響應(yīng)的消息體。 -
List<MediaType> getSupportedMediaTypes()
:獲取該消息轉(zhuǎn)換器支持的媒體類型列表。這些媒體類型表示該轉(zhuǎn)換器可以讀取或?qū)懭氲臄?shù)據(jù)格式。
-Tread(Class<? extends T> clazz, HttpInputMessage inputMessage) throws IOException, HttpMessageNotReadableException
:將請(qǐng)求的消息體轉(zhuǎn)換為指定的類對(duì)象。該方法從 HttpInputMessage 中讀取請(qǐng)求的數(shù)據(jù),并將其轉(zhuǎn)換為指定的類對(duì)象。 -
void write(T t, @Nullable MediaType contentType, HttpOutputMessage outputMessage) throws IOException, HttpMessageNotWritableException
:將指定的類對(duì)象轉(zhuǎn)換為響應(yīng)的消息體。該方法將指定的類對(duì)象轉(zhuǎn)換為字節(jié)流,并寫入到 HttpOutputMessage 中作為響應(yīng)的數(shù)據(jù)。
我們知道,在HTTP中,Content-Type中有各種不同的格式定義,如果需要支持XML格式的消息轉(zhuǎn)換,那就的使用對(duì)應(yīng)的轉(zhuǎn)換器,并且我們知道在Spring MVC中默認(rèn)已經(jīng)有一套采用Jackson實(shí)現(xiàn)的轉(zhuǎn)換器MappingJackson2XmlHttpMessageConverter
。
拓展實(shí)現(xiàn)
1. 引入XML消息轉(zhuǎn)換器
如果你是Spring 用戶,并非Spring Boot用戶,那么我們可以引入XML消息轉(zhuǎn)換器。
@Configuration
public class MessageConverterConfig1 extends WebMvcConfigurerAdapter {
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
Jackson2ObjectMapperBuilder builder = Jackson2ObjectMapperBuilder.xml();
builder.indentOutput(true);
converters.add(new MappingJackson2XmlHttpMessageConverter(builder.build()));
}
}
如果你是Spring Boot用戶,那么就直接加入相關(guān)依賴就行了,那么相關(guān)依賴就交于Spring Boot自動(dòng)實(shí)現(xiàn)了:
<dependency>
<groupId>com.fasterxml.jackson.dataformat</groupId>
<artifactId>jackson-dataformat-xml</artifactId>
</dependency>
2. 定義對(duì)象與XML的關(guān)系
做好了基礎(chǔ)配置后,就可以定義XML內(nèi)容對(duì)應(yīng)的Java對(duì)象了:
@Data
@NoArgsConstructor
@AllArgsConstructor
@JacksonXmlRootElement(localName = "User")
public class User {
@JacksonXmlProperty(localName = "name")
private String name;
@JacksonXmlProperty(localName = "age")
private Integer age;
}
其中:@Data
、@NoArgsConstructor
、@AllArgsConstructor
是lombok簡(jiǎn)化代碼的注解,主要用于生成get、set以及構(gòu)造函數(shù)。@JacksonXmlRootElement
、@JacksonXmlProperty
注解是用來維護(hù)對(duì)象屬性在xml中的對(duì)應(yīng)關(guān)系。
上述配置的User對(duì)象,其可以映射的Xml樣例如下(后續(xù)可以使用上述xml來請(qǐng)求接口):
<User>
<name>miaow</name>
<age>4</age>
</User>
3.創(chuàng)建一個(gè)接收xml請(qǐng)求的接口
完成了需要轉(zhuǎn)換的對(duì)象之后,我們可以編寫一個(gè)相關(guān)接口來接受XML并返回xml。文章來源:http://www.zghlxwxcb.cn/news/detail-733781.html
@Controller
public class UserController {
@PostMapping(value = "/user",
consumes = MediaType.APPLICATION_XML_VALUE,
produces = MediaType.APPLICATION_XML_VALUE)
@ResponseBody
public User create(@RequestBody User user) {
user.setName("姓名 : " + user.getName());
user.setAge(user.getAge() + 20);
return user;
}
}
啟動(dòng)項(xiàng)目之后,我們可以通過相關(guān)接口工具進(jìn)行請(qǐng)求發(fā)送,例如:
我采用的事ApiFox這個(gè)軟件,如果你有更好的軟件可以選擇您自己的軟件文章來源地址http://www.zghlxwxcb.cn/news/detail-733781.html
到了這里,關(guān)于Spring Boot拓展XML格式的請(qǐng)求和響應(yīng)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!