spring mvc接收http參數

1.http協議攜帶參數,無外乎兩個三個存儲地點:1.url上 ,2.header裏 3.body裏。java

2.get請求是沒有body的,數據全都放在url上,以?xx&xxx形式。注:get請求時依然有header的,好比get請求下載文件,要指定content-type爲zip,file等spring

3.post請求數據都放在body裏。json

5.@RequestParam 是使用的request.getParam();canvas

6.spring mvc controller不加任何註解,均可以使參數傳進來,只要參數名稱與http傳過來的同樣便可,api

同時,若是參數是多個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;cookie

C) 該註解有兩個屬性: value、required; value用來指定要傳入值的id名稱,required用來指示參數是否必須綁定;mvc

示例代碼:

 

[java]  view plain copy print ?
 
  1. @Controller 
  2. @RequestMapping("/pets") 
  3. @SessionAttributes("pet") 
  4. public class EditPetForm { 
  5.  
  6.     // ... 
  7.  
  8.     @RequestMapping(method = RequestMethod.GET) 
  9.     public String setupForm(@RequestParam("petId")int petId, ModelMap model) { 
  10.         Pet pet = this.clinic.loadPet(petId); 
  11.         model.addAttribute("pet", pet); 
  12.         return "petForm"; 
  13.     } 

 

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;

示例代碼:

 

[java]  view plain copy print ? 在CODE上查看代碼片派生到個人代碼片
 
  1. @RequestMapping(value ="/something", method = RequestMethod.PUT) 
  2. public void handle(@RequestBody String body, Writer writer)throws IOException { 
  3.   writer.write(body); 
[java]  view plain  copy
 
 print?
  1. @RequestMapping(value = "/something", method = RequestMethod.PUT)  
  2. public void handle(@RequestBody String body, Writer writer) throws IOException {  
  3.   writer.write(body);  
  4. }  

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.png

JSON.parse()和JSON.stringify()


JSON.png

text/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
相關文章
相關標籤/搜索