http://homeway.me/2015/07/19/understand-http-about-content-type/

0x01.About

查看Restful API 报头插件:

utm_source=chrome-ntp-icon">Chrome插件REST Console,以及发送Restful API工具:

utm_source=chrome-ntp-icon">Chrome插件POST Man

在HTTP 1.1规范中。HTTP请求方式有OPTIONS、GET、HEAD、POST、PUT、DELETE、TRACE、CONNECT

通常我们用的仅仅有GET、POST,然而对于Restful API规范来说,请求资源要用PUT方法,删除资源要用DELETE方法。

比如发送个DELETE包:

http://example.com/my/resource?id=12345

那么通过id就能获取到信息,这个包仅仅有header,并不存在body,以下讨论几个包括body的发包的body传输格式。


0x02.Content-Type

Content-Type用于指定内容类型,通常是指网页中存在的Content-Type。Content-Type属性指定请求和响应的HTTP内容类型。

如果未指定 ContentType,默觉得text/html。

在nginx中有个配置文件mime.types。主要是标示Content-Type的文件格式。

以下是几个常见的Content-Type:

1.text/html

2.text/plain

3.text/css

4.text/javascript

5.application/x-www-form-urlencoded

6.multipart/form-data

7.application/json

8.application/xml

前面几个都非常好理解。都是html,css,javascript的文件类型。后面四个是POST的发包方式。


0x03.application/x-www-form-urlencoded

application/x-www-form-urlencoded是经常使用的表单发包方式。普通的表单提交。或者js发包,默认都是通过这样的方式,

比方一个简单地表单:

<form enctype="application/x-www-form-urlencoded" action="http://homeway.me/post.php" method="POST">
<input type="text" name="name" value="homeway">
<input type="text" name="key" value="nokey">
<input type="submit" value="submit">
</form>

那么server收到的raw header会相似:

Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Encoding:gzip, deflate
Accept-Language:zh-CN,zh;q=0.8,en;q=0.6,zh-TW;q=0.4,gl;q=0.2,de;q=0.2
Cache-Control:no-cache
Connection:keep-alive
Content-Length:17
Content-Type:application/x-www-form-urlencoded

那么server收到的raw body会是,name=homeway&key=nokey,在php中,通过$_POST就能够获得数组形式的数据。


0x04.multipart/form-data

multipart/form-data用在发送文件的POST包。

这里如果我用python的request发送一个文件给server:

data = {
"key1": "123",
"key2": "456",
}
files = {'file': open('index.py', 'rb')}
res = requests.post(url="http://localhost/upload", method="POST", data=data, files=files)
print res

通过工具。能够看到我发送的数据内容例如以下:

POST http://www.homeway.me HTTP/1.1
Content-Type:multipart/form-data; boundary=------WebKitFormBoundaryOGkWPJsSaJCPWjZP ------WebKitFormBoundaryOGkWPJsSaJCPWjZP
Content-Disposition: form-data; name="key2"
456
------WebKitFormBoundaryOGkWPJsSaJCPWjZP
Content-Disposition: form-data; name="key1"
123
------WebKitFormBoundaryOGkWPJsSaJCPWjZP
Content-Disposition: form-data; name="file"; filename="index.py"

这里Content-Type告诉我们。发包是以multipart/form-data格式来传输。另外。还有boundary用于切割数据。

当文件太长。HTTP无法在一个包之内发送完成,就须要切割数据。切割成一个一个chunk发送给服务端。

那么--用于区分数据快,而后面的数据633e61ebf351484f9124d63ce76d8469就是标示区分包作用。


0x05.text/xml

微信用的是这样的数据格式发送请求的。

POST http://www.homeway.me HTTP/1.1
Content-Type: text/xml <?xml version="1.0"? >
<resource>
<id>123</id>
<params>
<name>
<value>homeway</value>
</name>
<age>
<value>22</value>
</age>
</params>
</resource>

php中$_POST仅仅能读取application/x-www-form-urlencoded数据。$_FILES仅仅能读取multipart/form-data类型数据,

那么,要读取text/xml格式的数据,能够用:

file=fopen(‘php://input′,‘rb′);data = fread(file,length);fclose(file);

或者

$data = file_get_contents(‘php://input’);


0x06.application/json

通过json形式将数据发送给server,一開始。我尝试通过curl,给server发送application/json格式包,

然而我收到的数据例如以下:

————————–e1e1406176ee348a Content-Disposition: form-data; name=”nid” 2 ————————–e1e1406176ee348a Content-Disposition: form-data; name=”uuid” cf9dc994-a4e7-3ad6-bc54-41965b2a0dd7 ————————–e1e1406176ee348a Content-Disposition: form-data; name=”access_token” 956731586df41229dbfec08dd5d54eedb98d73d2 ————————–e1e1406176ee348a–

后来想想明确了,HTTP通信中并不存在所谓的json,而是将string转成json罢了,也就是,application/json能够将它理解为text/plain。普通字符串。

之所以出现那么多乱七八糟的-------应该是php数组传输进去,存在的转换问题吧(我眼下能想到的原因)。

本文出自 夏日小草,转载请注明出处:http://homeway.me/2015/07/19/understand-http-about-content-type/

-by小草

2015-07-19 01:35:10

最新文章

  1. 怎么取得dropdownlist选中的ID值
  2. HashMap Hasptable的区别
  3. Ubuntu14.04下安装Hadoop2.4.0 (单机模式)
  4. .NET开源工作流RoadFlow-系统布署中常见错误及处理方法
  5. 锋利的jQuery读书笔记---jQuery中Ajax--序列化元素、Ajax全局事件
  6. PHP裁剪图片
  7. uva 489 Hangman Judge(水题)
  8. java常见算法
  9. angular 跳转页面时传参
  10. CSS基础知识笔记(二)之选择器
  11. AFNetwork 作用和使用方法具体解释
  12. Office 2010
  13. 【原创】构建高性能ASP.NET站点 开篇
  14. 《孵化twitter》读书笔记
  15. Swift NSAttributedString的使用
  16. 自动化运维之ansible
  17. Synchronized的几种用法
  18. 【2】IOS APP打包发布
  19. Visual Studio断点调试, 无法监视变量, 提示无法计算表达式
  20. 【cs229-Lecture7】支持向量机(SVM)

热门文章

  1. [BZOJ4825][HNOI2017]单旋(线段树+Splay)
  2. 如何在SpringBoot当中上传多个图片或者上传单个图片 工具类
  3. [转]如何卸载eclipse中的ADT
  4. java - 内存泄漏
  5. 如何使用DotNet 2.0中的应用程序配置 Settings.settings
  6. SVN 服务器搭建及使用 一
  7. CentOS 6.9设置阿里云源/163源
  8. Practice safe dc/dc converter
  9. [js插件]学习Highcharts
  10. java序列化 SerializeUtil