前言


一、原本的计划

  到此,有必要复习下http章节

下一篇可考虑下netty与nodejs的对比。

二、HTTP中的 URL、GET/POST 参数

路由需要,故从HTTP中提取出请求的 URL 以及 GET/POST 参数。

这一功能应当属于路由还是服务器(甚至作为一个模块自身的功能)确实值得探讨,但这里暂定其为我们的HTTP服务器的功能。

我们需要的所有数据都会包含在 request 对象中,该对象作为 onRequest() 回调函数的第一个参数传递。但是为了解析这些数据,我们需要额外的 Node.JS 模块,它们分别是 url 和 querystring 模块。

var http = require("http");
var url = require("url"); function start() {
function onRequest(request, response) {
var pathname = url.parse(request.url).pathname;
console.log("Request for " + pathname + " received.");
response.writeHead(200, {"Content-Type": "text/plain"});
response.write("Hello World");
response.end();
} http.createServer(onRequest).listen(8888);
console.log("Server has started.");
} exports.start = start;

HTTP: 协议

HTML: 协议载体

HTML


Ref: HTML 教程- (HTML5 标准)

一、仨个在线工具链接

  • HTML 实例

在 HTML 手册中包含了数百个在线实例,您可以在线编辑并查看运行结果。

查看 HTML 实例!

  • HTML 参考手册

在菜鸟教程中,我们提供了完整的 HTML 参考手册,其中包括标签、属性、颜色、实体等等。

HTML 标签参考手册

  • HTML/CSS/JS 在线工具

HTML/CSS/JS 在线工具可以在线编辑 HTML、CSS、JS 代码,并实时查看效果:

https://c.runoob.com/front-end/61

两个疑点:

<!DOCTYPE html> 声明为 HTML5 文档

<head> 元素包含了文档的元(meta)数据   // ----> 以下都是head惹的祸!

二、head 和 meta

Ref: html之文档的头部和元数据定义(上)

元数据(meta data)——“data about data” 关于数据的数据,一般是结构化数据(如存储在数据库里的数据,规定了字段的长度、类型等)。
元数据是指从信息资源中抽取出来的用于说明其特征、内容的结构化的数据(如题名,版本、出版数据、相关说明,包括检索点等),用于组织、描述、检索、保存、管理信息和知识资源。

  • 标签- 使用
<head>
  <meta name="Author" content="dreamzuora" lang="US-en" dir="LTR">
  <meta name="keywords" content="HTML, CSS, XML, XHTML, JavaScript">
  <meta name="description" content="免费 Web & 编程 教程">
  <meta name="author" content="Runoob">
</head>
  • meta中定义字符格式,确保支持中文。 
<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8">
    <title>页面标题</title>
  </head>
  <body>
    <h1>我的第一个标题</h1>
    <p>我的第一个段落。</p>
  </body>
</html>
  • 每30秒钟刷新当前页面:
<meta http-equiv="refresh" content="30">
  • 链接网页和样式表
-----------------------------------------------------------------
页面链接标签的默认链接地址
<head>
  <base href="http://www.runoob.com/images/" target="_blank">
</head>
-----------------------------------------------------------------
样式标签link: 一个文档和外部资源之间的关系
<head>
  <link rel="stylesheet" type="text/css" href="mystyle.css">
</head>
-----------------------------------------------------------------
样式标签style: HTML文档的样式文件
<head>
  <style type="text/css">
    body {background-color:yellow}
    p {color:blue}
  </style>
</head>
  • 嵌入样式

直接在html标签元素内嵌入css样式

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title>菜鸟教程(runoob.com)</title>
</head>
<body>
  <div style="opacity:0.5;position:absolute;left:50px;width:300px;height:150px;background-color:#40B3DF"></div>
  <div style="font-family:verdana;padding:20px;border-radius:10px;border:10px solid #EE872A;">
    <div style="opacity:0.3;position:absolute;left:120px;width:100px;height:200px;background-color:#8AC007"></div>
    <h3>Look! Styles and colors</h3>
    <div style="letter-spacing:12px;">Manipulate Text</div>
    <div style="color:#40B3DF;">Colors
      <span style="background-color:#B4009E;color:#ffffff;">Boxes</span>
    </div>
    <div style="color:#000000;">and more...</div>
  </div>
