spring接收json格式參數的post請求

最近的一個項目中開發一個接口,因爲接口參數較多並且比較長,再加上其餘緣由。因此選擇了以post的方式並且參數是json串的方式提交請求。遇到一些問題也很快解決了可是解決的過程當中遇到一些有用的內容,如今記錄下來。java

1.postman提交json格式的請求如圖,其中字段名編輯掉了: postman截圖json

2.最開始後臺接收的代碼以下:數組

@RequestMapping(value = "/cfak", method={RequestMethod.POST})
       @ResponseBody
	public String getCfaLabel(ServletRequest request) {   .....   }

想在request獲取參數,結果都是空的,確定是獲取不了的,由於postman是把json串放在請求體裏面。請求頭裏天然啥都沒有了。app

3.而後改爲以下代碼,用@RequestBody這個註解函數

@RequestMapping(value = "/cfak", method={RequestMethod.POST})
        @ResponseBody
	public String getCfaLabel(@RequestBody List<HashMap<String,Object>> params) {   ......    }

由於以前查過若是是一個簡單的json串的話傳Map,我想傳的是一個比較簡單的數組對象,因此也沒多想就用這種試試。結果可想而知仍是獲取不到參數。而後網上查了一下數組的json串接收不推薦用List,直接把json數組中的屬性映射成java對象而後用數組的方式接收。post

4.再次修改爲如下代碼:this

@RequestMapping(value = "/cfak", method={RequestMethod.POST})
        @ResponseBody
	public String getCfaLabel(@RequestBody CfakPo[] params) {  ......  }

其中CfakPo就是一個普通的POJO類:.net

public class CfakPo{
	// 客戶號
	private String clientxxx;

	// 手機號
	private String phoneno;
	
	// 身份證號
	private String creditno;
	
	// 所須要的列
	private String column;
	
	public CfakPo(String clientxxx, String column, String phoneno, String creditno){
		this.clientxxx= clientxxx;
		this.column = column;
		this.phoneno = phoneno;
		this.creditno = creditno;
	}
	
	public CfakPo(){}

這裏還有個小坑就是POJO類必定要有自定義的無參構造函數。當時我沒注意自定義了一個構造方法,致使默認無參構造方法沒了就報錯,而後補上才能夠。code

到這呢重要能夠成功的獲取到參數了,然而我並不想用這種方法,想來更簡單的。因而嘗試了這種彷佛更簡單。orm

5.從ResponseBody中直接獲取json字符串而後本身用jackson再解析:

@RequestMapping(value = "/cfak", method={RequestMethod.POST})
        @ResponseBody
	public String getCfaLabel(@RequestBody String params) {

其中這種也是可以直接獲取到一個postman中完整的json字符串的,而後能夠本身再想辦法解析。到這問題基本解決了,至於用哪種方法能夠根據項目的具體須要來選。

可是問題也來了:爲何憑藉@requestBody這個註解就能夠獲取到json串呢,你定義String就給你返回一個String串,你定義一個Object數組就給你返回一個已經映射好的Object數組的java對象。這是怎麼實現的?? 在網上找到的一篇很好的博客的內容,完成的連接以下:[ SpringMVC使用消息轉換器實現請求報文和對象、對象和響應報文之間的自動轉換] (https://my.oschina.net/lichhao/blog/172562) 這張圖也是從博客中拉下來的(請原諒盜個圖= =!),這個圖展現了Spring對請求及響應請求的過程抽象: Spring3.X之後對請求的抽象過程

其中主要是這個HttpMessageConverter是一個接口,他有不少實現類: 好比:StringHttpMessageConverter這個其實就是把整個的json串當作一個字符串來處理了。 還有:MappingJackson2HttpMessageConverter 這個最終仍是須要咱們添加jackson或者其餘處理json的jar包 還有:XmlAwareFormHttpMessageConverter 這個是處理Xml的Converter在4.1.3中已經不推薦使用了。 至於Spring究竟在哪一個類的哪一個方法中根據各類RequestBody的類型對應各類不一樣Converter暫時還沒找到。。。

相關文章
相關標籤/搜索