最近遇到了一個采用fastJson傳輸數據的方式,搞了半天,總是感覺模糊,覺得自己有必要在這里做一個系統的總結,今天先從@RequestMapping的屬性開始,采用REST 風格的 URL 請求,REST(Representational State Transfer):(資源)表現層狀態轉化,它是目前最流行的一種軟件架構,其結構清晰、易於理解、擴展方便且符合標准。
1、RequestMapping接口的源碼如下,里面定義了七個屬性
public interface RequestMapping extends Annotation { // 指定映射的名稱 public abstract String name(); // 指定請求路徑的地址 public abstract String[] value(); // 指定請求的方式,是一個RequsetMethod數組,可以配置多個方法 public abstract RequestMethod[] method(); // 指定參數的類型 public abstract String[] params(); public abstract String[] headers(); // 指定數據請求的格式 public abstract String[] consumes(); // 指定返回的內容類型 public abstract String[] produces(); }
2、下面是我在服務器端編寫的一個程序,我將@RequestMapping中的參數都采用了符合原接口的定義的數組的數據類型。
@RequestMapping(value = {"/modifyGet.do","/modifyGet1.do"}, method={RequestMethod.POST, RequestMethod.GET}, consumes={"application/json"}, produces={"application/json"}, params={"name=mike","pwd=123456"},headers={"a=1"}) @ResponseBody public Object addEmpGet()throws Exception { JSONObject responseObj = new JSONObject(); responseObj.put("id", 1/*reqObj.getIntValue("id")*/); return responseObj ; }
2.1 測試value屬性:映射的是請求的地址,如果是一個數據,那么這兩個地址之間的關系是或(||)的關系,請看下面是springmvc啟動之后的提示:
2017-08-20 20:04:11,307 INFO [org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping] - Mapped "{[/modifyGet.do || /modifyGet1.do],methods=[POST || GET],params=[name=mike && pwd=123456],headers=[a=1],
consumes=[application/json],produces=[application/json],produces=[],custom=[]}" onto public java.lang.Object springMVCmybatis.modifyController.addEmpGet()
throws java.lang.
不僅如此,采用postMan發送請求之后,處理的結果也是一樣的。
postMan發送請求的地址:
http://localhost:8080/springMVCmybatis/modifyGet1.do?name=mike&pwd=123456 http://localhost:8080/springMVCmybatis/modifyGet.do?name=mike&pwd=123456
postMan接收到的結果:
{"id":1}
2.2、method屬性:定義了請求的方式,如果此屬性定義了多個值,那么可以適應多種請求方式,比如此例中我定義了RequestMethod.POST與RequestMethod.GET兩種方法,采用postMan發送兩種請求也可以得到正確的JSON數據。正確的請求方式如下:
問題:如果將服務器端代碼改成如下格式,那么發送的請求是GET就會報錯了,POST請求就不會報錯,代碼如下
@RequestMapping(value = {"/modifyGet.do","/modifyGet1.do"}, method={RequestMethod.POST, RequestMethod.GET}, consumes={"application/json"}, params={"name=mike","pwd=123456"},headers="a=1") @ResponseBody public Object addEmpGet(@RequestBody JSONObject reqobj)throws Exception { JSONObject responseObj = new JSONObject(); responseObj.put("id", reqObj.getIntValue("id")); return responseObj ; }
2.3、consumes屬性 :指定處理請求的提交內容類型(Content-Type),例如application/json, text/html;
produces屬性:指定返回的內容類型,僅當request請求頭中的(Accept)類型中包含該指定類型才返回,本人實驗了一下,如果請求的頭中不包含這個屬性也能有正確的返回值,但是如果有Accept這個屬性,那么前后要匹配,否則輸出報錯;
2.4、params與heads:這兩個屬性的作用是類似的,可以對請求進一步過濾,如果輸入的參數不包含對應的屬性或者屬性的值有錯誤,那么就會報HTTP Status [404] – [Not Found]的錯誤。
參考博客:
1、https://my.oschina.net/kolbe/blog/509810
2、http://blog.csdn.net/walkerjong/article/details/7994326