</body>
</html>

效果图:

  • 内部样式表

添加到 <head> 部分的样式信息,对 HTML 进行格式化。

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title>菜鸟教程(runoob.com)</title>   // Jeff: 在<head> 部分通过 <style>标签定义内部样式表:
  <style type="text/css">
    h1 {color:red;}
    p {color:blue;}
  </style>
</head> <body>
  <h1>这是一个标题</h1>
  <p>这是一个段落。</p>
</body> </html>
  • 外部样式表

使用外部样式文件格式化文本。

使用外部样式表,你就可以通过更改一个文件来改变整个站点的外观。

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title>菜鸟教程(runoob.com)</title>
  <link rel="stylesheet" type="text/css" href="styles.css">
</head> <body>
  <h1>我使用了外部样式文件来格式化文本 </h1>
  <p>我也是!</p>
</body> </html>
  • 倾向于style替代传统老旧方法

现在通常使用font-family(字体),color(颜色),和font-size(字体大小)属性来定义文本样式,而不是使用<font>标签。

<h1 style="font-family:verdana;">一个标题</h1>
<p style="font-family:arial;color:red;font-size:20px;">一个段落。</p>

文本对齐属性 text-align取代了旧标签 <center> 。

<h1 style="text-align:center;">居中对齐的标题</h1>
<p>这是一个段落。</p>

图像,表格,列表,区块,颜色 参见原链接:http://www.runoob.com/html

布局的话,有必要在此停留片刻。

效果图

  • HTML 布局 - 使用<div> 元素
<!DOCTYPE html>
<html>
<head> 
  <meta charset="utf-8"> 
  <title>菜鸟教程(runoob.com)</title> 
</head>
<body>   <div id="container" style="width:500px">     <div id="header" style="background-color:#FFA500;">
    <h1 style="margin-bottom:0;">主要的网页标题</h1></div>     <div id="menu" style="background-color:#FFD700;height:200px;width:100px;float:left;">
      <b>菜单</b><br>
      HTML<br>
      CSS<br>
    JavaScript</div>     <div id="content" style="background-color:#EEEEEE;height:200px;width:400px;float:left;">
    内容在这里</div>     <div id="footer" style="background-color:#FFA500;clear:both;text-align:center;">
    版权 © runoob.com</div>   </div> </body>
</html>
  • HTML 布局 - 使用表格
<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title>菜鸟教程(runoob.com)</title>
</head>
<body>   <table width="500" border="0">
    <tr>
      <td colspan="2" style="background-color:#FFA500;">
        <h1>主要的网页标题</h1>
      </td>
    </tr>     <tr>
      <td style="background-color:#FFD700;width:100px;">
        <b>菜单</b><br>
        HTML<br>
        CSS<br>
        JavaScript
      </td>
      <td style="background-color:#eeeeee;height:200px;width:400px;">
      内容在这里</td>
    </tr>     <tr>
      <td colspan="2" style="background-color:#FFA500;text-align:center;">
      版权 © runoob.com</td>
    </tr>
  </table> </body>
</html>
  • HTML 布局 - 有用的提示

Tip: 使用 CSS 最大的好处是,如果把 CSS 代码存放到外部样式表中,那么站点会更易于维护。通过编辑单一的文件,就可以改变所有页面的布局。

Tip: 由于创建高级的布局非常耗时,使用模板是一个快速的选项。通过搜索引擎可以找到很多免费的网站模板(您可以使用这些预先构建好的网站布局,并优化它们)。

  • HTML 框架

在同一个浏览器窗口中显示不止一个页面。

示例:点击后小窗口填充页面完整信息,并展示。

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title>菜鸟教程(runoob.com)</title>
</head>
<body>   <iframe src="demo_iframe.htm" name="iframe_a"></iframe>
  <p><a href="http://www.runoob.com" target="iframe_a">RUNOOB.COM</a></p>    // <---- click here, fill with iframe_a.   <p><b>注意:</b> 因为 a 标签的 target 属性是名为 iframe_a 的 iframe 框架,所以在点击链接时页面会显示在 iframe框架中。</p> </body>
</html>

效果图:

三、Form 表单提交

  • 用户交互
  1. HTML 表单和输入
  2. HTML 脚本
  • 传统的 button
