HTTP请求头部Content-Type字段

研究HTTP请求头部的 Content-Type 字段,基于 Chrome 插件 DHC

1. GET 请求

GET 请求不存在请求实体部分,键值对参数放置在 URL 尾部,因此请求头不需要设置 Content-Type 字段

非 ASCII 码会自动进行编码转换,例如发送请求:www.bilibili.com?hehe=你的我的

GET /?hehe=%E4%BD%A0%E7%9A%84%E6%88%91%E7%9A%84 HTTP/1.1
Host: www.bilibili.com

值得一提的是,GET 参数的编码方式是无法人为干涉的,这导致了不同浏览器有不同的编码方式,因此最稳妥的方案是人工预编码,人工解码,从而禁止浏览器编码的干涉

2. POST 请求

第一类:raw 原始类型,可以上传任意格式的文本,比如 text、json、xml、html(中文不进行编码)

①text 请求

POST / HTTP/1.1
Host: www.bilibili.com
Content-Type: text/plain
Content-Length: 44
ALARM=hellowww&&adzdzd12323...22你的我的

②json 请求

POST / HTTP/1.1
Host: www.bilibili.com
Content-Type: application/json
Content-Length: 44
ALARM=hellowww&&adzdzd12323...22你的我的

③html 请求

POST / HTTP/1.1
Host: www.bilibili.com
Content-Type: text/html
Content-Length: 44
ALARM=hellowww&&adzdzd12323...22你的我的

第二类:application/x-www-form-urlencoded,会将表单内的数据转换拼接成 key-value 对(非 ASCII 码进行编码)

发送 POST 请求,参数为:aaa=aaa,bbb=你的我的

POST / HTTP/1.1
Host: www.bilibili.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 48
aaa=aaa&bbb=%E4%BD%A0%E7%9A%84%E6%88%91%E7%9A%84

从这里可以看出,application/x-www-form-urlencoded 对非 ASCII 的编码方式与 GET 请求参数的编码方式和格式都是一样的

值得一提的是,POST 请求的编码格式是可以人工干预的:在 form 表单所在的 html 文件里如果有段 ,那么 post 就会用此处指定的编码方式编码,JSP 也有类似的声明方式;开发人员可以用此来指定 POST 请求的编码格式

第三类:multipart/form-data,将表单的数据处理为一条消息,以标签为单元,用分隔符分开。既可以上传键值对,也可以上传文件

发送 POST 请求,参数为:aaa=aaa,bbb=你的我的啊啊啊,file=图片

POST / HTTP/1.1
Host: www.bilibili.com
Content-Type: multipart/form-data;boundary=------FormBoundary15e896376d1
Content-Length: 19532
------FormBoundary15e896376d1
Content-Disposition: form-data; name="aaa"
aaa
------FormBoundary15e896376d1
Content-Disposition: form-data; name="bbb"
你的我的啊啊啊
------FormBoundary15e896376d1
Content-Disposition: form-data; name="file"; filename="cat-icon.png"
Content-Type: image/png
[message-part-body; type:image/png, size:19201 bytes]
------FormBoundary15e896376d1--

可以看到,中文并没有被编码

当你在发送HTTP请求时设置`Content-Type`头部,有时候可能会遇到错误,这通常是因为以下几个原因: 1. **拼写或格式错误**:检查`Content-Type`字段是否正确拼写,例如应该是`"application/json"`而不是`"application/json;"`。确保没有额外的空格或分号。 2. **无效的内容类型**:确保你正在使用的MIME类型对应于你的数据格式。比如,如果你传递的是JSON数据,应设置`Content-Type: application/json`,而非文本或其他非预期类型。 3. **跨域问题**:如果在浏览器环境中,可能存在同源策略限制。除非服务器允许,否则你无法直接向其他域名发送带有特定`Content-Type`的请求。 4. **HttpClient配置**:如果你使用的是`HttpClient`,可能需要显式配置它的`DefaultRequestHeaders.ContentType`属性。确保你是在适当的时间点设置,并且是在构建请求前进行。 5. **请求方法不匹配**:如果是POST、PUT等需要携带内容类型的请求,确保方法与内容类型相匹配。GET请求通常不需要指定`Content-Type`,因为它默认为`text/plain`. 一个正确的例子: ```csharp using HttpClientHandler = System.Net.Http.HttpClientHandler; // 如果你使用的是.Net Framework,请替换为HttpClientHandler using HttpResponseMessage = System.Net.Http.HttpResponseMessage; // 同上 HttpClient client = new HttpClient(new HttpClientHandler()); client.DefaultRequestHeaders.ContentType = MediaTypeHeaderValue.Parse("application/json"); // 这里设置Content-Type string jsonPayload = "{\"key\":\"value\"}"; var content = new StringContent(jsonPayload, Encoding.UTF8, "application/json"); try { HttpResponseMessage response = await client.PostAsync("https://api.example.com/endpoint", content); // ... } catch (HttpRequestException e) { Console.WriteLine($"Request failed with status code: {e.Response?.StatusCode}"); } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值