热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Python爬虫十六式-第一式:HTTP协议

Hello,大家好啊,我是Connor,有的人一说什么是HTTP协议就犯愁,写东西的时候也没想过什么

Hello,大家好啊,我是Connor,有的人一说什么是HTTP协议就犯愁,写东西的时候也没想过什么是HTTP协议,只是知道HTTP协议是用来网页传输的,但是再深究一点就不明白了,所以今天我们来讲一讲什么是HTTP协议。

Python 爬虫十六式 - 第一式:HTTP协议

1.HTTP 与 HTTPS

1.1 什么是HTTP协议

超文本传输协议(HTTP,HyperText Transfer Protocol) 是互联网上应用最为广泛的一种网络协议。所有的WWW文件都必须遵守这个标准。设计HTTP最初的目的是为了提供一种发布和接收HTML页面的方法。 HTTP协议是用于从WWW服务器传输超文本到本地浏览器的传送协议。它可以使浏览器更加高效,使网络传输减少。它不仅保证计算机正确快速地传输超文本文档,还确定传输文档中的哪一部分,以及哪部分内容首先显示(如文本先于图形)等。

HTTP是一个应用层协议,由请求和响应构成,是一个标准的客户端服务器模型。

一次HTTP请求的基本流程一般是,在建立TCP连接后,由客户端向服务端发起一次请求request,而服务器在接收到以后返回给客户端一个响应response。所以我们看到的HTTP请求内容一般就分为请求和响应两部分。

HTTP协议通常承载于TCP协议之上,默认HTTP的端口号为80。有时也承载于TLS或SSL协议层之上,这个时候,就成了我们常说的HTTPS,稍后我们会详细说HTTP和HTTPS的区别。

1.2 HTTP协议的特点

  1. http协议支持客户端/服务端模式,也是一种请求/响应模式的协议。

  2. 无连接。所谓的无连接就是服务器收到了客户端的请求之后,响应完成并收到客户端的应答之后,即断开连接。限制每次的连接只处理一次请求。从而节省传输时间。

  3. 无状态。HTTP协议是无状态的,也就是说每一次HTTP请求之间都是相互独立的,没有联系的,服务端不知道客户端具体的状态。比如客户端访问一次网页之后关闭浏览器,然后再一次启动浏览器,再访问该网站,服务器是不知道客户关闭了一次浏览器的。这样设计的原因是因为Web服务器一般需要面对很多浏览器的并发访问,为了提高Web服务器对并发访问的处理能力,在设计HTTP协议时规定Web服务器发送HTTP应答报文和文档时,不保存发出请求的Web浏览器进程的任何状态信息

  4. 简单快捷:所谓的简单快捷是指客户端向服务器请求服务时,一般来说只需要传输请求方法和路径,就能进行访问。

  5. 灵活:客户端可以通过HTTP协议传输任意类型的数据,包括但不限于文本,图片,视频等

1.3 HTTP与HTTPS的区别

HTTP大家都知道是什么东西了,那什么是HTTPS呢?HTTPS是以安全为目标的HTTP通道,简单讲是HTTP的安全版,即HTTP下加入SSL层,HTTPS的安全基础是SSL,承载于SSL协议层之上。因此加密的详细内容就需要SSL。

区别 HTTP HTTPS
安全性 不安全 安全
是否需要证书 不需要 需要
传输方式 明文传输 加密传输
默认端口 80 443

HTTPS和HTTP相比的主要优势就是体现在它的安全性上,它的缺点也很明显,体现在它的行能和技术方面,具体的优缺点我们不再多说,大家可以自行体会。

2.HTTP 请求

每一个HTTP请求都由三部分组成,分别是:请求行、请求报头、请求正文。

2.1 请求行

请求行一般由 请求方法url路径协议版本 组成,如下所示:

GETwww.baidu.com HTTP/1.1

通过上面我们可以看到请求行分了三个部分,其中 GET 就是请求行中的请求方法, https://www.baidu.com 就是请求行中的url路径, HTTP/1.1 就是它的协议版本。

2.2 请求报头(请求头)

请求头遵循以下格式:

名字:空格 + 值

常用的请求头的属性如下:

