更方便的在微信公众号阅读文章可以关注公众号:海生的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。直接来看一个请求示例:

请求参数
image.png
http 请求报文
image.png

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

海生
104 声望33 粉丝

与黑夜里,追求那一抹萤火。