1.http協議攜帶參數,無外乎兩個三個存儲地點:1.url上 ,2.header里 3.body里。
2.get請求是沒有body的,數據全都放在url上,以?xx&xxx形式。注:get請求時依然有header的,比如get請求下載文件,要指定content-type為zip,file等
3.post請求數據都放在body里。
5.@RequestParam 是使用的request.getParam();
6.spring mvc controller不加任何注解,都可以使參數傳進來,只要參數名稱與http傳過來的一樣即可,
同時,如果參數是多個bean,則每個bean的屬性都可以注入進來
4.@RequestParam
A) 常用來處理簡單類型的綁定,通過Request.getParameter() 獲取的String可直接轉換為簡單類型的情況( String--> 簡單類型的轉換操作由ConversionService配置的轉換器來完成);因為使用request.getParameter()方式獲取參數,所以可以處理get 方式中queryString的值,也可以處理post方式中 body data的值;
B)用來處理Content-Type: 為 application/x-www-form-urlencoded
編碼的內容,提交方式GET、POST;
C) 該注解有兩個屬性: value、required; value用來指定要傳入值的id名稱,required用來指示參數是否必須綁定;
示例代碼:
- @Controller
- @RequestMapping("/pets")
- @SessionAttributes("pet")
- public class EditPetForm {
- // ...
- @RequestMapping(method = RequestMethod.GET)
- public String setupForm(@RequestParam("petId")int petId, ModelMap model) {
- Pet pet = this.clinic.loadPet(petId);
- model.addAttribute("pet", pet);
- return "petForm";
- }
10.
@RequestBody
該注解常用來處理Content-Type: 不是application/x-www-form-urlencoded
編碼的內容,例如application/json, application/xml等;
它是通過使用HandlerAdapter 配置的HttpMessageConverters
來解析post data body,然后綁定到相應的bean上的。
因為配置有FormHttpMessageConverter,所以也可以用來處理 application/x-www-form-urlencoded
的內容,處理完的結果放在一個MultiValueMap<String, String>里,這種情況在某些特殊需求下使用,詳情查看FormHttpMessageConverter api;
示例代碼:
- @RequestMapping(value ="/something", method = RequestMethod.PUT)
- public void handle(@RequestBody String body, Writer writer)throws IOException {
- writer.write(body);
- }
- @RequestMapping(value = "/something", method = RequestMethod.PUT)
- public void handle(@RequestBody String body, Writer writer) throws IOException {
- writer.write(body);
- }
Http POST 提交數據的四種方式解析
協議規定 POST 提交的數據必須放在消息主體(entity-body)中,但協議並沒有規定數據必須使用什么編碼方式。
服務端通常是根據請求頭(headers)中的 Content-Type 字段來獲知請求中的消息主體是用何種方式編碼,再對主體進行解析。
application/x-www-form-urlencoded (默認常用的)
這應該是最常見的 POST 提交數據的方式了。瀏覽器的原生 <form> 表單,如果不設置 enctype
屬性,那么最終就會以 application/x-www-form-urlencoded 方式提交數據。
Content-Type 被指定為 application/x-www-form-urlencoded;其次,提交的數據按照 key1=val1&key2=val2 的方式進行編碼,key 和 val 都進行了 URL 轉碼。大部分服務端語言都對這種方式有很好的支持。
multipart/form-data
這又是一個常見的 POST 數據提交的方式。我們使用表單上傳文件時,必須讓 <form> 表單的 enctyped
等於 multipart/form-data。直接來看一個請求示例:
提示 input type=file 瀏覽器處於安全考慮 , 必須操作賦值,不能直接改value,
比如canvas 直接生成圖片之后上傳 就不能使用 input type=file。可以直接把得到的圖片轉換成 base64 上傳
application/json
application/json 這種方案,可以方便的提交復雜的結構化數據, 這個 Content-Type 作為響應頭大家肯定不陌生。現在越來越多的人把它作為請求頭,用來告訴服務端消息主體是序列化后的 JSON 字符串。
由於 JSON 規范的流行,除了低版本 IE 之外的各大瀏覽器都原生支持 JSON.stringify,服務端語言也都有處理 JSON 的函數,使用 JSON 不會遇上什么麻煩。
JSON 格式支持比鍵值對復雜得多的結構化數據,這一點也很有用 AngularJS 中的 Ajax 功能,默認就是提交 JSON 字符串。例如下面這段代碼:
var data = {'title':'test', 'sub' : [1,2,3]}; $http.post(url, data).success(function(result) { ... });
最終發送的請求是:
Content-Type: application/json;charset=utf-8 {"title":"test","sub":[1,2,3]}
![]()
application/json.pngJSON.parse()和JSON.stringify()
![]()
JSON.pngtext/xml
現在幾乎不用
默認情況下,標准的跨域請求是不會發送cookie等用戶認證憑據的,XMLHttpRequest 2的一個重要改進就是提供了對授信請求訪問的支持。
var xhr = new XMLHttpRequest(); xhr.open('POST', 'http://www.xxx.com/api'); xhr.withCredentials = true; xhr.onload = onLoadHandler; xhr.send();
Access-Control-Allow-Credentials: true
![]()
Access-Control-Allow-Credentials.png