属性名 作用
Host 指定的请求资源的域名(主机和端口号)。HTTP请求必须包含HOST,否则系统会以400状态码返回。
User-Agent 简称UA,内容包含发出请求的用户信息,通常UA包含浏览者的信息,主要是浏览器的名称版本和所用的操作系统。这个UA头不仅仅是使用浏览器才存在,只要使用了基于HTTP协议的客户端软件都会发送,无论是手机端还是PDA等,这个UA头是辨别客户端所用设备的重要依据。
Accept 告诉服务器可以接受的文件格式。
COOKIE 告诉浏览器COOKIE信息
Cache-Control 指定请求和响应遵循的缓存机制。
Referer 页面跳转处,表明请求来自于哪个URL,用户是从该哪个页面访问到当前页面的。
Content-Length 内容长度。
Content-Range 响应的资源范围。可以在每次请求中标记请求的资源范围,在连接断开重连时,客户端只请求该资源未下载的部分,而不是重新请求整个资源,实现断点续传。
Accept-Encoding 指定所能够接受的编码方式
Accept-Language 指浏览器可以接受的语言种类 en、en-us指英语 zh、zh-cn指中文。
Connection 客户端与服务器链接类型,keep-alive:保持链接,close:关闭链接。

当然这些知识列举出了平时常用的一些请求头属性,有些网站也会使用自定义的属性,会使用诸如su,x-index等各种非常用属性之外的属性,非常容易鉴别。

2.3 请求正文

请求正文通常只有使用POST方式进行请求的时候才会有请求正文,如果使用GET请求的话,是不会有请求正文的,具体情况将会在后面的GET与POST请求处细说。

2.4 HTTP请求方法

HTTP协议中定义的请求方法有以下几种:

序号 方法 描述
1 GET 请求指定的页面信息,并返回实体主体。
2 HEAD 类似于get请求,只不过返回的响应中没有具体的内容,用于获取报头
3 POST 向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会导致新的资源的建立和/或已有资源的修改。
4 PUT 从客户端向服务器传送的数据取代指定的文档的内容。
5 DELETE 请求服务器删除指定的页面。
6 CONNECT HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。
7 OPTIONS 允许客户端查看服务器的性能。
8 TRACE 回显服务器收到的请求,主要用于测试或诊断。

虽然HTTP请求中定义的方法有这么多种,但是我们平常使用的基本只有 GETPOST 两种方法,而且大部分网站都是禁用掉了除 GETPOST 外其他的方法。

因为其他几种方法通过 GET 或者 POST 都能实现,而且对于网站来说更加的安全和可控。

  • GET

    其实简单来说, GET 方法一般用来负责获取数据,或者将一些简短的数据放到URL参数中传递到服务器。比 POST 更加高效和方便。

  • POST

    由于 GET 方法最多在url中携带1024字节数据,且将数据放到URL中传递太不安全,数据量大时URL也会变得冗长。所以传递数据量大或者安全性要求高的数据的时候,最好使用 POST 方法来传递数据。

3.HTTP响应

每一个HTTP请求也都由三部分组成和请求行类似,分别是:响应行、响应报头、响应正文。

3.1 响应行

状态行由HTTP协议版本号, 状态码, 状态消息三部分组成。如下所示:

HTTP/1.1 200 OK

上面我们看到了响应行的内容,其中 HTTP/1.1 是协议版本号, 200 是状态码, OK 是状态消息。

2.2响应正文

响应头格式和请求头格式相同,遵循以下格式:

名字:空格 + 值

常用的响应头属性如下:

属性名 作用
Allow 服务器支持哪些请求方法(如GET、POST等)
Date 表示消息发送的时间,时间的描述格式为格林威治时间
Set-COOKIE 用于把COOKIE发送到客户端浏览器,每一个写入COOKIE都会生成一个Set-COOKIE
Expires 可以理解为过期时间,当到期之后浏览器会从服务器重新获取,放弃本地缓存文档
Content-Type WEB服务器告诉客户端自己响应的对象的类型和字符集
Content-Encoding 文档的编码(Encode)方法。只有在解码之后才可以得到Content-Type头指定的内容类型。利用gzip压缩文档能够显著地减少HTML文档的下载时间
Content-Length 指明实体正文的长度,以字节方式存储的十进制数字来表示
Location 用于重定向一个新的位置,包含新的URL地址。表示客户应当到哪里去提取文档
Refresh 表示浏览器应该在多少时间之后刷新文档,以秒计

3.3 响应正文

服务器返回的数据。

3.4 状态码

当客户端向服务端发起一次请求后,服务端在返回的响应头中会包含一个HTTP状态码,以表明这一次请求的状态。下面是一些常见的状态码:

  • 200 - 请求成功
  • 301 - 资源(网页等)被永久转移到其它URL
  • 404 - 请求的资源(网页等)不存在
  • 500 - 内部服务器错误

