HTTP权威指南阅读笔记三:HTTP报文
报文的组成部分
报文由三部分组成:对报文进行描述的起始行(start line)、包含属性的首部(header),以及可选的、包含数据的主体(body)部分。
请求报文格式
<method> <request-URL> <version>
<headers>
<entity-body>
响应报文格式
<version> <status> <reson-phrase>
<headers>
<entity-body>
HTTP方法
主要的HTTP方法有:
| 方法 | 描述 | 是否包含主体 |
| GET | 从服务器获取一份文档 | 否 |
| HEAD | 只从服务器获取文档的首部 | 否 |
| POST | 向服务器发送需要处理的数据 | 是 |
| PUT | 将请求的主体部分存储在服务器上 | 是 |
| TRACE | 对可能经过代理服务器传送到服务器上去的报文进行追踪 | 否 |
| OPTIONS | 决定可以在服务器上执行哪些方法 | 否 |
| DELETE | 从服务器上删除一份文档 | 否 |
另外,HTTP1.1允许扩展规范中没有的方法。
示例
js部分:
var httpMethodTest = (function () {
"use strict";
var _xhr = new XMLHttpRequest();
var _sendXHR = function (method, url, callback) {
_xhr.onreadystatechange = function () {
if (_xhr.readyState === 4 && _xhr.status === 200) {
callback(_xhr);
}
};
_xhr.open(method, url, true);
_xhr.send('');
};
var get = function (url, callback) {
_sendXHR("GET", url, callback);
};
var put = function (url, callback) {
_sendXHR("PUT", url, callback);
};
var post = function (url, callback) {
_sendXHR("POST", url, callback);
};
var head = function (url, callback) {
_sendXHR("HEAD", url, callback);
};
var trace = function (url, callback) {
_sendXHR("TRACE", url, callback);
};
var options = function (url, callback) {
_sendXHR("OPTIONS", url, callback);
};
var deleteMethod = function (url, callback) {
};
return {
get: get,
put: put,
post: post,
head: head,
trace: trace,
options: options,
deleteMethod: deleteMethod
};
})();
var btnGET = document.getElementById("btnGET"),
btnPOST = document.getElementById("btnPOST"),
btnPUT = document.getElementById("btnPUT"),
btnHEAD = document.getElementById("btnHEAD"),
btnOPTIONS = document.getElementById("btnOPTIONS"),
btnTRACE = document.getElementById("btnTRACE"),
headerResultNode = document.getElementById("headerResult"),
bodyResultNode = document.getElementById("bodyResult"),
headerTitleNode = document.getElementById("headerTitle"),
bodyTitleNode = document.getElementById("bodyTitle");
btnGET.onclick = function () {
headerTitleNode.innerHTML = "GET Response Headers:";
bodyTitleNode.innerHTML = "GET Response Body:";
httpMethodTest.get("/home/Test?t=" + Math.random(), methodResult);
}
btnPOST.onclick = function () {
headerTitleNode.innerHTML = "POST Response Headers:";
bodyTitleNode.innerHTML = "POST Response Body:";
httpMethodTest.post("/home/Test?t=" + Math.random(), methodResult);
}
btnPUT.onclick = function () {
headerTitleNode.innerHTML = "PUT Response Headers:";
bodyTitleNode.innerHTML = "PUT Response Body:";
httpMethodTest.put("/home/Test?t=" + Math.random(), methodResult);
}
btnHEAD.onclick = function () {
headerTitleNode.innerHTML = "HEAD Response Headers:";
bodyTitleNode.innerHTML = "HEAD Response Body:";
httpMethodTest.head("/home/Test?t=" + Math.random(), methodResult);
}
//由于ajax中不可以直接发trace请求,所以这里改为发get请求,然后在controller中作代理发trace请求
btnTRACE.onclick = function () {
headerTitleNode.innerHTML = "TRACE Response Headers:";
bodyTitleNode.innerHTML = "TRACE Response Body:";
httpMethodTest.get("/home/Trace?url=" + encodeURIComponent("http://xxxxx/test.php") + "&t" + Math.random(), methodResult);
}
btnOPTIONS.onclick = function () {
headerTitleNode.innerHTML = "OPTIONS Response Headers:";
bodyTitleNode.innerHTML = "OPTIONS Response Body:";
httpMethodTest.options("/home/Test?t=" + Math.random(), methodResult);
}
//从XMLHttpRequest中取出Header及Body数据
function methodResult(xhr) {
var header = {},
response = "",
results = [];
header["status"] = xhr.status;
header["statusText"] = xhr.statusText;
header["Cache-Control"] = xhr.getResponseHeader("Cache-Control");
header["Content-Type"] = xhr.getResponseHeader("Content-Type");
header["Allow"] = xhr.getResponseHeader("Allow");
header["Content-Encoding"] = xhr.getResponseHeader("Content-Encoding");
header["Vary"] = xhr.getResponseHeader("Vary");
header["Server"] = xhr.getResponseHeader("Server");
header["Date"] = xhr.getResponseHeader("Date");
header["Content-Length"] = xhr.getResponseHeader("Content-Length");
for (var key in header) {
if (header[key]) {
results.push("<li>" + key + ": " + header[key] + "</li>");
}
}
headerResultNode.innerHTML = results.join("");
bodyResultNode.value = xhr.responseText;
}
页面部分:
<div>
<input type="button" id="btnGET" value="GET" />
<input type="button" id="btnPOST" value="POST" />
<input type="button" id="btnPUT" value="PUT" />
<input type="button" id="btnHEAD" value="HEAD" />
<input type="button" id="btnTRACE" value="TRACE" />
<input type="button" id="btnOPTIONS" value="OPTIONS" />
</div>
<h3 id="headerTitle">Response Headers:</h3>
<ul id="headerResult" class="list-txt"> </ul>
<h3 id="bodyTitle">Response Body:</h3>
<textarea id="bodyResult" class="list-txt" rows="5" disabled="disabled"></textarea>
controller中发送trace请求:
public void Test()
{
Response.ClearContent();
if (Request.HttpMethod.Equals("OPTIONS"))
{
Response.AddHeader("Allow", "GET, POST, PUT, DELETE, TRACE, OPTIONS");
}
else
{
Response.Write("This is a " + Request.HttpMethod);
}
Response.End();
} public void Trace(string url)
{
HttpWebRequest httpWReq = (HttpWebRequest)WebRequest.Create(url); httpWReq.Method = "TRACE";
httpWReq.ContentType = "application/x-www-form-urlencoded"; HttpWebResponse response = (HttpWebResponse)httpWReq.GetResponse(); string responseString = new StreamReader(response.GetResponseStream()).ReadToEnd();
Response.ClearContent();
Response.Write(responseString);
Response.End();
}
运行结果:
get/put/post的header及body类似,也很常见,这里就不帖图了

