springboot2基礎運用之參數綁定, 正確理解Content-type的做用範圍

Content-Type的理解

http協議是創建在tcp/ip協議之上的應用層協議,主要包括三個部分,狀態行,頭部信息,消息主體。對應一個http請求就是:請求行,請求頭,請求體。html

content-type就在請求頭中 . 通常服務端會根據content-type字段來獲取參數是怎麼編碼的,而後對應去解碼;java

表單提交或上傳文件的經常使用的資源類型: web

  1. application/x-www-form-urlencoded (默認) 
  2. multipart/form-data,
  3. application/json,
  4. application/xml

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
        |---請求體中加入文本
配置文件傳參

get方式Url傳參:

@PathVariabletcp

@RestController
public class HelloController {
    @GetMapping("/hello/{name}")
    public String hello(@PathVariable("name") String name){
        // 形參的name能夠隨意
        System.out.println("獲取到的name是:"+name);
        return "hello "+name;
    }
}

get方式Url傳參:

@RequestParam

若是請求參數的名字跟方法中的形參名字一致能夠省略@RequestParam("name")

@GetMapping("/hello")
public String hello(@RequestParam("name") String name){
    System.out.println("獲取到的name是:"+name);
    return "hello "+name;
}

3.get方式Url傳參:

@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參數沒有提供

  • 解決方案
    • 1.defaultValue = "xxx" :使用默認值
    • 2.required = false :標註參數是非必須的
@GetMapping("/hello")
public String hello(@RequestParam(value = "name",required = false) String name){
    System.out.println("獲取到的name是:"+name);
    return "hello "+name;
}

POST方式傳遞數據

@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;
    }
}

POST傳遞字符串文本

@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;
}

@requestbody接收參數

@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區別

               multipart/form-data:既能夠上傳文件等二進制數據,也能夠上傳表單鍵值對,只是最後會轉化爲一條信息;

               x-www-form-urlencoded:只能上傳鍵值對,而且鍵值對都是間隔分開的。好比,name=java&age=23;特殊字符須要轉義成utf-8編號,如空格會變成 %20

raw

                能夠上傳任意格式的文本,能夠上傳text、json、xml、html等

請求體更多可參考文章: https://blog.csdn.net/pomer_huang/article/details/79495346 

相關文章
相關標籤/搜索