HTTP的状态码是由三位数字来表示的,由第一位数字来表示状态码的类型,一般来说有五种类型:

分类 分类描述
1** 信息,服务器收到请求,需要请求者继续执行操作
2** 成功,操作被成功接收并处理
3** 重定向,需要进一步的操作以完成请求
4** 客户端错误,请求包含语法错误或无法完成请求
5** 服务器错误,服务器在处理请求的过程中发生了错误

以下是详细的状态码列表:

状态码 状态码英文名称 中文描述
100 Continue 继续。客户端应继续其请求
101 Switching Protocols 切换协议。服务器根据客户端的请求切换协议。只能切换到更高级的协议,例如,切换到HTTP的新版本协议
200 OK 请求成功。一般用于GET与POST请求
201 Created 已创建。成功请求并创建了新的资源
202 Accepted 已接受。已经接受请求,但未处理完成
203 Non-Authoritative Information 非授权信息。请求成功。但返回的meta信息不在原始的服务器,而是一个副本
204 No Content 无内容。服务器成功处理,但未返回内容。在未更新网页的情况下,可确保浏览器继续显示当前文档
205 Reset Content 重置内容。服务器处理成功,用户终端(例如:浏览器)应重置文档视图。可通过此返回码清除浏览器的表单域
206 Partial Content 部分内容。服务器成功处理了部分GET请求
300 Multiple Choices 多种选择。请求的资源可包括多个位置,相应可返回一个资源特征与地址的列表用于用户终端(例如:浏览器)选择
301 Moved Permanently 永久移动。请求的资源已被永久的移动到新URI,返回信息会包括新的URI,浏览器会自动定向到新URI。今后任何新的请求都应使用新的URI代替
302 Found 临时移动。与301类似。但资源只是临时被移动。客户端应继续使用原有URI
303 See Other 查看其它地址。与301类似。使用GET和POST请求查看
304 Not Modified 未修改。所请求的资源未修改,服务器返回此状态码时,不会返回任何资源。客户端通常会缓存访问过的资源,通过提供一个头信息指出客户端希望只返回在指定日期之后修改的资源
305 Use Proxy 使用代理。所请求的资源必须通过代理访问
306 Unused 已经被废弃的HTTP状态码
307 Temporary Redirect 临时重定向。与302类似。使用GET请求重定向
400 Bad Request 客户端请求的语法错误,服务器无法理解
401 Unauthorized 请求要求用户的身份认证
402 Payment Required 保留,将来使用
403 Forbidden 服务器理解请求客户端的请求,但是拒绝执行此请求
404 Not Found 服务器无法根据客户端的请求找到资源(网页)。通过此代码,网站设计人员可设置"您所请求的资源无法找到"的个性页面
405 Method Not Allowed 客户端请求中的方法被禁止
406 Not Acceptable 服务器无法根据客户端请求的内容特性完成请求
407 Proxy Authentication Required 请求要求代理的身份认证,与401类似,但请求者应当使用代理进行授权
408 Request Time-out 服务器等待客户端发送的请求时间过长,超时
409 Conflict 服务器完成客户端的PUT请求是可能返回此代码,服务器处理请求时发生了冲突
410 Gone 客户端请求的资源已经不存在。410不同于404,如果资源以前有现在被永久删除了可使用410代码,网站设计人员可通过301代码指定资源的新位置
411 Length Required 服务器无法处理客户端发送的不带Content-Length的请求信息
412 Precondition Failed 客户端请求信息的先决条件错误
413 Request Entity Too Large 由于请求的实体过大,服务器无法处理,因此拒绝请求。为防止客户端的连续请求,服务器可能会关闭连接。如果只是服务器暂时无法处理,则会包含一个Retry-After的响应信息
414 Request-URI Too Large 请求的URI过长(URI通常为网址),服务器无法处理
415 Unsupported Media Type 服务器无法处理请求附带的媒体格式
416 Requested range not satisfiable 客户端请求的范围无效
417 Expectation Failed 服务器无法满足Expect的请求头信息
500 Internal Server Error 服务器内部错误,无法完成请求
501 Not Implemented 服务器不支持请求的功能,无法完成请求
502 Bad Gateway 充当网关或代理的服务器,从远端服务器接收到了一个无效的请求
503 Service Unavailable 由于超载或系统维护,服务器暂时的无法处理客户端的请求。延时的长度可包含在服务器的Retry-After头信息中
504 Gateway Time-out 充当网关或代理的服务器,未及时从远端服务器获取请求
505 HTTP Version not supported 服务器不支持请求的HTTP协议的版本,无法完成处理