<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title>菜鸟教程(runoob.com)</title>
</head>
<body>
  <button type="button" onclick="alert('你好,世界!')">点我!</button>
</body>
</html>
  • 表单的 button

点击"提交"按钮,表单数据将被发送到服务器上的“demo-form.php

<!DOCTYPE html>
<html>
<head> 
  <meta charset="utf-8"> 
  <title>菜鸟教程(runoob.com)</title> 
</head>
<body>   <form action="demo-form.php">
    First name: <input type="text" name="FirstName" value="Mickey"><br>
    Last name: <input type="text" name="LastName" value="Mouse"><br>
  <input type="submit" value="提交">
  </form>   <p>点击"提交"按钮,表单数据将被发送到服务器上的“demo-form.php”。</p> </body>
</html>

效果图:

四、HTML 脚本

JavaScript 使 HTML 页面具有更强的动态和交互性。

  • <noscript>

<noscript> 标签提供无法使用脚本时的替代内容,比方在浏览器禁用脚本时,或浏览器不支持客户端脚本时。

<noscript>元素可包含普通 HTML 页面的 body 元素中能够找到的所有元素。

只有在浏览器不支持脚本或者禁用脚本时,才会显示 <noscript> 元素中的内容:

<script>
document.write("Hello World!")
</script>
<noscript>抱歉,你的浏览器不支持 JavaScript!</noscript>
  • <script>

点击按钮,触发时间,改变label属性。

<p id="demo">
JavaScript 可以触发事件,就像按钮点击。</p> <script>
  function myFunction()
  {
   document.getElementById("demo").innerHTML="Hello JavaScript!";
   x=document.getElementById("demo") // 找到元素
   x.style.color="#ff00ff"; // 改变样式
  }
</script> <button type="button" onclick="myFunction()">点我</button>

五、Dom 操作

  • 查看API
document.getElementById(...)

document.getElementsByTagName(...)

document.querySelectorAll(...)

document.querySelector(...)

示范:

pageTitle.parentNode

pageTitle.previousElementSibling

pageTitle.nextElementSibling

pageTitle.nextElementSibling.innerText

/* 子节点 */
var artistList = document.querySelector(...)
artistList.childNodes
artistList.childElementCount
artistList.firstElementChild
artistList.childNodes
  • 创建并插入
var newMember     = document.createElement('li')
var newMemberText = document.createTextNode('张三');
newMember.appendChild(newMemberText)

效果:多出一个‘张三’。

  • 自定义插入位置
// 自定义插入位置
document.querySelector('.artist-list').removeChild(newMember);
artistList.insertBefore(newMember, artistList.firstChild) var bandMember = document.createElement('h3');
bandMember.innerText = '乐队成员'
artistList.parentNode.insertBefore(bandMember, artistList.previousSibling);

效果图:

  • 事件  

程序代码 和 html代码应该分离开:也就是把onclick单独写在script.js中。

window.onload(...):保证当文档内容完全加载完成会触发该事件。

点击按钮,触发函数:

window.onload = function () {
  var btn = document.querySelector('.btn');
  function showMessage(event) {
    console.log(event);
  }
  btn.addEventListener('click', showMessage, false);
  • 事件的传播 

事件的传播是向上的(冒泡的方式),直到找到onclick事件。

  凡是事件,都会触发,触发的顺序(事件的捕获方式)与第三个参数有关。

  - false: 由下向上

  - true: 由上到下

event.stopPropagation();

潜规则:存在一些默认的行为,比如点击链接就会自动打开链接所指网页。

Goto: HTML 速查列表

你已经完成了 HTML 的学习,下一步该学习什么呢?

HTTP:http://www.runoob.com/http/http-tutorial.html

HTTP


一、HTTP 工作原理

  • 基础概念

[1] 基本过程

1). Web服务器根据接收到的请求后,

2). 向客户端发送响应信息。

HTTP默认端口号为80,但是你也可以改为8080或者其他端口。

[2] HTTP三点注意事项:

    • HTTP是无连接       :无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。
    • HTTP是媒体独立的:这意味着,只要客户端和服务器知道如何处理的数据内容,任何类型的数据都可以通过HTTP发送。客户端以及服务器指定使用适合的MIME-type内容类型。
    • HTTP是无状态       :HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。

