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整个映射表由花括号括起来.这样就组成了一个对象直接 ...
随机推荐
- python异常处理、反射、socket
一.isinstance 判断对象是否为类的实例 n1 = print isinstance(n1,int) class A: pass class B(A): pass b= B() print i ...
- Brn系列商城4.1正式发布,欢迎大家下载体验
此次升级内容如下: 独立IP搜索策略 独立文件上传策略 添加退换货功能 重构支付方式 常规性修复和改进 下载地址:http://www.brnshop.com
- 初识ASP.NET CORE:一、HTTP pipeline
完整的http请求在asp.net framework中的处理流程: Asp.Net HttpRequest--> HTTP.exe--> inetinfo.exe(w3wp.exe)-& ...
- [整理]PCB阻抗控制
之前一直听说PCB设计中信号完整性及阻抗方面的要求,但是本人对此还是有很多的不了解,每次和别人讨论到这里后就不知道该怎么继续就这个问题交谈下去.正巧最近手头有一点工作有这方面的一些需求,就拿来花了一点 ...
- 清除SQLServer日志的两种方法
日志文件满而造成SQL数据库无法写入文件时,可用两种方法:一种方法:清空日志.1.打开查询分析器,输入命令DUMP TRANSACTION 数据库名 WITH NO_LOG2.再打开企业管理器--右键 ...
- wpf 旋转效果
<Grid> <Grid.Triggers> <EventTrigger RoutedEvent="Page.Loaded"> <Begi ...
- android中的MVP模式
1.建立bean public class UserBean { private String mFirstName; private String mLastName; public UserBea ...
- hibernate进行多表联合查询
hibernate是按照hql语句来进行查询的, 里面所使用的表名, 其实是实体类的名字, hql语句的写法并没有多大差别, 是在返回结果的时候要稍微做一些处理 //使用hibernate进行多表查询 ...
- IOS开发涉及有点概念&相关知识点
前言,IOS是基于UNIX的,用C/C+/OC直通系统底层,不想android有个jvm. 首先还是系统架构的分层架构 1.核心操作系统层 Core OS,就是内存管理.文件系统.电源管理等 2.核心 ...
- Web 通信 之 长连接、长轮询(long polling)
基于HTTP的长连接,是一种通过长轮询方式实现"服务器推"的技术,它弥补了HTTP简单的请求应答模式的不足,极大地增强了程序的实时性和交互性. 一.什么是长连接.长轮询? 用通俗易 ...