报文的组成部分

  报文由三部分组成:对报文进行描述的起始行(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报文的更多相关文章

  1. Kafka 权威指南阅读笔记(第三章,第四章)

    Kafka 第三章,第四章阅读笔记 Kafka 发送消息有三种方式:不关心结果的,同步方式,异步方式. Kafka 的异常主要有两类:一种是可重试异常,一种是无需重试异常. 生产者的配置: acks ...

  2. Javascript权威指南阅读笔记--第3章类型、值和变量(1)

    之前一直有个想法,好好读完JS权威指南,便于自己对于JS有个较为全面的了解.毕竟本人非计算机专业出生,虽然做着相关行业的工作,但总觉得对于基础的掌握并没有相关专业学者扎实,正好因为辞职待业等原因,还是 ...

  3. Hadoop权威指南学习笔记三

    HDFS简单介绍 声明:本文是本人基于Hadoop权威指南学习的一些个人理解和笔记,仅供学习參考.有什么不到之处还望指出,一起学习一起进步. 转载请注明:http://blog.csdn.net/my ...

  4. mycat权威指南阅读笔记--序言1

    前言 mycat官方地址http://www.mycat.io/,mycat是关系数据库的中间件,也就是说它可以把后端的多个数据库,抽象成一个关系数据库. mycat能干啥 官方文档介绍,主要是用来做 ...

  5. html5+css3 权威指南阅读笔记(三)---表单及其它新增和改良元素

    一.新增元素及属性 1.表单内元素的form属性. html5: <form id="testForm"> <input type=text> </f ...

  6. netty权威指南学习笔记三——TCP粘包/拆包之粘包现象

    TCP是个流协议,流没有一定界限.TCP底层不了解业务,他会根据TCP缓冲区的实际情况进行包划分,在业务上,一个业务完整的包,可能会被TCP底层拆分为多个包进行发送,也可能多个小包组合成一个大的数据包 ...

  7. HTTP权威指南阅读笔记五:Web服务器

    Web服务器会做些什么: 1.建产连接:接受一个客户端连接,或者如果不希望与这个客户端建立连接,就将其关闭. 1)处理新连接 2)客户端主机名识别 3)通过ident确定客户端用户 ident在组织内 ...

  8. HTTP权威指南阅读笔记四:连接管理

    HTTP通信是由TCP/IP承载的,HTTP紧挨着TCP,位于其上层,所以HTTP事务的性能很大程度上取决于底层TCP通道的性能. HTTP事务的时延 如图: HTTP事务的时延有以下几种主要原因. ...

  9. JavaScript权威指南阅读笔记3

    第六章 对象 1.首先是先介绍了对象直接量的格式:对象直接量就是1.由若干个名/值对组成的映射表,2名/值对中间由冒号分割,3名值对之间由逗号分割,4整个映射表由花括号括起来.这样就组成了一个对象直接 ...

随机推荐

  1. oracle 做算法 数据为空时,默认为0

    SELECT NVL('',0) FROM DUAL 获取当前日期: SELECT SYSDATE FROM DUAL 当前日期-某个日期差的天数 SELECT  TO_NUMBER(SYSDATE  ...

  2. 正确停止kafka的方法

    kill -15 pid 即: kill SIGNTERM pid 不要使用kill -9. kill -15会触发调用shutdownHook的run方法,从而可以执行关闭服务器的时候一些必要代码. ...

  3. (转)iOS sqlite :truncate/delete/drop区分

    转自:http://blog.sina.com.cn/s/blog_6755689f0101fofb.html 相同点: 1.truncate和不带where子句的delete.以及drop都会删除表 ...

  4. debian vi

    这次用DigitalOcean VPS发现vi的方向键变成字母,没办法正常使用,搜索了下找到了解决办法. 1 vi /etc/vim/vimrc.tiny 找到set compatible改为set ...

  5. Ubuntu12.04-x64编译Hadoop2.2.0和安装Hadoop2.2.0集群

      本文Blog地址:http://www.cnblogs.com/fesh/p/3766656.html   本文对Hadoop-2.2.0源码进行重新编译(64位操作系统下不重新编译会有版本问题) ...

  6. 安卓 io流 写入文件,再读取的基本使用

    1.布局 布局里面只有一个EditView,通过输入内容之后,当触发 onDestroy 方法时,将输入的数据存储在当前应用的data/data/files文件夹下. <?xml version ...

  7. 开源PLM软件Aras详解三 服务端简易开发

    废话少说,直接进入主题, 以CAD为例: 先找到CAD对象类:具体操作见下图 双击打开,找到服务端事件:见下图 点击新建对象,点击添加,新建Method 编写Method,语言分为前端和后端,前端支持 ...

  8. Visual Studio 必备神器

    会使用工具是人类文明的一大进步,今天敏捷大行其道,好的工具可以大大的提高生产力,这里说的工具都是VS平台上的扩展工具,一些机械的部分可以交给工具去处理,自己多关注其他部分.下面分享下我觉得不错的工具, ...

  9. golang使用interface来mock进行测试(来自dotGO2014)

    源自于dotGO 2014的视频,讲述如何使用 interface 来mock 进行测试.. 可以FQ的同学自己观看,这里把重要的一些代码给截图搬到国内了 https://www.youtube.co ...

  10. MYSQL存储过程:批量更新数据

    地区等级的信息储存在jsjh_district表. 要更新jsjh_goods_district表的district_level地区信息 DELIMITER $$ DROP PROCEDURE IF ...