nj11--http

本文介绍Node.js中的HTTP服务器实现,包括http.Server的基本使用方法、事件处理、请求与响应对象的特性,以及如何处理GET和POST请求。
概念:Node.js提供了http模块。其中封装了一个高效的HTTP服务器和一个建议的HTTP客户端。

http.server是一个基于事件的HTTP服务器。内部有C++实现。接口由JavaScript封装。

http.request则是一个HTTP客户端工具。用户向服务器发送请求。

一、HTTP服务器
http.Server实现的,它提供了一套封装级别很低的API,仅仅是流控制和简单的解析,所有的高层功能都需要通过它的接口
前面讲解的app.js案例

代码分析:
http.createServer创建了一个http.Server的实例,将一个函数作为HTTP请求处理函数。这个函数接受两个参数,请求对象req和相应对象的res。res显式写入了响应代码200(表示请求成功),指定相应头,写入响应体。调用end结束并发送。该实例调用listen函数,启动服务器并监听3000端口。

1.http.Server的事件
http.Server是一个基于事件的HTTP服务器,所有请求都被封装到独立的事件,开发者只要对它的事件编写相应函数可实现HTTP服务器的所有功能,它继承与EventEmitter,提供了以下事件:

request:当客户端请求到来时,该事件被触发,提供两个参数req和res,分别是http.ServerRequest和http.ServerResponse的实例,表示请求和响应信息。

connection:当TCP连接建立时,该事件被触发,提供一个参数socket,为net.Socket的实例(底层协议对象)。

close:当服务器关闭时,该事件被触发。

除此之外还有checkContinue、upgrade、clientError事件。
最常用和关心的是:request事件,http提供了一个捷径,http.createServer([requestListener])
显式实现方法:
案例:server.js

2.http.ServerRequest请求的信息
此对象是后端开发者最关注的内容,它一般由http.Server的request事件发送,作为第一个参数传递,通常简写成request或req。
HTTP请求分为两部分:请求头和请求体。,请求内容短的直接在请求头解析完成后立即读取,而请求体可能相对较长,需要一定的时间传输,因此提供了3个事件用于控制请求体传输。
(1)data:当请求体数据到来时,该事件被触发,该事件一共一个参数chunk,表示接受到的数据。
(2)end:当请求体数据传输完成时,该事件被触发,此后将不会再有数据到来。
(3)close:用户当前请求结束时,该事件被触发,不同于end,如果用户强制终止了传输,也会触发close
            ServerReuqest的属性