4. URI、URL、URN

4.1 URI、URL、URN的定义

什么是URI? 什么是URL? 什么又是URN?三个概念中我们接触的最多的就是URL,那URN和URI又是什么东西呢?怎么以前没听过呢?我们来看他们三个的定义:

URI:Uniform Resource Identifier,即统一资源标志符,用来唯一的标识一个资源。

URL:Uniform Resource Locator,统一资源定位符。即URL可以用来标识一个资源,而且还指明了如何locate这个资源。

URN:Uniform Resource Name,统一资源命名。即通过名字来表示资源的。

下面我们重点说一下URL的格式,再来说一下URI、URL、URN的区别:

4.2 URL的格式:

一个完整的URL包含协议名称,主机名称(IP或者域名)、端口号(没写端口号默认 为80端口)、路径、查询字符串和锚这6个部分。比如:

http:80//www.quanshuwang.com/modules/article/search.php?searchkey=abcd&searchtype=1&page=2#top

http 是它的协议名称, www.quanshuwang.com 就是它的域名, :80 是它的端口号,http和https的默认端口号我们上面都说过了,不再细述, /modules/article/search.php 是它的路径, searchtype=1&page=2 是它的查询字符串, #top 是它的锚点

4.3 URI,URL,URN之间的关系:

Python 爬虫十六式 - 第一式:HTTP协议

上图中我们可以看到,URL和URN是URI的子集,URI是统一资源标志符,而URL除了有标识的功能之外,还有定位的功能,可以用来描述资源的具体位置,还指明了获取资源所采用的协议。

URN也是URL的一种表现形式,它和URL的区别就是与资源的位置无关,正式由于位置的无关性,被某个URN标识的资源在位置发生变化时,其URI可以保持不变。但是我们在平时的使用中几乎没有用URN的,更多的用的是URL。所以URL和URN都是URI的一种扩展,一种表现形式,URL和URN肯定是一个URI,但是URI不一定是URN或URL。

5. COOKIE

COOKIE 有时也用其复数形式 COOKIEs ,英文是饼干的意思。指某些网站为了辨别用户身份、进行 session 跟踪而储存在用户本地终端上的数据(通常经过加密)。

COOKIE 其实就是由服务器发给客户端的特殊信息,而这些信息以文本文件的方式存放在客户端,然后客户端每次向服务器发送请求的时候都会带上这些特殊的信息。 服务器在接收到 COOKIE 以后,会验证 COOKIE 的信息,以此来辨别用户的身份,当然如果有需求,服务器还可以根据需要对COOKIE的内容进行修改。

5.1 COOKIE的作用

COOKIE 其实是HTTP请求头的扩展部分,由于HTTP协议是无状态的协议,所以为了在网页上实现登陆之类的需求,所以扩展了 COOKIE 这样的功能。

每一次HTTP请求在数据交换完毕之后就会关闭连接,所以下一次HTTP请求就无法让服务端得知你和上一次请求的关系。而使用了 COOKIE 之后,你在第一次登陆之类的请求成功之后,服务器会在 Response 的头信息中给你返回 COOKIE 信息,你下一次访问的时候带上这个COOKIE信息,则服务器就能识别你为上一次成功登陆的用户。

5.2 COOKIE的内容

COOKIE 一般保存的格式为json格式,由一些属性组成。

- name: COOKIE 的名称 - value: COOKIE 的值 - domain:可以使用此 COOKIE 的域名 - path:可以使用此 COOKIE 的页面路径 - expires/Max-Age:此 COOKIE 的超时时间 - secure:设置是否只能通过https来传递此条 COOKIE

5.3 domain属性

域名一般来说分为顶级域名,二级域名,三级域名等等。

例如baidu.com是一个顶级域名,而www.baidu.com和map.baidu.com就是二级域名,依次类推。

而在我们的 COOKIE 来说,都有一个 domain 属性,这个属性限制了访问哪些域名时可以使用这一条 COOKIE 。因为每个网站基本上都会分发 COOKIE ,所以 domain 属性就可以让我们在访问新浪时不会带上百度分发给我们的 COOKIE

