2015年(7)
分类: 嵌入式
2015-07-02 18:04:40
原文地址:HTTP Get,Post请求详解 作者:yandaren_1220
请求类型 GET:获取一个文档 例如,要获取Nettuts+ 的文章,http request的第一行通常看起来是这样的: GET /tutorials/other/top-20-mysql-best-practices/ HTTP/1.1 一旦html加载完成,浏览器将会发送GET 请求去获取图片,就像下面这样: GET /wp-content/themes/tuts_theme/images/header_bg_tall.png HTTP/1.1 表单也可以通过GET方法发送,下面是个例子: 当这个表单被提交时,HTTP request 就会像这样: GET /foo.php?first_name=John&last_name=Doe&action=Submit HTTP/1.1 你可以将表单输入通过附加进查询字符串的方式发送至服务器。
用POST请求来发送表单数据是普遍的做法。我们来吧上面的例子改造成使用POST方式: 提交这个表单会创建一个如下的HTTP 请求: POST /foo.php HTTP/1.1 这里有三个需要注意的地方: 第一行的路径已经变为简单的 /foo.php , 已经没了查询字符串。 HEAD:接收头部信息 这个方法可以让浏览器判断页面是否被修改过,从而控制缓存。也可判断所请求的文档是否存在。 例如,假如你要访问的网站上有很多链接,那么你就可以简单的给他们分别发送HEAD请求来判断是否存在死链,这比使用GET要快很多。 HTTP Headers 中的 HTTP请求 所有这些头部信息都可以在PHP的$_SERVER数组中找到。你也可以用getallheaders() 函数一次性获取所有的头部信息。 Host Host: rlog.cn 这只是基本的主机名,包含域名和子级域名。 在PHP中,可以通过$_SERVER['HTTP_HOST'] 或 $_SERVER['SERVER_NAME']来查看。 User-Agent 这个头部可以携带如下几条信息: 浏览器名和版本号. 在PHP中,可以通过 $_SERVER['HTTP_USER_AGENT'] 来获取User-Agent if ( strstr($_SERVER['HTTP_USER_AGENT'],'MSIE 6') ) {
这个信息可以说明用户的默认语言设置。如果网站有不同的语言版本,那么就可以通过这个信息来重定向用户的浏览器。 它可以通过逗号分割来携带多国语言。第一个会是首选的语言,其它语言会携带一个“q”值,来表示用户对该语言的喜好程度(0~1)。 在PHP中用 $_SERVER["HTTP_ACCEPT_LANGUAGE"] 来获取这一信息。 if (substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2) == 'fr') {
大部分的现代浏览器都支持gzip压缩,并会把这一信息报告给服务器。这时服务器就会压缩过的HTML发送给浏览器。这可以减少近80%的文件大小,以节省下载时间和带宽。 在PHP中可以使用 $_SERVER["HTTP_ACCEPT_ENCODING"] 获取该信息。 然后调用ob_gzhandler()方法时会自动检测该值,所以你无需手动检测。 // enables output buffering If-Modified-Since If-Modified-Since: Sat, 28 Nov 2009 06:38:19 GMT 如果自从这个时间以来未被修改过,那么服务器将会返回“304 Not Modified”,而且不会再返回内容。浏览器将自动去缓存中读取内容 在PHP中,可以用$_SERVER['HTTP_IF_MODIFIED_SINCE'] 来检测。 // assume $last_modify_time was the last the output was updated 还有一个叫Etag的HTTP头信息,它被用来确定缓存的信息是否正确,稍后我们将会解释它。 Cookie Cookie: PHPSESSID=r2t5uvjq435r4q7ib3vtdjq120; foo=bar 它是用分号分割的一组名值对。Cookie也可以包含session id。 在PHP中,单一的Cookie可以访问$_COOKIE数组获得。你可以直接用$_SESSION array获取session变量。如果你需要session id,那么你可以使用session_id()函数代替cookie。 echo $_COOKIE['foo'];
例如,我访问Nettuts+的主页并点击了一个链接,这个头部信息将会发送到浏览器: 在PHP中,可以通过 $_SERVER['HTTP_REFERER'] 获取该值。 if (isset($_SERVER['HTTP_REFERER'])) { You may have noticed the word “referrer” is misspelled as “referer”. Unfortunately it made into the official HTTP specifications like that and got stuck.
在PHP中,你可以通过 header() 来设置头部响应信息。PHP已经自动发送了一些必要的头部信息,如 载入的内容,设置 cookies 等等… 你可以通过 headers_list() 函数看到已发送和将要发送的头部信息。你也可以使用headers_sent()函数来检查头部信息是否已经被发送。 Cache-Control 例如: Cache-Control: max-age=3600, public “public”意味着这个响应可以被任何人缓存,“max-age” 则表明了该缓存有效的秒数。允许你的网站被缓存降大大减少下载时间和带宽,同时也提高的浏览器的载入速度。 也可以通过设置 “no-cache” 指令来禁止缓存: Cache-Control: no-cache 更多详情请参见w3.org。 Content-Type Content-Type: text/html; charset=UTF-8 ‘text’ 是文档类型,‘html’则是文档子类型。 这个头部还包括了更多信息,例如 charset。 如果是一个图片,将会发送这样的响应: Content-Type: image/gif 浏览器可以通过mime-type来决定使用外部程序还是自身扩展来打开该文档。如下的例子降调用Adobe Reader: Content-Type: application/pdf 直接载入,Apache通常会自动判断文档的mime-type并且添加合适的信息到头部去。并且大部分浏览器都有一定程度的容错,在头部未提供或者错误提供该信息的情况下它会去自动检测mime-type。 你可以在这里找到一个常用mime-type列表。 在PHP中你可以通过 finfo_file() 来检测文件的ime-type。
Content-Disposition: attachment; filename="download.zip" 他会导致浏览器出现对话框。 Content-Type: application/zip Content-Length Content-Length: 89123 对于文件下载来说这个信息相当的有用。这就是为什么浏览器知道下载进度的原因。 例如,这里我写了一段虚拟脚本,来模拟一个慢速下载。 // it's a zip file
// it's a zip file
Etag: "pub1259380237;gz" 服务器可能会将该信息和每个被发送文件一起响应给浏览器。该值可以包含文档的最后修改日期,文件大小或者文件校验和。浏览会把它和所接收到的文档一起缓存。下一次当浏览器再次请求同一文件时将会发送如下的HTTP请求: If-None-Match: "pub1259380237;gz" 如果所请求的文档Etag值和它一致,服务器将会发送304状态码,而不是2oo。并且不返回内容。浏览器此时就会从缓存加载该文件。
Last-Modified: Sat, 28 Nov 2009 03:50:37 GMT $modify_time = filemtime($file); 它提供了另一种缓存机制。浏览器可能会发送这样的请求: If-Modified-Since: Sat, 28 Nov 2009 06:38:19 GMT 在If-Modified-Since一节我们已经讨论过了。 Location HTTP/1.x 301 Moved Permanently 在PHP中你可以通过这种方式对访客重定向: 默认会发送302状态码,如果你想发送301,就这样写: header('Location: , true, 301);
Set-Cookie: skin=noskin; path=/; domain=.amazon.com; expires=Sun, 29-Nov-2009 21:42:28 GMT 每个cookie会作为单独的一条头部信息。注意,通过js设置cookie将不会体现在HTTP头中。 在PHP中,你可以通过setcookie()函数来设置cookie,PHP会发送合适的HTTP 头。 setcookie("TestCookie", "foobar"); 它会发送这样的头信息: Set-Cookie: TestCookie=foobar 如果未指定到期时间,cookie就会在浏览器关闭后被删除。 WWW-Authenticate WWW-Authenticate: Basic realm="Restricted Area" Content-Encoding Content-Encoding: gzip |