complete:客户端请求是否已经发送完成
httpVersion    HTTP协议版本,通常是1.0或1.1
method        HTTP请求方法,如:GET,POST
url                原始的请求路径,例如/pc/getUser或/user?name=marico
headers       HTTP请求头
trailers       HTTP请求尾(不常见)
connection              当前HTTP连接套接字,为net.Socket的实例
socket                   connection属性的别名
client            client属性的别名
3.获取GET请求内容
由于GET请求直接被嵌入在路径中,URL完整的请求路径,包括了?后面的部分,因此你可以手动解析后面的内容作为GET的参数,Nodejs的url模块中的parse函数提供了这个功能
案例:get.js
4.获取POST请求内容
POST请求的内容全部都在请求体中,http.ServerRequest并没有一个属性内容为请求体,原因是等待请求体传输可能是一件耗时的工作。譬如上传文件。恶意的POST请求会大大消耗服务器的资源。所以Nodejs是不会解析请求体,当你需要的时候,需要手动来做。
post.js
5.http.ServerResponse返回给客户端的信息
决定了用户最终能到的结果,它是由http.Server的request事件发送的,作为第二个参数传递。一般为response或res
主要的三个函数:
response.writeHead(statusCode,[headers]):向请求的客户端发送响应头。
statusCode是HTTP的状态码,如200为成功,404未找到等。
headers是一个类似关联数组的对象,表示响应头的每个属性。
response.write(data,[encoding]) 向请求客户端发送相应内容,data是buffer或字符串,encoding为编码
response.end([data],[encoding]) 结束响应,告知用户所有发送已经完成,当所有要返回的内容发送完毕,该函数必须被调用一次,如果不调用,客户端永远处于等待状态
复制代码
复制代码
var http=require('http');
var server=new http.Server();
server.on('request',function(req,res){//事件触发
    res.writeHead(200,{'Content-Type':'text/html'});
    res.write('<h1>we are pcat</h1>');
    res.end("<p>I'm marico.</p>");
});
server.listen(3000);
复制代码
复制代码
//引入模块
var http=require('http')
//创建服务
var server=http.createServer(function(req,res){
    //相当于action都在这里定义
    //响应头
    res.writeHead(200,{'Content-Type':'text/html'});
    //相应内容
    res.write('<h1>Node.js</h1>');
    //结束响应
    res.end('<p>PCAT</p>');
//监听端口
})
server.listen(3000);
server.on('close',function(){
    console.log('server is close');
})
console.log('HTTP server is listening at port 3000.');
复制代码
复制代码
//引入模块
var http=require('http');
var urls=require('url');
var util=require('util');
//创建服务
http.createServer(function(req,res){//get方式
    res.writeHead(200,{'Content-Type':'text/plain'});
    //解析并打成字符串形式返回给客户端
    res.end(util.inspect(urls.parse(req.url,true)));
}).listen(3000);
复制代码
复制代码
var http=require('http');
var querystring=require('querystring');
var util=require('util');
http.createServer(function(req,res){//post方式
    var post='';
    //注册data事件监听函数,每当接受请求体的数据
    req.on('data',function(chunk){
        post+=chunk;
    });
    //当请求体数据传输完成时,该事件被触发,此后将不会再有数据到来。
    req.on('end',function(){
        //解析成真正的post为真正的post请求格式
        //相当于Ext.decode()
        post=querystring.parse(post);
        //向前端返回
        res.end(util.inspect(post));
    });
}).listen(3000);
复制代码

 


本文转自农夫山泉别墅博客园博客,原文链接:http://www.cnblogs.com/yaowen/p/7015524.html,如需转载请自行联系原作者

