-1

本人是个PHPer, 工作几年了, HTTP这块一直是个过不去的坎儿, 像是 那一大堆状态码,一大堆的首部字段 等等很多细节, 本人完全不知道怎么开始, 一直想研究如何使用HTTP协议实现自己的HttpResponse,HttpRequest类?

可看了Symfony等一些框架的源码, 发现很细, 每个状态码, 方法都有纳入, 但我怎么才能知道每个状态码都是具体什么意思? 总感觉哪怕有一个状态码不知道是什么准确意思也过不了自己这关,况且面试也老问,(但好像看了HTTP权威,感觉书上也说的稀里糊涂), symfony也不会就那么稀里糊涂的纳入代码中吧, 肯定每个都有其具体用途的

求大家给指点该怎么去学这些东西

5个回答

2

被踩了,才发现题主已经提到了这本书。

题主主要是想了解怎么自己写 Request/Response 这些东西的话,其实主要就是在解析下面这个东西:

Method SP Request-URI SP HTTP-Version CRLF           
*(( general-header        
   | request-header         
   | entity-header ) CRLF) 
CRLF
[ message-body ]
来源: HTTP请求parse流程、RequestLineParser、HttpQueryParameterParser

状态码 这个东西,其实看看表对应一下就可以了,因为这个是全世界大家一起遵守的。
但是 头部 这个东西,就不是那么回事了,你可以选择性得去支持一些头部,因为 HTTP 允许你定义一个只有你自己的服务端才会解析的 头部
上面请求体结构中 general-header 是大多数情况下都是比较常见的、大家都遵守的一些头部信息。而 request-headerentity-header 这两部分就属于比较自由的地方了,你可以去解析并执行相应的处理,也可以忽略它。

具体到【服务端产出了什么样的 response 应该对应哪个 状态码】、【客户端传输了什么 header 要求服务端做什么事】、【服务端传输了什么header要求客户端做什么事】这三个问题,常见的情况都可以在《HTTP权威指南》的附录B、附录C找到。


原答案:

强烈推荐 《HTTP 权威指南》 一书。

0

request和response是http生命周期中的东西,相当于输入输出,你可以这样的思维去应用,将php输入变量到request,如常见的超全局变量_GET,_POST,_SERVER。

0

首先你需要知道各种约定 ,rfc那些,建议你看看《图解HTTP》,这本书讲的不错,

再就看看源码就大概知道怎么回事了,实现它也就是水到渠成。

0

哥们,既然你要写自己的response和request类,何不参考一下psr7 http的规范呢.又可以了解psr规范,其实基本上各大框架的http响应都是基于psr7规范来的.当然,你如果不知道,我觉得你可以去看一下slim的request,response实现,这个很简单.然后基于这个你就可以写自己的response,和request类
PSR-7 HTTP 消息接口规范
当然,专业的phper一定会知道,以下的这些规范

psr-0    自动加载规范   废弃
psr-1    基础编码规范   通过
psr-2    编码风格规范   通过
psr-3    日志接口规范   通过
psr-4    自动加载规范   通过
psr-5    PHPDoc 标准   抛弃
psr-6    缓存接口规范   通过
psr-7    HTTP 消息接口规范  通过
psr-8    Huggable 接口 抛弃
psr-9    项目安全问题公示  抛弃
psr-10    项目安全上报方法  抛弃
psr-11    服务容器接口  通过
psr-12    全量编码风格规范  审核中
psr-13    超媒体链接  通过
psr-14    事件管理  抛弃
psr-15    HTTP消息处理    起草
psr-16    简单缓存    通过
psr-17    HTTP Factories    抛弃
psr-18    HTTP Client    起草

当然,我们熟悉的composer就是遵循了psr-4自动加载规范.作为一个专业的phper你不能不知道这些规范.
以下附上一些文档资料

[psr规范中文网站](http://psr.phphub.org/)
[psr规范翻译](https://github.com/summerblue/psr.phphub.org/tree/master/psrs)
[psr官方网站](http://www.php-fig.org/psr/)

中文可能不全,如果要全的,请查看英文网站

0
100 => "HTTP/1.1 100 Continue", 
101 => "HTTP/1.1 101 Switching Protocols", 
200 => "HTTP/1.1 200 OK", 
201 => "HTTP/1.1 201 Created", 
202 => "HTTP/1.1 202 Accepted", 
203 => "HTTP/1.1 203 Non-Authoritative Information", 
204 => "HTTP/1.1 204 No Content", 
205 => "HTTP/1.1 205 Reset Content", 
206 => "HTTP/1.1 206 Partial Content", 
300 => "HTTP/1.1 300 Multiple Choices", 
301 => "HTTP/1.1 301 Moved Permanently", 
302 => "HTTP/1.1 302 Found", 
303 => "HTTP/1.1 303 See Other", 
304 => "HTTP/1.1 304 Not Modified", 
305 => "HTTP/1.1 305 Use Proxy", 
307 => "HTTP/1.1 307 Temporary Redirect", 
400 => "HTTP/1.1 400 Bad Request", 
401 => "HTTP/1.1 401 Unauthorized", 
402 => "HTTP/1.1 402 Payment Required", 
403 => "HTTP/1.1 403 Forbidden", 
404 => "HTTP/1.1 404 Not Found", 
405 => "HTTP/1.1 405 Method Not Allowed", 
406 => "HTTP/1.1 406 Not Acceptable", 
407 => "HTTP/1.1 407 Proxy Authentication Required", 
408 => "HTTP/1.1 408 Request Time-out", 
409 => "HTTP/1.1 409 Conflict", 
410 => "HTTP/1.1 410 Gone", 
411 => "HTTP/1.1 411 Length Required", 
412 => "HTTP/1.1 412 Precondition Failed", 
413 => "HTTP/1.1 413 Request Entity Too Large", 
414 => "HTTP/1.1 414 Request-URI Too Large", 
415 => "HTTP/1.1 415 Unsupported Media Type", 
416 => "HTTP/1.1 416 Requested range not satisfiable", 
417 => "HTTP/1.1 417 Expectation Failed", 
500 => "HTTP/1.1 500 Internal Server Error", 
501 => "HTTP/1.1 501 Not Implemented", 
502 => "HTTP/1.1 502 Bad Gateway", 
503 => "HTTP/1.1 503 Service Unavailable", 
504 => "HTTP/1.1 504 Gateway Time-out"

前期可以处理一些常见的状态码

撰写答案