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

[原]理解HTTP之Content-Type的更多相关文章

  1. 转载 SharePoint【Site Definition 系列】– 创建Content Type

    转载原地址:  http://www.cnblogs.com/wsdj-ITtech/archive/2012/09/01/2470274.html Sharepoint本身就是一个丰富的大容器,里面 ...

  2. Jsoup问题---获取http协议请求失败 org.jsoup.UnsupportedMimeTypeException: Unhandled content type. Must be text/*, application/xml, or application/xhtml+xml.

    Jsoup问题---获取http协议请求失败 1.问题:用Jsoup在获取一些网站的数据时,起初获取很顺利,但是在访问某浪的数据是Jsoup报错,应该是请求头里面的请求类型(ContextType)不 ...

  3. Jsoup获取部分页面数据失败 org.jsoup.UnsupportedMimeTypeException: Unhandled content type. Must be text/*, application/xml, or application/xhtml+xml.

    用Jsoup在获取一些网站的数据时,起初获取很顺利,但是在访问某浪的数据是Jsoup报错,应该是请求头里面的请求类型(ContextType)不符合要求. 请求代码如下: private static ...

  4. SharePoint自动化系列——Add content type to list.

    转载请注明出自天外归云的博客园:http://www.cnblogs.com/LanTianYou/ 将创建好的content type(若是跨web application需要事先publish c ...

  5. SharePoint自动化系列——Content Type相关timer jobs一键执行

    转载请注明出自天外归云的博客园:http://www.cnblogs.com/LanTianYou/ 背景: 在SharePoint Central Administration->Monito ...

  6. the request doesn't contain a multipart/form-data or multipart/form-data stream, content type header

    the request doesn't contain a multipart/form-data or multipart/form-data stream, content type header ...

  7. Springs Element 'beans' cannot have character [children], because the type's content type is element-only

    Springs Element 'beans' cannot have character [children], because the type's content type is element ...

  8. springboot 报错 Content type 'application/x-www-form-urlencoded;charset=UTF-8' not supported

    开始 controller 方法写的是 @RequestMapping( value = "/add", method = RequestMethod.POST ) public ...

  9. .NET获取文件的MIME类型(Content Type)

    第一种:这种获取MIME类型(Content Type)的方法需要在.NET 4.5之后才能够支持,但是非常简单. 优点:方便快捷 缺点:只能在.NET 4.5之后使用 public FileResu ...

  10. 万能的ctrl+shift+F(Element 'beans' cannot have character [children], because the type's content type is element-only.错误)

    今天在spring-servlet.xml文件中出现了一个莫名其妙的错误:Element 'beans' cannot have character [children], because the t ...

随机推荐

  1. POJ2222 Keywords Search AC自动机模板

    http://acm.hdu.edu.cn/showproblem.php?pid=2222 题意:给出一些单词,求多少个单词在字符串中出现过(单词表单词可能有相同的,这些相同的单词视为不同的分别计数 ...

  2. 多个Fragment在屏幕翻转会重影问题的解决

    fragment使用add和hide而不用replace的方法添加到activity中,如果屏幕翻转可能会又add新的fragment进去,所以会重影. 如果有一个sparsearray保存fragm ...

  3. Java 基础总结--反射的基本操作

    一.反射的概念 JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为 ...

  4. VK Cup 2016 - Round 1 (Div. 2 Edition) A. Bear and Reverse Radewoosh 水题

    A. Bear and Reverse Radewoosh 题目连接: http://www.codeforces.com/contest/658/problem/A Description Lima ...

  5. <摘录>linux文件IO

    这篇文章写的比较全面,也浅显易懂,备份下.转载自:http://blog.chinaunix.net/uid-27105712-id-3270102.html 在Linux 开发中,有几个关系到性能的 ...

  6. Scrapy 轻松定制网络爬虫(转)

    网络爬虫(Web Crawler, Spider)就是一个在网络上乱爬的机器人.当然它通常并不是一个实体的机器人,因为网络本身也是虚拟的东西,所以这个“机器人”其实也就是一段程序,并且它也不是乱爬,而 ...

  7. mysql中日期比较大小的方法

    假如有个表product有个字段add_time,它的数据类型为datetime,有人可能会这样写sql: select * from product where add_time = '2013-0 ...

  8. visual studio xcopy /exclude测试

    http://files.cnblogs.com/files/zfanlong1314/exclude%E6%B5%8B%E8%AF%95.zipxcopy 提供了 /EXCLUDE: 参数用于在复制 ...

  9. SqlServer收缩数据库语句

    ALTER DATABASE [Spacebuilder] SET RECOVERY SIMPLEDBCC SHRINKDATABASE([Spacebuilder], 0)ALTER DATABAS ...

  10. Java Simon--性能瓶颈分析工具

    有了AOP以及Javainstrument之后,Java有很多很好的性能监控工具可以很有效的帮助我们分析系统瓶颈.例如使用jvisualvm的gui连接JVM应用之后可以监控应用的各种状态,可以看到每 ...