package cn.neuedu.mall.springbootvue.common.config; public class AlipayConfig { //APPID,收款账号即APPID对应支付宝账号 public static String app_id = "9021000150689496"; //商户私钥,PKCS8格式RSA2私钥 public static String merchant_private_key ="MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDKy65SxWeREue6zDO2vlAVlUnTOklhn/+/04C2NNJKCKo5Jih3STTHMlj0RffAMGs8gcUFacumniz7n6Y5feOWnvX+fEOzdUC/4FoEGcxQ0KnhEipkUMFb7mN04lbzmMwoeSez9rxME1tPZUlLfVVc82lYihyZhShnWOSP5ZlEtXrUpH9VCUVNrpgN7j2M9XipgLUs/wgfI+dleCC5MxPNw3PCSXkJ7KX97nzUhAaEe+mybqM1x7aZzEIJfSLlBZBYjOt2aN/OeELV/rtx++Xa4PnEu+rzr4RubjHlv0cvYrlcA14rD/u2E7kTFHLRy0OqN7WAFOugC5qWPo+koVipAgMBAAECggEAe0ksJ0G/XqDho9w0rCoywYxKn1FV/zWn41SPcTXXig6OfcPG4g3tOhRPo+FNZteIufYictIIbrjGnApIobb4vz7QSe/9sIHd5UhdMRUF8zOHsz656tZ1VpAsgoh/WARSSWCuVGfxvUYfQrtOvcfqN2H7b0o3bNVY5MtT2G86qFue0LLfYisNFJfRJePIfrxiiHB3fSdgug2CRffL5jly7B0E38AUmhHCKFsowdXG9YgK9Qt9TPFR6kUrCHLCUHXVaOs2XNhwLIUsEcey9c4sDSsh4DxuPw1JaadP7ou1UADE4NJ7rfUc3p5LXBLJf7JSzIZe3RD3okK0VWnxGfqLKQKBgQDkc1DmRXAIZzeWgY9Ju9YTAsIY6xwNBCWOzhfrxW/eQOBfXgKdaxZSyghB98W+1Gth8f/WggbF1ZXQ+S4cpYXCzV3/qL/PFZ5thOv7MZPcCt6+SwTTlS4g1SQvgX89gYRuffi9n1Zzzd1vL206l7jbFiXdU0QqWtciqGkMGUF5fwKBgQDjQFp/i6TpRRD/lYPBJ+Xu5GVmnuhhBACEB74OiognDrf4y9J0FLcE47O+t7DsSORpFTGM+PN21AZlquROieDkJ/v48wZ4kBr4UOhdSoM+ix78UWnKde9z7RJHO+n23hV3y9YJ4XJysTQNgE2TUqF/oJDkF2Gn1/ioP0R9XR0x1wKBgB88iUZDHlN30Yj5xB7f2SCWUvXXR+mbtIr3MRwize4EzukbUJ43o0DEsSZb+6ThJKGq1kF9W/G3B5ogSCbQlx6QuBaZ+0gUe6ob76xUFhSTQ+ufFFTd5AXHPwBj44MEb5gwD0/WNpr0/h8SzAuj7Tm/qIO/u+VSsHHjtyFZXrN/AoGBAMv7FcBqzkn8jrd7s1oLwB5gsIwekyOR/gyFDpnqyy+TzJrsCSnc9jLTWKIWLB7Lhwqz1VheldrRkjRr4qaEqHLjWQ8qxWIup6bAqPIkUg4vvk5pnXX3yknaQI/kPawzyD1Rn/waeypr2PdNdVSJ1SDENYonWqbX+wC6WXXVwMDdAoGBAL2YDhkAjpKF9T9DNUs3qfjo3jFu4olpoYCzvUnRMVF7/fa0EMwxt1wb2G1PF0otVBkbpmDA3WWJIFebtheYzYnqeau6AJx/lWZGI9Thh7yiCdNv68kcMENE8KYZGsMuhfgnm3nsOzOxA5t0VVLH8OHJnwXpNTUH3OFufVg2xk1g"; //支付宝公钥 public static String alipay_public_key ="MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtIEaA85EuJngOjMXTLXcHfi3gDa7bp2GMgPY+S2SGAqMqchyp7sEpKZthOq31RmMwHolyJga4TcZIUmtI1qCCB041pwSwAIa5jFkU4+nVMbvALJ4Tv8owfzUSsAH9r5xQWzuDTkQbIPA5PVR5/hnTxub0Y/ZrNnNOJVKchoJmyc6qXp0N2irdz3p184mq3rfoNVuz/rJ+OvKjUsSgWXGS5rRwFrjD4DGPFnGXy7UR7UqDmz/C+8xUET4Gks9BliOZuAwF3CGZzQB2Fn0VkX+nNAFPA2yMxS2LULzgZFqVi1eWFEobPmOZe8PB3xX/c+cskZ5zY4CTlmzH8VfWsiW2wIDAQAB"; //服务器异步通知页面路径 public static String notify_url = "http://localhost:8080/alipay/notify"; //页面跳转同步通知页面路径 public static String return_url = "http://localhost:8080/payresult"; //签名方式 public static String sign_type = "RSA2"; //字符编码格式 public static String charset = "utf-8"; //支付宝网关 public static String gatewayUrl = "https://openapi-sandbox.dl.alipaydev.com/gateway.do"; public static String getApp_id() { return app_id; } public static String getMerchant_private_key() { return merchant_private_key; } public static String getAlipay_public_key() { return alipay_public_key; } public static String getNotify_url() { return notify_url; } public static String getReturn_url() { return return_url; } public static String getSign_type() { return sign_type; } public static String getCharset() { return charset; } public static String getGatewayUrl() { return gatewayUrl; } } 我的配置有问题吗
最新发布
08-08
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值