HEAD

TRACE

OPTIONS
HTTP权威指南阅读笔记三:HTTP报文的更多相关文章
- Kafka 权威指南阅读笔记(第三章,第四章)
Kafka 第三章,第四章阅读笔记 Kafka 发送消息有三种方式:不关心结果的,同步方式,异步方式. Kafka 的异常主要有两类:一种是可重试异常,一种是无需重试异常. 生产者的配置: acks ...
- Javascript权威指南阅读笔记--第3章类型、值和变量(1)
之前一直有个想法,好好读完JS权威指南,便于自己对于JS有个较为全面的了解.毕竟本人非计算机专业出生,虽然做着相关行业的工作,但总觉得对于基础的掌握并没有相关专业学者扎实,正好因为辞职待业等原因,还是 ...
- Hadoop权威指南学习笔记三
HDFS简单介绍 声明:本文是本人基于Hadoop权威指南学习的一些个人理解和笔记,仅供学习參考.有什么不到之处还望指出,一起学习一起进步. 转载请注明:http://blog.csdn.net/my ...
- mycat权威指南阅读笔记--序言1
前言 mycat官方地址http://www.mycat.io/,mycat是关系数据库的中间件,也就是说它可以把后端的多个数据库,抽象成一个关系数据库. mycat能干啥 官方文档介绍,主要是用来做 ...
- html5+css3 权威指南阅读笔记(三)---表单及其它新增和改良元素
一.新增元素及属性 1.表单内元素的form属性. html5: <form id="testForm"> <input type=text> </f ...
- netty权威指南学习笔记三——TCP粘包/拆包之粘包现象
TCP是个流协议,流没有一定界限.TCP底层不了解业务,他会根据TCP缓冲区的实际情况进行包划分,在业务上,一个业务完整的包,可能会被TCP底层拆分为多个包进行发送,也可能多个小包组合成一个大的数据包 ...
- HTTP权威指南阅读笔记五:Web服务器
Web服务器会做些什么: 1.建产连接:接受一个客户端连接,或者如果不希望与这个客户端建立连接,就将其关闭. 1)处理新连接 2)客户端主机名识别 3)通过ident确定客户端用户 ident在组织内 ...
- HTTP权威指南阅读笔记四:连接管理
HTTP通信是由TCP/IP承载的,HTTP紧挨着TCP,位于其上层,所以HTTP事务的性能很大程度上取决于底层TCP通道的性能. HTTP事务的时延 如图: HTTP事务的时延有以下几种主要原因. ...
- JavaScript权威指南阅读笔记3
第六章 对象 1.首先是先介绍了对象直接量的格式:对象直接量就是1.由若干个名/值对组成的映射表,2名/值对中间由冒号分割,3名值对之间由逗号分割,4整个映射表由花括号括起来.这样就组成了一个对象直接 ...
随机推荐
- 一步步编写avalon组件01:弹出层组件
avalon2已经稳定下来,是时候教大家如何使用组件这个高级功能了. 组件是我们实现叠积木开发的关键. avalon2实现一个组件非常轻松,并且如何操作这个组件也比以前的avalon2,还是react ...
- html a tag's href javascript issue
a标签的href中写js中遇到的问题(ie中有问题,chrome没问题) <a class="free" href="javascript:{$('#suiteTy ...
- 编程范式 epesode7,8 stack存放指针类型and heap,register
这一节从后往前写. ____stack and heap ___stack由 汇编语言操控管理,数据先入后出. 栈是存放局部变量,函数调用子函数时,该函数在栈中占用的空间会增大,用于存放子函数的局部变 ...
- 1.Mybatis原理
Mybatis是一个持久层框架,Apache底下的一个项目,它的前身是ibatis,它支持普通的SQL查询,存储过程和高级映射的优秀框架.Mybatis消除了几乎所有的JDBC代码和参数的手工设置以及 ...
- Mysql错误信息汇总
目录: 1. Every derived table must have its own alias 内容: 1. Every derived table must have its own alia ...
- [python] defaultdict
import collections s = [('yellow', 1), ('blue', 2), ('yellow', 3), ('blue', 4), ('red', 1)] # defaul ...
- NLPP-00-Preparation
NLPP is short for Natural Language Processing with Python <Python 自然语言处理(Natural Language Process ...
- Swift3.0基础语法学习<五>
异常处理: // // ViewController5.swift // SwiftBasicDemo // // Created by 思 彭 on 16/11/16. // Copyright © ...
- Genome-wide Complex Trait Analysis(GCTA)-全基因组复杂性状分析
GCTA(全基因组复杂性状分析)工具开发目的是针对复杂性状的全基因组关联分析,评估SNP解释的表型方差所占的比例(该网站地址:http://cnsgenomics.com/software/gcta/ ...
- 2.Java对象创建
1. 对象的创建 虚拟机遇到一条new指令时,首先将去检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已被加载.解析和初始化过.如果没有,那必须先执行相应的类 ...