HTTP 的 POST 請求通常是用於提交數據,可以通過這篇文章來了解各種提交方式:四種常見的 POST 提交數據方式。做 Web 后端開發時,不可避免地要自己給自己發請求來調試接口,這里要記錄的內容是如何使用命令行工具 curl 來進行各種方式的 POST 請求。
application/x-www-form-urlencoded
最常見的一種 POST 請求,用 curl 發起這種請求也很簡單。
1
|
$ curl localhost:3000/api/basic -X POST -d 'hello=world' |
multipart/form-data
這種請求一般涉及到文件上傳。后端對這種類型請求的處理也復雜一些。
1
|
$ curl localhost:3000/api/multipart -F raw=@raw.data -F hello=world |
application/json
|
|
跟發起 application/x-www-form-urlencoded 類型的 POST 請求類似,-d 參數值是 JSON 字符串,並且多了一個 Content-Type: application/json 指定發送內容的格式。
這個例子和 application/x-www-form-urlencoded 中的例子發起的請求,到了 Web 后端經過解析后,得到的結果都是 hello: world 鍵值對。
文件內容作為要提交的數據
如果要提交的數據不像前面例子中只有一個 hello: world 鍵值對,數據比較多,都寫在命令行里很不方便,也容易出錯,那么可以把數據內容先寫到文件里,通過 -d @filename 的方式來提交數據。這是 -d 參數的一種使用方式,所以前面用到 -d 參數的地方都可以這樣用。
實際上就是把 -d 參數值寫在命令行里,變成了寫在文件里。跟 multipart/form-data 中上傳文件的 POST 方式不是一回事。@ 符號表明后面跟的是文件名,要讀取這個文件的內容作為 -d 的參數。
例如,有一個 JSON 文件 data.json 內容如下:
|
|
就可以通過
|
|
來提交數據。
如果要用 application/x-www-form-urlencoded 方式提交,后端解析出來同樣的數據,那么 -d 的參數是這樣的(注意數組參數的寫法)
1
|
hello=world&xxx=yyy&a[]=ooo&a[]=mmm |
把這個字符串直接作為 -d 的參數或者把它寫到文件 data.txt 然后通過 -d @data.txt 的方式,發起 POST 請求,行為和結果是一樣的。
1
2 3 |
$ curl localhost:3000/api/basic -X POST -d 'hello=world&xxx=yyy&a[]=ooo&a[]=mmm' $ curl localhost:3000/api/basic -X POST -d @data.txt |
