Noodjs 代理的实现:手动封装代理与http-proxy-middleware插件实现代理

手动封装代理

在服务里面封装一个http请求,发向被代理的服务器,将被代理服务器返回的数据,发送给客户端,承担一个中间桥梁作用,实现代理。

/*
    创建一个代理服务器,给发送过来的请求发送响应拉钩的服务器数据
    http://localhost:8099/listmore.json?pageNo=2&pageSize=15
    https://m.lagou.com/listmore.json?pageNo=2&pageSize=15
    req.url拿到端口后面的数据
    https.get向拉钩发送请求,把这个请求的响应数据发送给客户端,完成代理
*/
const http = require('http');
const https = require('https');
const baseUrl = "https://m.lagou.com";
http.createServer((request, response) => {
    let url = baseUrl + request.url;
    https.get(url, res => {
        let err;
        const { statusCode } = res;
        let rawData = "";

        // console.log("res.headers",res.headers["content-type"]);
        if (!statusCode === 200) err = new Error("服务器响应失败");
        if (!/application\/json|image\/x-icon/.test(res.headers["content-type"])) err = new Error("数据格式不正确");
        if (err) {
            console.log(err);
            res.resume();
            return;
        }

        res.on("data", chunk => {
            rawData += chunk;
        });

        res.on("end", () => {
            try {
                //设置编码集
                response.setHeader('content-type','application/json;chartset=utf-8');
                //设置跨域,一般不建议为*,会有安全问题,这里随便设置为百度,百度的一二级域名都能访问
                response.setHeader('access-control-allow-origin','*.baidu.com');
                response.write(rawData);
                response.end();
            } catch (e) {
                console.log(e);
            }
        });
    });
}).listen(8099, () => {
    console.log("server start at 8099");
});

http-proxy-middleware插件实现代理

