报文的组成部分

  报文由三部分组成:对报文进行描述的起始行(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. docker中安装ssh服务

    系统:Debian Docker 目标:在docker(debian系统)中安装ssh服务,实现远程登陆和控制docker 步骤: 初始状态:通过docker pull debian得到的一个debi ...

  2. 使用 archetype插件创建maven目录结构

    步骤一: 步骤二: 等待下载插件

  3. console.log的应用

    这两天在学javascript,但是有个问题老是觉得很疑惑,那就是这两个表达式到底有啥区别,虽然结果输出都差不多,但是我想这个两个表达式被开发出来,肯定是有意义的吧!哪位高手解答下吧!Thanks i ...

  4. java基础七 [图形用户接口](阅读Head First Java记录)

    到目前为止我们接触的都是Java的命令行,但是为了让用户使用,必须有图形化界面,所以这章主要讲的是怎么使用GUI(图形用户接口)   创建一个GUI:javax.swing.* 本章讲的布局相关内容都 ...

  5. R语言学习笔记-变量的作用域

    R语言是如何将变量值和变量绑定的 在r语言中,当前的 workspace就是global enviroment,当输入变量名时,首先会在global enviroment中搜索该变量,如有,则将它显示 ...

  6. 百度API使用--javascript api进行多点定位

    使用百度地图提供的javascript api,给定多点的经纬度坐标,在百度地图上 显示这些坐标点. 其中包括各个点自适应地图显示,自定义坐标点的图标,以及各个点之间添加折线. 实现的效果如下图: 具 ...

  7. iOS出现<object returned empty description>的解决方法

    iOS出现<object returned empty description>的解决方法: 使用  [str length] <= 0  判断处理

  8. Tornado sqlalchemy

    上篇文章提到了,最近在用 Python 做一个网站.除了 Tornado ,主要还用到了 SQLAlchemy.这篇就是介绍我在使用 SQLAlchemy 的过程中,学到的一些知识. 首先说下,由于最 ...

  9. Nginx-->进阶-->原理-->Nginx+php+fastcgi的原理与关系

    一.用户对动态PHP网页访问过程 用户浏览器发起对网页的访问:http://192.168.1.103/index.php 用户和nginx服务器进行三次握手进行TCP连接(忽略包括nginx访问控制 ...

  10. Two-Phase Commit (两阶段提交)

    1. 流程 1) Coordinator (协调者) 广播 VOTE-REQ 给所有 Participant (参与者) 2) Coordinator 等待 Participant 的结果 3) Pa ...