HTTP協議的四種傳參方式


HTTP協議的四種傳參方式

HTTP協議組成 協議內容示例 對應Spring注解
path info傳參 /articles/12 (查詢id為12的文章,12是參數) @PathVariable
URL Query String傳參 /articles?id=12 @RequestParam
Body 傳參 Content-Type: multipart/form-data @RequestParam
Body 傳參 Content-Type: application/json,或其他自定義格式 @RequestBody
Headers 傳參 @RequestHeader

path info傳參

請求路徑:http://localhost:8080/rest/articles/1

    /**
     * 獲取一篇Article,使用GET方法,根據id查詢一篇文章
     * restful注意:
     * 請求路徑要是復數的,加上s
     * 又因為是{id},所以要接收參數值用@PathVariable("id")
     * method = RequestMethod.GET:必須要求是get請求
     */
    //@RequestMapping(value = "/articles/{id}", method = RequestMethod.GET)
    @GetMapping("/articles/{id}")
    public AjaxResponse<Article> getArticle(
            // @PathVariable作用:接收請求路徑中占位符的值
            @PathVariable("id") Long id
    ) {
        // 不搞數據庫查詢,做一個偽代碼
        Article article = Article.builder().id(1l).author("周周").title("z1").content("RESTful風格查詢一篇文章").createTime(new Date()).build();
        // 打印一下內容
        log.info("article:", article);
        // 返回給前端內容
        return AjaxResponse.success(article);
    }

URL Query String傳參

請求路徑:http://localhost:8080/rest/articles?name=zhoujinyuan

    //@RequestMapping(value = "/articles", method = RequestMethod.GET)
    @GetMapping("/articles")
    public AjaxResponse<Article> getArticle(
            @RequestParam String name
    ) {
        // 打印一下內容
        log.info("name:"+name);
        // 返回給前端內容
        return AjaxResponse.success();
    }

Body 傳參:@RequestParam

請求路徑:http://localhost:8080/rest/articles1

/**
     * 新增一篇Article,使用Post方法
     *
     * @param author
     * @param title
     * @param content
     * @param createTime
     * @return
     */
    // @RequestMapping(value = "/articles1", method = RequestMethod.POST)
    @PostMapping("/articles1")
    public AjaxResponse saveArticle(
            // @RequestParam:將請求參數綁定到你控制器的方法參數上(是springmvc中接收普通參數的注解)
            @RequestParam Long id,
            @RequestParam String author,
            @RequestParam String title,
            @RequestParam String content,
            /*
             這里加了兩個注解:
                @DateTimeFormat:在SpringMVC中Controller中方法參數為Date類型想要限定請求傳入時間格式時,可以通過@DateTimeFormat來指定,但請求傳入參數與指定格式不符時,會返回400錯誤。
                @RequestParam:請求的參數和方法中的參數做對應的注解
             */
            @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") @RequestParam Date createTime
            ) {
        log.info("saveArticle:" + createTime);
        return AjaxResponse.success();
    }

開始我測試一直報錯:required string parameter 'XXX'is not present

情況一:原因是由於頭文件類型不對,可以在MediaType中選擇合適的類型,例如GET和POST

情況二:jquery提交delete時,不支持@RequestParam,只支持@PathVariable形式

情況三:若api在調用的時候,如果存在重類型,但不重名;例如:/id與/name,兩者在類型上是一樣的

情況四:這里提示Required String parameter 'XXX' is not present並不一定是XXX的錯,也有可能是后面的參數錯誤。總的來說就是頁面傳遞的參數和后台接受參數名自不匹配。

情況五:傳遞的參數里面包含特殊符號,比如前台傳遞字符串不能包含逗號等。(待證明)

情況六:傳的參數是undefined;

我的問題就是用了@RequestParam接收參數,必須接受表單形式的提交。類似get中❓后一鍵一值的那種。@RequestBody才是接收json形式的數據的!!!

Body 傳參 和 Headers 傳參

請求路徑:http://localhost:8080/rest/articles2

    /**
     * 新增一篇Article,使用Post方法
     * restful注意:
     */
    // @RequestMapping(value = "/articles2", method = RequestMethod.POST)
    @PostMapping("/articles2")
    public AjaxResponse saveArticle(
            // body形式的傳參:傳過來的參數自動封裝成實體類對象,還有一個好處就是可以接收集合類型的參數。
            @RequestBody Article article,
            // 請求頭的方式傳參:用@RequestHeader接收鍵名,形參為值;postman中
            @RequestHeader(value = "name") String name
    ) {
        // 請求頭參數中的Host屬性
        System.out.println(name);
        // 日志打印
        log.info("article:" + article);
        return AjaxResponse.success();
    }

@RequestBody接收json形式的數據自動轉換成實體類!!!而且還可以接受集合類型的數據。

{
    "id": 1,
    "author": "zhoujinyuan",
    "title": "boot",
    "content": "body傳參",
    "createTime": "2020-10-20 12:12:12",
    "reader":[{"name":"zhou","age":18},{"name":"tom","age":37}]
}

但是我還用了一個注解 @RequestHeader 。所以傳json數據的同時也還要把請求頭中的數據傳過來(沒有的話自定義一個也要穿過來,不然報錯400)。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM