更方便的在微信公众号阅读文章可以关注公众号:海生的go花园
一、介绍
Content-Type表示header头中,用来指示资源的原始媒体类型mime type。
他就像一个说明书,说明了服务端/或浏览器应该怎么处理这次请求。
在请求中,例如get和post,客户端告诉服务器实际发送的数据类型。
在返回中,Content-Type标头表示,服务端返回内容的实际类型。
1.1 语法
Content-Type: text/html; charset=utf-8
Content-Type: multipart/form-data; boundary=something
media-type :
资源或数据的MIME 类型
字符集 :
字符编码标准。不区分大小写,首选小写。
边界:
对于多部分实体,boundary指令是必需的。
该指令由一组字符(不以空格结尾)中的1到70个字符组成,
这些字符在电子邮件网关中非常可靠。它用于封装消息的多个部分的边界。
通常,标题边界前面有两个破折号,最终边界的末尾有两个破折号。
1.2 四种常见的Content-Type区别
其实不管是 request 还是 response 都应该有 Content-Type 但是这个要求只有在 POST 下是必须的.(因为get请求有可能 content-body 部分是空的, 所以指定 Content-Type 无意义,干脆省略)
在一次HTTP请求(request)中可以带参数的地方总共有3个:
部分 | 用途 |
---|---|
URL 部分 | 就是以 ? 和 & 分割的 url参数 |
header 部分 | 在http头中的字段 常用的比如说cookie |
content-body 部分 | 请求正文,如果是 get 请求则是空 |
如果是post请求,则请求头中的 Content-Type 字段规定了content-body部分应该怎么被解析:
Content-Type | 用途 |
---|---|
application/x-www-form-urlencoded | 默认的方式, 比如 title=test&id=1010 |
multipart/form-data | 如果你的请求里包含多个文件等二进制信息,则form 的 enctyped 需要等于这个值,浏览器生成一个 boundary 用于分割不同的字段 |
application/json | json格式 |
raw | 纯二进制格式,这需要服务器拿到消息后自己定义解析方式,比如protobuf |
二、4种Content-Type类型的使用
2.1 使用 application/x-www-form-urlencoded
这里我们继续使用 http.Post()方法来发送post请求
主要分为两步
1.设置 Content-Type为 application/x-www-form-urlencoded
2.封装 content-body, 这里使用url.Values{}来封装。
func TestP2(t *testing.T) {
urlApi := "http://localhost:8080/v1/discovery"
var contentType string = "application/x-www-form-urlencoded"
formParam := url.Values{}
formParam.Add("id", "1010")
formParam.Add("test", "test")
body := strings.NewReader(formParam.Encode())
// 或者 body = strings.NewReader("id=1010&test=test")
resp, err := http.Post(urlApi, contentType, body)
if err != nil {
}
defer resp.Body.Close()
respBody, err := ioutil.ReadAll(resp.Body)
if err != nil {
fmt.Println(err)
// handle error
}
t.Log(string(respBody))
}
在这里,最后的http报文里面的body是 id=1010&test=test
2.2 使用 multipart/form-data
我们使用表单上传文件时,必须让 <form> 表单的 enctype 等于 multipart/form-data。直接来看一个请求示例:
请求参数
http 请求报文
2.3 使用 application/json
这里我们继续使用 http.Post()方法来发送post请求
主要分为两步
1.设置 Content-Type为 application/json
2.封装 content-body, 使用json格式。
func TestP3(t *testing.T) {
urlApi := "http://localhost:8080/v1/discovery"
var contentType string = "application/json"
jsonParam := `{"id":"1010"}`
resp, err := http.Post(urlApi, contentType, strings.NewReader(jsonParam))
if err != nil {
}
defer resp.Body.Close()
respBody, err := ioutil.ReadAll(resp.Body)
if err != nil {
fmt.Println(err)
// handle error
}
t.Log(string(respBody))
}
参考文献
https://www.wangshaoxing.com/blog/different-between-post-headers.html
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。