[3] HTTP协议通信流程:

二、GET 对比 POST

  • HTTP 方法

GET - 从指定的资源请求数据。

POST - 向指定的资源提交要被处理的数据

其他一些 HTTP 请求方法:

方法

描述

HEAD 与 GET 相同,但只返回 HTTP 报头,不返回文档主体。
PUT 上传指定的 URI 表示。
DELETE 删除指定资源。
OPTIONS 返回服务器支持的 HTTP 方法。
CONNECT 把请求连接转换到透明的 TCP/IP 通道。
  • GET 对比 POST

Ref: HTTP 方法:GET 对比 POST

GET 方法】

请注意,查询字符串(名称/值对)是在 GET 请求的 URL 中发送的:

/test/demo_form.asp?name1=value1&name2=value2

有关 GET 请求的其他一些注释:

      • GET 请求可被缓存
      • GET 请求保留在浏览器历史记录中
      • GET 请求可被收藏为书签
      • GET 请求不应在处理敏感数据时使用
      • GET 请求有长度限制
      • GET 请求只应当用于取回数据

# 客户端请求:使用 GET 来传递数据的实例。

GET /hello.txt HTTP/1.1
User-Agent: curl/7.16.3 libcurl/7.16.3 OpenSSL/0.9.7l zlib/1.2.3
Host: www.example.com
Accept-Language: en, mi

POST 方法】

请注意,查询字符串(名称/值对)是在 POST 请求的 HTTP 消息主体中发送的:

POST /test/demo_form.asp HTTP/1.1
Host: w3schools.com
name1=value1&name2=value2

有关 POST 请求的其他一些注释:

      • POST 请求不会被缓存
      • POST 请求不会保留在浏览器历史记录中
      • POST 不能被收藏为书签
      • POST 请求对数据长度没有要求

# 客户端请求:使用 POST 来传递数据的实例。

常见的HTTP请求报文头属性,参见:https://blog.csdn.net/u010256388/article/details/68491509

  • 服务器响应消息

服务端响应:

HTTP/1.1 200 OK  // 相应状态码
Date: Mon, 27 Jul 2009 12:28:53 GMT
Server: Apache
Last-Modified: Wed, 22 Jul 2009 19:15:56 GMT
ETag: "34aa387-d-1568eb00"
Accept-Ranges: bytes
Content-Length: 51
Vary: Accept-Encoding
Content-Type: text/plain

输出结果:

Hello World! My payload includes a trailing CRLF.

响应状态码

Ref: http://www.runoob.com/http/http-status-codes.html

和请求报文相比,响应报文多了一个“响应状态码”,它以“清晰明确”的语言告诉客户端本次请求的处理结果。 
HTTP的响应状态码由5段组成:

      • 1xx 消息,一般是告诉客户端,请求已经收到了,正在处理,别急...
      • 2xx 处理成功,一般表示:请求收悉、我明白你要的、请求已受理、已经处理完成等信息.
      • 3xx 重定向到其它地方。它让客户端再发起一个请求以完成整个处理。
      • 4xx 处理发生错误,责任在客户端,如客户端的请求一个不存在的资源,客户端未被授权,禁止访问等。
      • 5xx 处理发生错误,责任在服务端,如服务端抛出异常,路由出错,HTTP版本不支持等。

HTTP 响应头信息(第二部分之消息报头), goto: http://www.runoob.com/http/http-header-fields.html

三、HTTP content-type

请求和响应中都有。

Content-Type,内容类型,一般是指网页中存在的Content-Type,用于定义网络文件的类型和网页的编码,决定浏览器将以什么形式、什么编码读取这个文件,这就是经常看到一些Asp网页点击的结果却是下载到的一个文件或一张图片的原因。

Goto: http://www.runoob.com/http/http-content-type.html