用的时候需要给proxy传进一个对象参数param,这个对象有三个属性

  • target:baseurl,//是需要代理服务的站点url,
  • changeOrigin:true,//是否支持跨域
  • pathWrite:{regexstr : replacestr //regex是正则字符串,replacestr将正则匹配到的字符串替换为replacestr}
    在httpserver里面将req和res当作形参传给proxy(param)的返回值并return,实现代理
/*
    使用第三方模块 http-proxy-middleware完成代理
    http://localhost:8099/fetch/listmore.json?pageNo=2&pageSize=15
    https://m.lagou.com/listmore.json?pageNo=2&pageSize=15

    http-proxy-middleware
        const proxy = require('http-proxy-middleware');
        proxy(obj)
        只需要一个obj对象,
        obj{
            target:vaseurl,//是需要代理服务的站点url,
            changeOrigin:true,//是否支持跨域
            pathWrite:{
                regexstr : replacestr //regex是正则字符串,replacestr将正则匹配到的字符串替换为replacestr
            }
        }

*/
const http = require('http');
const proxy = require('http-proxy-middleware');
const baseUrl = "https://m.lagou.com";
http.createServer((req, res) => {
    if (/fetch/.test(req.url)) {
        var param = {
            target: baseUrl,
            changeOrigin: true,
            pathRewrite: {
                '^/fetch': ""
            }
        }
        var proxyDemo = proxy(param);
        return proxyDemo(req, res);
    } else {
        res.end();
    }
}).listen(8099, () => {
    console.log("server start at 8099");
});

原文地址:https://www.cnblogs.com/ltfxy/p/12515345.html

时间: 2024-08-29 13:35:02

Noodjs 代理的实现:手动封装代理与http-proxy-middleware插件实现代理的相关文章

动态代理实现横切——封装事务

上节课中,通过现象2可知道:如果对各个实现相同的控制,则需要重复写大量的代码.比如说,写日志,事务的开启,关闭,回滚等一系列操作. 但是在开发的过程中,如果经常注意以上的开发,那开发效率将很低的.而且还容易出错. 面对上面的问题,如果只是面向对象的编程.那开发的时候,程序员不仅要专注于业务逻辑的Coding,而且还要在后面写上日志的处理办法,事务的开启关闭等一系列与业务逻辑无关的代码.log.write(class,operate)-- 效率上肯定是要打折扣的.而且,把这种重复性的工作交给人力.

采用动态代理对事务进行封装

在上篇博客中介绍了使用ThreadLocal维护Connection的方法,这样做的最大的好处就是不用来回的传递Connection了,但是我们有会发现在我们使用事务的时候不可避免的会写许多重复的代码,这些都是与业务逻辑无关的: Connection conn = ConnectionManage.GetConnection(); ConnectionManage.beginTransaction(conn); ConnectionManage.commitTransaction(conn);/

Proxy SwitchySharp chrome网络代理【转】

Proxy SwitchySharp chrome网络代理插件概述 SwitchySharp 是 Google Chrome 浏览器上的一个代理管理扩展程序,是一款可以自己设置谷歌浏览器使用方式的chrome谷歌浏览器插件,插件是针对谷歌浏览器而开发的一款代理设置插件,基于"Proxy Switchy!"和 "SwitchyPlus"开发,能够帮助用户轻松快捷的管理和切换多个代理设置,用户可以自定义切换规则,自由畅游互联网的海洋.另外proxy switchysha

设计模式 - 代理模式(proxy pattern) 未使用代理模式 详解

代理模式(proxy pattern) 未使用代理模式 详解 本文地址: http://blog.csdn.net/caroline_wendy 部分代码参考: http://blog.csdn.net/caroline_wendy/article/details/37698747 如果需要监控(monitor)类的某些状态, 则需要编写一个监控类, 并同过监控类进行监控. 但仅仅局限于本地, 如果需要远程监控, 则需要使用代理模式(proxy pattern). 具体方法: 1. 类中需要提供

手动封装js原生XMLHttprequest异步请求

Code Object.extend =function(targetObj,fnJson){ //扩展方法,类似于jQuery的$.extend,可以扩展类的方法,也可以合并对象 for(var fnName in fnJson){ targetObj[fnName]=fnJson[fnName]; } return targetObj; }; HttpAjax = (function(){ function HttpAjax(options){ var settings={ type:'po

python扫描proxy并获取可用代理ip列表

mac或linux下可以work的代码如下: # coding=utf-8 import requests import re from bs4 import BeautifulSoup as bs import Queue import threading import random import re headers_useragents = [] headers_referers = [] headers_referers.append('http://www.google.com/?q=

使用代理IP还能查到真实IP吗?三种代理隐藏IP的效果

大家使用代理IP,主要目的几乎都是切换IP,隐藏自己真实的IP地址.这使用代理IP还能查到真实IP吗?哪些技术可以查到真实的IP呢?下面请跟黑洞代理一起去了解下关于代理IP的一些知识. 代理分为透明代理与匿名代理,而匿名代理还分普通匿名代理以及高匿名代理,这三种代理隐藏真实IP的效果怎么样呢? 1.使用透明代理能查到真实IP吗 仍然会发送你的真实IP,这种代理可以用来突破网络浏览限制,比如教育网用户上互联网. 2.使用普通匿名代理能查到真实IP吗 使用普通匿名代理,有的服务器就看不到你的真实IP

探索Mybatis之JDK动态代理:探究Proxy.newProxyInstance()生成的代理类解析

Mybatis的Mapper接口UserMapper 1 package com.safin.Mapper; 2 3 import com.safin.Pojo.User; 4 5 import java.util.List; 6 7 public interface UserMapper { 8 int insertUser(User user); 9 User getUser(Long id); 10 List<User> findUser(String userName); 11 } 我

Spring AOP动态代理实现,解决Spring Boot中无法正常启用JDK动态代理的问题

Spring AOP底层的动态代理实现有两种方式:一种是JDK动态代理,另一种是CGLib动态代理. JDK动态代理 JDK 1.3版本以后提供了动态代理,允许开发者在运行期创建接口的代理实例,而且只能为接口创建代理实例. 如果被代理目标没有接口那么Spring也无能为力,Spring通过Java的反射机制生成被代理接口的新的匿名实现类. JDK动态代理具体实现原理: 通过实现InvocationHandlet接口创建自己的调用处理器: 通过为Proxy类指定ClassLoader对象和一组in