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整个映射表由花括号括起来.这样就组成了一个对象直接 ...
随机推荐
- localstorage,sessionstorage使用
今天看了一下HTML5,也算是简单的学习一下吧,HTML5 提供了两种在客户端存储数据的新方法:localstorage,sessionstorage. localStorage - 没有时间限制的数 ...
- Android菜鸟成长记5-ADB和sqllite
Android开发环境中,ADB是我们进行Android开发经常要用的调试工具,它的使用当然是我们Android开发者必须要掌握的. ADB概述 Android Debug Bridge,Androi ...
- ☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆AnalyzerTool分词工具.非常实用!
AnalyzerTool分词工具.非常实用! 可以查看某串字符最终被分割成什么样子,这样便于查询时深刻明白为什么有的查不到有的却能查到. package com.isoftstone.www.tool ...
- gdal编译C#开发版本
gdal的编译比较麻烦,情况有很多种,今天我编译的gdal遇到的问题就和以前的有点不一样,仅供参考借鉴. 1.下载gdal源码 gdal源码下载地址:https://trac.osgeo.org/gd ...
- sublime使用以及快捷键
1.工程文件中的内容的查找替换 例: 想要把工程文件中的“山东”改为“云南”. 1)首先选中工程文件夹 2)右击出现下拉菜单,选择 find&replace 选项 3)出现在编辑框内输入要查找 ...
- 第七章 springboot + retrofit
retrofit:一套RESTful架构的Android(Java)客户端实现. 好处: 基于注解 提供JSON to POJO,POJO to JSON,网络请求(POST,GET,PUT,DELE ...
- ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2) 背景: mys ...
- jquery 让select元素中的某个option被选中
jquery 操作select 取值,设置选中值 博客分类: javaScript selecttextvalue取值设置选中值 比如 <select class="type" ...
- 清空form表单下所有的input值-------------jquery
$(':input','#' + formid).not(':button, :submit, :reset').val('').removeAttr('checked').removeAttr('s ...
- 【Java】XML解析之DOM
DOM介绍 DOM(Document Object Model)解析是官方提供的XML解析方式之一,使用时无需引入第三方包,代码编写简单,方便修改树结构,但是由于DOM解析时是将整个XML文件加载到内 ...