[Node.js] 07 - Html and Http的更多相关文章

  1. [Node.js] 08 - Web Server and REST API

    有了 [Node.js] 07 - Html and Http 作为基础,再继续下面的内容. Node.js 路由 Node.js GET/POST请求 Node.js Web 模块 Node.js ...

  2. 07慕课网《进击Node.js基础(一)》HTTP小爬虫

    获取HTML页面 var http = require('http') var url='http://www.imooc.com/learn/348' http.get(url,function(r ...

  3. Node.js笔记07——不使用generator自定义一个项目,深入了解项目结构

    一.初始化项目 新建项目 git init manager 新建view文件夹,建几个静态文件夹 新建app.js 快速初始化项目依赖 npm init -y 安装express npm instal ...

  4. 07 Node.js安装及环境配置

    二.安装Node.js步骤 1.下载对应你系统的Node.js版本:https://nodejs.org/en/download/2.选安装目录进行安装3.环境配置4.测试 开始安装 1.下载完成后, ...

  5. Node.js Express连接mysql完整的登陆注册系统(windows)

    windows学习环境: node 版本: v0.10.35 express版本:4.10.0 mysql版本:5.6.21-log 第一部分:安装node .Express(win8系统 需要&qu ...

  6. 玩儿转物联网IoT - 在Beagle Bone Black上运行node.js 程序

    物联网(IoT)技术方兴未艾,智能手环,智能血压计,智能眼镜甚至智能鞋垫都开始进入我们的生活,各种智能设备层出不穷,世界已经到了一个"人有多大胆,地有多大产"的时代,不玩儿点物联网 ...

  7. Node.js Tools 1.2 for Visual Studio 2015 released

    https://blogs.msdn.microsoft.com/visualstudio/2016/07/28/node-js-tools-1-2-visual-studio-2015/ What ...

  8. Node.js高级编程读书笔记 - 6 应用程序构建和调试 - Never

    Explanation 现阶段console.log(...),util.inspect(...), JSON.stringify(...)在控制台输出已经够用了[2015/07/19]. 单元测试隶 ...

  9. Node.js高级编程读书笔记Outline

    Motivation 世俗一把,看看前端的JavaScript究竟能做什么. 顺便检验一下自己的学习能力. Audience 想看偏后台的Java程序员关于前端JavaScript的认识的职业前端工程 ...

随机推荐

  1. 喵哈哈村的魔法考试 Round #19 (Div.2) 题解

    题解: 喵哈哈村的魔力源泉(1) 题解:签到题. 代码: #include<bits/stdc++.h> using namespace std; int main(){ long lon ...

  2. fatal error C1083: 无法打开编译器生成的文件:“../../build/vs71/release/lib_json\json_value.asm”: No such file or directory

    修改生成静态库文件的工程的属性:路径为:菜单---项目--属性---配置属性---c/c++---输出文件---汇编程序输出:无列表

  3. ios 类别(category)

    定义 类别(category)是Objective-C语言的新特性,为现有的类添加新方法的方式.局限性:1.无法添加新的实例变量.2.与类本身的方法名称冲突.当名称冲突时,类别具有更高的优先级.作用: ...

  4. springmvc中的页面解析器ViewResolver不起作用,变量输出字符串的解决方案

    <web-app xmlns:web="http://xmlns.jcp.org/xml/ns/javaee"> <servlet> <servlet ...

  5. copy unicode HTML to clipboard

    How to copy unicode HTML code to the clipboard in html format, so it can be pasted into Writer, Word ...

  6. 在 Visual Studio 2010 中配置SharpPcap

    最近需要在C#下写一个抓取ARP包的程序,网上找来找去,在C#下只能用SharpPcap来做了.SharpPcap是作者把winPcap用C#重新封装而来的,详细信息见如下的链接. SharpPcap ...

  7. IOS 数据存储之 SQLite详解

    在IOS开发中经常会需要存储数据,对于比较少量的数据可以采取文件的形式存储,比如使用plist文件.归档等,但是对于大量的数据,就需要使用数据库,在IOS开发中数据库存储可以直接通过SQL访问数据库, ...

  8. Data Structure Visualizations

    https://www.cs.usfca.edu/~galles/visualization/Algorithms.html

  9. Chrome禁止http自动转为https

    解决方法 在Chrome浏览器地址栏输入chrome://net-internals/#hsts 在Delete domain security policies 中输入要删除自动转换的域名 原因 将 ...

  10. device eth0 does not seem to be present, delaying initialization(转)

    vmlite虚拟机启动出错,就把这个虚拟机删除掉重新建立,系统虚拟硬盘使用之前的,启动系统后不能上网,通过ifconfig查看网卡没启动,遂启动网卡服务,但是出错,就是:device eth0 doe ...