http协议属于应用层协议,全称为超文本传输协议。 hyper text transfer protocol
是用于browser(浏览器)和server(服务器)之间进行数据交互的传输协议 是基于TCP协议的,一般工作与B/S架构
默认端口号是80,也可以自己修改为8080或其他端口
三点注意事项:
1.无连接:指的是限制每次连接只处理一个请求。服务器处理完用户的请求,并收到用户的应答后,即断开连接。 采用这种方式可以节省传输时间。
2.媒体独立的:只要客户端和服务器知道如何处理的数据,任何类型的数据都可以通过HTTP发送。客户端以及服务器指定使用适合的MIME-type内容类型。
3.无状态:HTTP采用的是无状态协议。 无状态是指协议对于事务处理没有记忆能力。 缺少状态意味着如果后续处理需要签名的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。
另一方面,服务器不需要先前信息时它的应答就较快。
http协议格式
客户端请求消息格式:
客户端发送一个http请求到服务器的请求消息包括以下格式: 请求行、请求头部、空行和请求数据。
请求头部可以多行,所以空行的目的就是区分请求头部和请求数据的。
请求行中包括请求方法,URL(浏览器地址栏的一个访问地址),http协议版本(目前使用的是http1.1版本)请求行是由请求方法字段、URL字段、http协议版本字段三个部分组成,请求行定义了本次请求的方式。
格式如下:GET/example.html HTTP/1.1(CRLF)
http中共定义了八种请求方式:
OPTIONS、HEAD、GET、POST、PUT、DELETE、TRACE、CONNECT
其中最常用的就是get和post,其他请求方式都可以通过这两种方式间接的实现
get和post方法的区别?
get通常用来从服务器上获得数据,而非修改信息;post用来向服务器传递数据
1.请求数据时带参数时:get请求的数据会附加在URL之后,以?分割URL和传输数据,多个参数用&连接。post请求会把请求的数据放置在http请求包的包体中。
因此,get请求的数据会暴露在地址栏中,而post请求则不会。
2.传输数据的大小:在HTTP规范中,没有对URL的长度和传输的数据大小进行限制。 但是在实际开发过程中,对于get,特定的浏览器和服务器对URL的长度有限制。因此,在使用get请求时,传输数据会受到URL长度的限制。
对于post,由于不是URL传值,理论上是不会受限制的,但是实际上各个服务器会规定对post提交数据大小进行限制,Apache、IIS都有各自的配置。
3.安全性:post的安全性比get的高。因为get所传输的数据都会显示在浏览器的地址栏里。
请求头:也被称作消息报头,请求头是由一些键值对组成,每行一对,关键字和值用英文冒号“:” 分隔。允许客户端向服务器发送一些附加信息或者客户端自身的信息
典型的请求头如下:
Accept:作用:指定客户端能够接收的内容类型;示例:Accept:text/html
Accept-Charset:作用:浏览器可以接受的字符编码集;示例:Accept-Charset:utf-8
Accept-Language:作用:浏览器可接受的语言;示例:Accept-Language:en
Connection:作用:表示是否需要持久连接,注意HTTP1.1默认进行持久连接;示例: Connection:close
Content-Length:作用:请求的内容长度:示例:Content-Length:348
Content-Type:作用:请求与实体对应的MIME信息
服务器响应消息格式:
http响应消息也由四个部分组成 状态行、消息报头、空行和响应正文 状态行有三部分构成,HTTP协议的版本号、状态码、以及对状态码的文本描述
如:HTTP/1.1 200 OK(CRLF) 200表示请求已经成功
一般状态行都是由服务器自动添加的,一般不需要人工添加。
HTML(hyper text Markup language)超文本标记语言
HTML不是一种编程语言,而是一种标记语言,是用来描述网页的一个语言。
web浏览器的作用是读取HTML文档,并以网页的形式显示出他们,浏览器不会显示HTML标签,而是使用标签来解释页面的内容。
HTML语言的使用
首先需要布置网页框架
在Visual Studio Code里打开.html文件,然后输入html,选择html:5回车,会自动补全框架。
或者直接输入!,回车,也可以自动补全。
补全之后:
<title>是浏览器页面的标题
<head>是头,用来编写协议数据
<body>是数据体,用来编写网页显示内容
1.标签格式:
(1)有尖括号包围的关键字,如:<html>(单标签)
(2)通常成对存在,如:<body></body>(双标签)
(3)上面的标签前面是开始标签,后面是结束标签
2.标签分类:
(1)单标签:也称空标签 <标签名 /> 如:<br/>
(2)双标签:成对存在 <标签名> 内容 </标签名>(相当于C语言里的大括号)
3.自动补全标签解释:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<body>
</body>
</html>
(1)HTML标签:作用所有HTML中标签的一个根节点。 最大的标签 根标签 ,可以嵌套一些标签
(2)head标签:文档的头部;文档的头部描述了文档的各种属性和信息,包括文档的标题、在 Web 中的位置以及和其他文档的关系等。绝大多数文档头部包含的数据都不会真正作为内容显示给读者。 比如说用于存放title、meta、base、style、script、link 注意:在head标签中我们必须要设置的标签是title
(3)title标签:文档的标题,作用:让页面拥有一个属于自己的标题
<title>Document</title>
(4)body标签:文档的主体 以后我们的页面内容 基本都是放到body里面的 body 元素包含文档的所有内容(比如文本、超链接、图像、表格和列表等等。),页面的主体部分, 用于存放所有的html标签:a、p、h、div、span、img…
常用标签:
1.h1~h6标题标签
格式:<hn> 标题文本 </hn>
举例:
<h1>这是标题标签</h1>
<h2>这是标题标签</h2>
<h3>这是标题标签</h3>
<h4>这是标题标签</h4>
<h5>这是标题标签</h5>
<h6>这是标题标签</h6>
2.p段落标签:
一个段落中会根据浏览器窗口的大小自动换行
格式:<p> 文本内容 </p>
<p>单片微型计算机简称单片机(MCU(MicrbControl Unit)),我们自己的个人计算机中,CPU、RAM、ROM、I/O这些都是单独的芯片,然后这些芯片被安装在一个主板上,这样就构成了我们的PC主板,进而组装成电脑,而单片机只是将这所有的集中在了一个芯片上而已。单片机又有8位的如51单片机、16位的如MSP430、32位的如STM32,通常我们说的多少位通常指的是内核(CPU)一次处理的数据宽度。也就是说内核一次处理的位数越多单片机的计算速度就越快,性能也就越强悍。</p>
<p>ARM公司只设计内核不生产芯片,他会将有关内核的技术授权给各半导体厂商例如ST、TI、Atme1、NXP等厂商。这些厂商都是基于这个内核自己设计片上外设如SRAM、ROM、FLASH、USART、GPIO等,然后集成到一个硅片上,这就是我们现在用的芯片。</p>
3.br换行标签:
格式:<br />
hello world
hello <br/>world
4.div标签:(相当于是个盒子,定义了一个模块,可以理解为C语言中的函数封装)
是一个块级元素,可以把文档分割为独立的、不同的部分,可以在div中嵌套标签
举例:
<div class="news">
<h2>News headline 1</h2>
<p>some text. some text. some text...</p>
</div>
注:可以给div设置class或id,通过选择器设置属性,则内部成员具有相同属性
这里将div里的标签设置了一个class选择器,并规定这个类选择器的名字为news,之后再给这个类选择器设置样式等属性的时候,就可以直接对整体进行操作。
5.input表单标签,是输入的意思,单标签
格式:<input type=”” name=”” value=”” id=””…>
这里重点讲type为text、radio
当type为text,表示是文本输入框 用法:
当type为radio,表示是单选框 用法:
解释:
name:控件名称,同一组单选框设置相同名称
Value:必须要有,是当点击时会提交的数据
Onclick:点击时会执行双引号中的处理函数
Checked:默认选中,同一组中只设置一个即可
举例:text 文本框,radio 单选按钮
<input type="text" name="username" value="admin">
<br/>
男
<input type="radio" name="sex" checked="checked">
女
<input type="radio" name="sex" >
value为默认值
checked表示默认选中
6.label标签
label标签可以绑定input标签,做input标签的标注,相当于是一个表单元素,当点击label标签的时候,被绑定的表单元素就会获得输入焦点。
举例:
<label for="male"> Male </label>
<input type="radio" name="sex" id="male" value="male">
注:这里for要跟input中的id一致,标签的显示内容要在双标签之间。
此时点击Male也可以选中单选框
全部代码如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<body>
<h1>这是标题标签</h1>
<h2>这是标题标签</h2>
<h3>这是标题标签</h3>
<h4>这是标题标签</h4>
<h5>这是标题标签</h5>
<h6>这是标题标签</h6>
<p>单片微型计算机简称单片机(MCU(MicrbControl Unit)),我们自己的个人计算机中,CPU、RAM、ROM、I/O这些都是单独的芯片,然后这些芯片被安装在一个主板上,这样就构成了我们的PC主板,进而组装成电脑,而单片机只是将这所有的集中在了一个芯片上而已。单片机又有8位的如51单片机、16位的如MSP430、32位的如STM32,通常我们说的多少位通常指的是内核(CPU)一次处理的数据宽度。也就是说内核一次处理的位数越多单片机的计算速度就越快,性能也就越强悍。</p>
<p>ARM公司只设计内核不生产芯片,他会将有关内核的技术授权给各半导体厂商例如ST、TI、Atme1、NXP等厂商。这些厂商都是基于这个内核自己设计片上外设如SRAM、ROM、FLASH、USART、GPIO等,然后集成到一个硅片上,这就是我们现在用的芯片。</p>
hello <br/>world
<div class="news">
<h2>News headline 1</h2>
<p>some text. some text. some text...</p>
</div>
<input type="text" name="username" value="admin">
<br/>
男
<input type="radio" name="sex" checked="checked">
女
<input type="radio" name="sex" >
<br/>
<label for="male">Male</label>
<input type="radio" name="sex" id="male" value="male">
</body>
</html>
那么如何实现对数据的传输呢
比如以上的单选框,在选择男或者女时执行对应的操作,或者文本框的值被利用。
需要在标签中加入onclick属性,onclick需要绑定fun函数进行使用,fun()函数的参数用id和value都可以
<label for="male"> Male </label>
<input type="radio" name="sex" id="male" value="male" onclick="fun(value)">
<label for="female"> Female </label>
<input type="radio" name="sex" id="female" value="female" onclick="fun(value)">
fun函数需要自己编写,位置位于head标签和body标签之间。
需要包含js的一个脚本文件 src=“文件路径/xhr.js”
<script src="./xhr.js"></script>
<script>
function fun(obj) {
var v = "set " + obj;
console.log(v);
}
</script>
按f12打开后台,在console中查看所得数值
使用post函数
this.post = function(url, data, callback)
url:访问地址
data:提交的数据
callback:回调函数
<script>
function fun(obj) {
var v = "set " + obj;
console.log(v);
if(obj == "male")
{
XHR.post('/cgi-bin/web.cgi',v,function(x,info){})
}else
{
XHR.post('/cgi-bin/web.cgi',v,function(x,info){})
}
}
</script>
因为只需要给服务器发送数据,不需要处理服务器回复的数据,所以function函数的处理为空就可以了
此时html页面为
完整代码为:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<script src="./xhr.js"></script>
<script>
function fun(obj) {
var v = "set " + obj;
console.log(v);
}
</script>
<body>
<label for="male"> Male </label>
<input type="radio" name="sex" id="male" value="male" onclick="fun(value)">
<label for="female"> Female </label>
<input type="radio" name="sex" id="female" value="female" onclick="fun(value)">
</body>
</html>
采集cgi数据到文本框(刷新时请求)
首先添加声明window,代码默认是从上到下加载的,添加声明之后可以先加载下部分的标签,再执行函数
<script>
window.onload = function()
{
init_fun();//引用函数
function init_fun()//定义函数功能
{
//获取数据
var req = document.getElementById("1");
//document是固定的,input标签就用document
console.log(req);//打印
var r = "get=" + req.id;//单个数据不需要加下标
console.log(r);
XHR.post('cgi-bin/web.cgi',r,
function(x,info)
//服务器回复的数据放在info中
//x是回复的整个信息,可以不用
{
console.log(info);
req.value = info;//将获取得到数据在文本框中打印
});
//console.log(req[0].name);
//req为一个数组,如果有多个元素的get值相同,那么req会存储多个数值
//var req = document.getElementByName("sex");
//这里如果有男女两个input的name都为sex的话req就会有两条数据
}
}
</script>
<body>
<label for="1"> 数据 </label>
<input type="text" name="40001" value="" id="1">
</body>
此时cgi进程没有运行,所以收不到info数据
xhr.js文件
/*
* xhr.js - XMLHttpRequest helper class
* (c) 2008-2010 Jo-Philipp Wich
*/
XHR = function()
{
this.reinit = function()
{
if (window.XMLHttpRequest) {
this._xmlHttp = new XMLHttpRequest();
}
else if (window.ActiveXObject) {
this._xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
}
else {
alert("xhr.js: XMLHttpRequest is not supported by this browser!");
}
}
this.busy = function() {
if (!this._xmlHttp)
return false;
switch (this._xmlHttp.readyState)
{
case 1:
case 2:
case 3:
return true;
default:
return false;
}
}
this.abort = function() {
if (this.busy())
this._xmlHttp.abort();
}
this.get = function(url,data,callback)
{
this.reinit();
var xhr = this._xmlHttp;
var code = this._encode(data);
url = location.protocol + '//' + location.host + url;
if (code)
if (url.substr(url.length-1,1) == '&')
url += code;
else
url += '?' + code;
xhr.open('GET', url, true);
xhr.onreadystatechange = function()
{
if (xhr.readyState == 4) {
var json = null;
if (xhr.getResponseHeader("Content-Type") == "application/json")
{
try {
json = eval('(' + xhr.responseText + ')');
}
catch(e) {
json = null;
}
}
else if (xhr.getResponseHeader("Content-Type") == "text/html")
{
json = xhr.responseText;
}
callback(xhr, json);
}
}
xhr.send(null);
}
this.post = function(url, data, callback)
{
this.reinit();
var xhr = this._xmlHttp;
var code = this._encode(data);
xhr.onreadystatechange = function()
{
if (xhr.readyState == 4)
{
var json = null;
var header = xhr.getResponseHeader("Content-Type");
if (header == "application/json")
{
try
{
json = eval('(' + xhr.responseText + ')');
}
catch(e)
{
json = null;
}
}
else if (header == "text/html")
{
json = xhr.responseText;
}
callback(xhr, json);
}
}
xhr.open('POST', url, true);
//xhr.setRequestHeader('Content-length', code.length);
//xhr.setRequestHeader('Connection', 'close');
xhr.send(code);
}
this.postwait = function(url, data, callback)
{
this.reinit();
var xhr = this._xmlHttp;
var code = this._encode(data);
xhr.onreadystatechange = function()
{
if (xhr.readyState == 4)
{
var json = null;
var header = xhr.getResponseHeader("Content-Type");
if (header == "application/json")
{
try
{
json = eval('(' + xhr.responseText + ')');
}
catch(e)
{
json = null;
}
}
else if (header == "text/html")
{
json = xhr.responseText;
}
callback(xhr, json);
}
}
xhr.open('POST', url, false);
//xhr.setRequestHeader('Content-length', code.length);
//xhr.setRequestHeader('Connection', 'close');
xhr.send(code);
}
this.cancel = function()
{
this._xmlHttp.onreadystatechange = function(){};
this._xmlHttp.abort();
}
this.send_form = function(form,callback,extra_values)
{
var code = '';
for (var i = 0; i < form.elements.length; i++)
{
var e = form.elements[i];
if (e.options)
{
code += (code ? '&' : '') +
form.elements[i].name + '=' + encodeURIComponent(
e.options[e.selectedIndex].value
);
}
else if (e.length)
{
for (var j = 0; j < e.length; j++)
if (e[j].name) {
code += (code ? '&' : '') +
e[j].name + '=' + encodeURIComponent(e[j].value);
}
}
else
{
code += (code ? '&' : '') +
e.name + '=' + encodeURIComponent(e.value);
}
}
if (typeof extra_values == 'object')
for (var key in extra_values)
code += (code ? '&' : '') +
key + '=' + encodeURIComponent(extra_values[key]);
return(
(form.method == 'get')
? this.get(form.getAttribute('action'), code, callback)
: this.post(form.getAttribute('action'), code, callback)
);
}
this._encode = function(obj)
{
obj = obj ? obj : { };
obj['_'] = Math.random();
if (typeof obj == 'object')
{
var code = '';
var self = this;
for (var k in obj)
code += (code ? '&' : '') +
k + '=' + encodeURIComponent(obj[k]);
return code;
}
return obj;
}
}
XHR.get = function(url, data, callback)
{
(new XHR()).get(url, data, callback);
}
XHR.post = function(url, data, callback)
{
(new XHR()).post(url, data, callback);
}
XHR.postwait = function(url, data, callback)
{
(new XHR()).postwait(url, data, callback);
}
XHR.send_form = function(form,callback,extra_values)
{
(new XHR()).send_form(form,callback,extra_values);
}
XHR.poll = function(interval, url, data, callback)
{
if (isNaN(interval) || interval < 1)
interval = 5;
if (!XHR._q)
{
XHR._t = 0;
XHR._q = [ ];
XHR._r = function() {
for (var i = 0, e = XHR._q[0]; i < XHR._q.length; e = XHR._q[++i])
{
if (!(XHR._t % e.interval) && !e.xhr.busy())
e.xhr.post(e.url, e.data, e.callback);
}
XHR._t++;
};
}
XHR._q.push({
interval: interval,
callback: callback,
url: url,
data: data,
xhr: new XHR()
});
XHR.run();
}
XHR.halt = function()
{
if (XHR._i)
{
/* show & set poll indicator */
try {
document.getElementById('xhr_poll_status').style.display = '';
document.getElementById('xhr_poll_status_on').style.display = 'none';
document.getElementById('xhr_poll_status_off').style.display = '';
} catch(e) { }
window.clearInterval(XHR._i);
XHR._i = null;
}
}
XHR.run = function()
{
if (XHR._r && !XHR._i)
{
/* show & set poll indicator */
try {
document.getElementById('xhr_poll_status').style.display = '';
document.getElementById('xhr_poll_status_on').style.display = '';
document.getElementById('xhr_poll_status_off').style.display = 'none';
} catch(e) { }
/* kick first round manually to prevent one second lag when setting up
* the poll interval */
XHR._r();
XHR._i = window.setInterval(XHR._r, 1000);
}
}
XHR.running = function()
{
return !!(XHR._r && XHR._i);
}