http協議是創建在tcp/ip協議之上的應用層協議,主要包括三個部分,狀態行,頭部信息,消息主體。對應一個http請求就是:請求行,請求頭,請求體。html
content-type就在請求頭中 . 通常服務端會根據content-type字段來獲取參數是怎麼編碼的,而後對應去解碼;java
表單提交或上傳文件的經常使用的資源類型: web
form表單中能夠定義enctype屬性,該屬性的含義是在發送到服務器以前應該如何對錶單數據進行編碼。spring
默認的狀況下,表單數據會編碼爲 "application/x-www-form-unlencoded".json
enctype經常使用的屬性值以下:application/x-www-form-unlencoded: 在發送前編碼全部字符(默認狀況下);
multipart/form-data, 不對字符編碼。在使用文件上傳時候,使用該值。後端
請求體中嵌套數組的話,或複雜的格式的話,建議使用application/json傳遞比較好,後端解析會方便不少, 經過json的形式將數據發送給服務器。數組
json的形式的優勢是它能夠傳遞結構複雜的數據形式服務器
參數傳遞能夠說是服務端和外界溝通的主要方式,這節是很是重要的!
app
經過url傳參 |---get方式Url傳參 |---@PathVariable 即:url/id/1994 形式 |---@RequestParam 即:url?username=zed形式 |---POST方式傳參 |---@RequestParam |---請求體中加入文本 配置文件傳參
@PathVariabletcp
@RestController public class HelloController { @GetMapping("/hello/{name}") public String hello(@PathVariable("name") String name){ // 形參的name能夠隨意 System.out.println("獲取到的name是:"+name); return "hello "+name; } }
@RequestParam
若是請求參數的名字跟方法中的形參名字一致能夠省略@RequestParam("name")
@GetMapping("/hello") public String hello(@RequestParam("name") String name){ System.out.println("獲取到的name是:"+name); return "hello "+name; }
@RequestParam+默認參數
@GetMapping("/hello") public String hello(@RequestParam(value = "name",defaultValue = "admin") String name){ System.out.println("獲取到的name是:"+name); return "hello "+name; }
注意:若是沒有指定默認值,而且沒有傳遞參數將會報錯
Required String parameter 'name' is not present
:name參數沒有提供
@GetMapping("/hello") public String hello(@RequestParam(value = "name",required = false) String name){ System.out.println("獲取到的name是:"+name); return "hello "+name; }
@RestController public class HelloController { public static Logger log = LoggerFactory.getLogger(HelloController.class); @PostMapping("/user") public String add(@RequestParam("name") String name,@RequestParam("age") Integer age){ log.info(name+" "+age); return "name:"+name+"\nage:"+age; } }
@PostMapping("/PostString") public String postString(HttpServletRequest request) { ServletInputStream is = null; try { is = request.getInputStream(); StringBuilder sb = new StringBuilder(); byte[] buf = new byte[1024]; int len = 0; while ((len = is.read(buf)) != -1) { sb.append(new String(buf, 0, len)); } System.out.println(sb.toString()); return sb.toString(); } catch (IOException e) { e.printStackTrace(); } finally { try { if (is != null) { is.close(); } } catch (IOException e) { e.printStackTrace(); } } return null; }
@PostMapping("/save") @ResponseBody public Map<String,Object> save(@RequestBody User user){ Map<String,Object> map = new HashMap<String,Object> (); map.put("user",user); return map; }
@PostMapping("/user") public String user(@RequestBody User user){ log.info(user.toString()); return null; }
更多可參考原文: https://www.jianshu.com/p/ad13fc37b047
package top.qsou.test.demo.controller; import org.springframework.web.bind.annotation.*; import top.qsou.test.demo.dto.User; import java.awt.print.Pageable; @RestController @RequestMapping("/param") public class ParamController { /** * url 直傳, 可獲取到值 ; @RequestParam 無關緊要 * @param name * @param pass * @return */ @GetMapping("test1") public Object test01(@RequestParam String name, @RequestParam String pass) { System.out.println( name + pass ); return name + "---------" + pass; } /** * defaultValue 有效, 存在默認值 * @param name * @param pass * @return */ @GetMapping("test1-1") public Object test02(@RequestParam(defaultValue = "wxw") String name,String pass) { System.out.println( name + pass ); return name + "---------" + pass; } /** * form-data 提交時: 可獲取 * x-www-urlencoded 提交時: 可獲取 * raw json體格式提交時:沒法獲取, 必須使用@RequestBody註解獲取 * @param user * @return */ @PostMapping("test2") public Object test04(User user) { return user.getName() + "---------" + user.getPass(); } /** * 必須是json體格式接收 * @param user * @return */ @PostMapping("test2-1") public Object test05(@RequestBody User user) { return user.getName() + "---------" + user.getPass(); } /** * form-data 提交時: 可獲取 * x-www-urlencoded 提交時: 可獲取 * raw json體格式提交時:沒法獲取 * @param name * @param pass * @return */ @PostMapping("test2-3") public Object test042(@RequestParam String name,String pass) { return name+ "-----------------"+pass; } }
multipart/form-data:既能夠上傳文件等二進制數據,也能夠上傳表單鍵值對,只是最後會轉化爲一條信息;
x-www-form-urlencoded:只能上傳鍵值對,而且鍵值對都是間隔分開的。好比,name=java&age=23;特殊字符須要轉義成utf-8編號,如空格會變成 %20
能夠上傳任意格式的文本,能夠上傳text、json、xml、html等
請求體更多可參考文章: https://blog.csdn.net/pomer_huang/article/details/79495346