而在同一系的域名中,顶级域名是无法使用其二级域名的 COOKIE 的,也就是说访问baidu.com的时候是不会带上map.baidu.com分发的 COOKIE 的,二级域名之间的 COOKIE 也不可以共享。但访问二级域名时是可以使用顶级域名的 COOKIE 的。

5.4 path属性

path属性为可以访问此COOKIE的页面路径。比如domain是abc.com,path是/test,那么只有/test路径下的页面可以读取此COOKIE。

5.5 expires/Max-Age属性

字段为此COOKIE超时时间。若设置其值为一个时间,那么当到达此时间后,此COOKIE失效。不设置的话默认值是Session,意思是COOKIE会和session一起失效。当浏览器关闭(不是浏览器标签页,而是整个浏览器) 后,此COOKIE失效。

6. Session

Session,中文经常翻译为会话,其本来的含义是指有始有终的一系列动作/消息,比如打电话时从拿起电话拨号到挂断电话这中间的一系列过程可以称之为一个session。这个词在各个领域都有在使用。

而我们web领域,一般使用的是其本义, 一个浏览器窗口从打开到关闭这个期间

Session的目的则是,在一个客户从打开浏览器到关闭浏览器这个期间内,发起的所有请求都可以被识别为同一个用户。而实现的方式则是,在一个客户打开浏览器开始访问网站的时候,会生成一个SessionID,这个ID每次的访问都会带上,而服务器会识别这个SessionID并且将与这个SessionID有关的数据保存在服务器上。由此来实现客户端的状态识别。

Session与COOKIE相反,Session是存储在服务器上的数据,只由客户端传上来的SessionId来进行判定,所以相对于COOKIE,Session的安全性更高。

一般SessionID会在浏览器被关闭时丢弃,或者服务器会验证Session的活跃程度,例如30分钟某一个SessionID都没有活跃,那么也会被识别为失效。

以上就是HTTP有关的所有内容了,我是Connor,一个什么都不会的小白,如果觉得我说的有什么不对的地方,欢迎指出!如果觉得我写的还不错的话,帮我点个赞吧(❤ ω ❤)

Python 爬虫十六式 - 第一式:HTTP协议

以上所述就是小编给大家介绍的《Python 爬虫十六式 - 第一式:HTTP协议》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 我们 的支持!


推荐阅读
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • t-io 2.0.0发布-法网天眼第一版的回顾和更新说明
    本文回顾了t-io 1.x版本的工程结构和性能数据,并介绍了t-io在码云上的成绩和用户反馈。同时,还提到了@openSeLi同学发布的t-io 30W长连接并发压力测试报告。最后,详细介绍了t-io 2.0.0版本的更新内容,包括更简洁的使用方式和内置的httpsession功能。 ... [详细]
  • 在重复造轮子的情况下用ProxyServlet反向代理来减少工作量
    像不少公司内部不同团队都会自己研发自己工具产品,当各个产品逐渐成熟,到达了一定的发展瓶颈,同时每个产品都有着自己的入口,用户 ... [详细]
  • 如何去除Win7快捷方式的箭头
    本文介绍了如何去除Win7快捷方式的箭头的方法,通过生成一个透明的ico图标并将其命名为Empty.ico,将图标复制到windows目录下,并导入注册表,即可去除箭头。这样做可以改善默认快捷方式的外观,提升桌面整洁度。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • Windows下配置PHP5.6的方法及注意事项
    本文介绍了在Windows系统下配置PHP5.6的步骤及注意事项,包括下载PHP5.6、解压并配置IIS、添加模块映射、测试等。同时提供了一些常见问题的解决方法,如下载缺失的msvcr110.dll文件等。通过本文的指导,读者可以轻松地在Windows系统下配置PHP5.6,并解决一些常见的配置问题。 ... [详细]
  • 使用Ubuntu中的Python获取浏览器历史记录原文: ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • 本文研究了使用条件对抗网络进行图片到图片翻译的方法,并提出了一种通用的解决方案。通过学习输入图像到输出图像的映射和训练相应的损失函数,我们可以解决需要不同损失函数公式的问题。实验证明该方法在合成图片、重构目标和给图片着色等多个问题上都很有效。这项工作的重要发现是不再需要人为构建映射函数和损失函数,同时能够得出合理的结果。本文的研究对于图片处理、计算机图片合成和计算机视觉等领域具有重要意义。 ... [详细]
  • 怎么在PHP项目中实现一个HTTP断点续传功能发布时间:2021-01-1916:26:06来源:亿速云阅读:96作者:Le ... [详细]
author-avatar
王大胖_wa_ngli
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有