网站后台怎么转发网页内容(前后端联调插件的功能介绍及扩展目录结构介绍分析)

优采云 发布时间: 2022-04-19 03:09

  网站后台怎么转发网页内容(前后端联调插件的功能介绍及扩展目录结构介绍分析)

  1.需求背景

  现在前后端联调一般都需要后端在rap2上新建接口,并一一添加输入输出参数。编辑好界面后,需要在编写代码时一一定义输入和输出参数。过程有点难。由此产生了一个想法,是否可以根据后端代码的输入输出参数在rap2上自动生成一个界面,然后在前端请求真实界面时,浏览器插件将请求重定向到 rap2 上的相应接口。这样,真正联调只需要关闭浏览器插件的重定向功能,不需要更改请求地址。

  研究发现rap2的接口地址(如:/app/mock/3130/orderSkuApprove/list)固定在/app/mock/前面,后面跟着一个id(3130),一般不同的应用将对应不同的id,最后是接口路径(/orderSkuApprove/list),以及/orderSkuApprove/list等真正的请求地址,转发到rap2只需要将/替换成/app/mock/3130/即可。因为上一部分是不变的,所以只需要记录域名对应的id即可。

  从上面的分析可以看出,浏览器插件的功能是:一个开关,可以打开或关闭;可以对域名对应的id进行编辑和存储。开关打开时可以根据存储的域名和id映射关系自动转发,开关关闭时不转发。

  2.目录结构介绍

  chrome 扩展目录

  

  2.1 manifest.json

  这是 Chrome 插件中最重要和最重要的文件。用于配置所有插件相关的配置,必须放在根目录下。其中manifest_version、name、version是必不可少的,推荐使用description和icon。

  manifest.json 代码

  {

"name": "WdkMockData",

"version": "0.0.1",

"description": "五道口 Mock data",

"permissions": [

"",

"webRequest",

"webRequestBlocking",

"activeTab",

"storage",

"tabs"

],

"options_page": "options.html",

"background": {

"scripts": ["background.js"],

"persistent": true

},

"browser_action": {

"default_popup": "index.html",

"default_icon": {

"16": "images/get_started16.png",

"32": "images/get_started32.png",

"48": "images/get_started48.png",

"128": "images/get_started128.png"

}

},

"icons": {

"16": "images/get_started16.png",

"32": "images/get_started32.png",

"48": "images/get_started48.png",

"128": "images/get_started128.png"

},

"manifest_version": 2

// "content_security_policy": "script-src http://rap2api.taobao.org/; object-src 'self'"

}

  2.2 弹出窗口

  弹窗是一个小窗口网页,点击图标时打开,焦点离开网页后立即关闭。一般用于一些临时的交互。

  

  popup.html 代码

  (我在这个项目之后直接用 index.html 替换了 popup.html)

  

Dva Demo

  popup.js也被替换成了index.js,因为js代码是经过工程压缩的,所以这里就不贴了。

  2.3 背景

  背景(让我们这样翻译)是一个常驻页面。它的生命周期是插件中所有类型页面中最长的。它随着浏览器的打开而打开,随着浏览器的关闭而关闭,所以通常情况下,需要一直运行的全局代码,启动并运行,都放在后台。后台的权限很高,几乎可以调用所有的Chrome扩展API(除了devtools),并且可以无限跨域访问,即你可以访问任意一个网站跨域而不需要其他设置 CORS 的一方。

  background.js 代码

<p>&#39;use strict&#39;;

let domainMapArr = [];

let domainSwitch = false;

chrome.storage.sync.get(

{

domainToRap2: [],

domainSwitch: false

},

(result) => {

domainMapArr = result.domainToRap2;

domainSwitch = result.domainSwitch

}

);

chrome.storage.onChanged.addListener((changes) => {

chrome.storage.sync.get({

domainToRap2: [],

domainSwitch: false

}, (result) => {

domainMapArr = result.domainToRap2;

domainSwitch = result.domainSwitch;

});

});

chrome.webRequest.onBeforeRequest.addListener(

function(details) {

let domainMap = {}

domainMapArr.map(item => {

if(item){

domainMap[item.domain] = item.id

}

})

if(!domainSwitch){

return {cancel: false}

}else{

let domain = details.url.split(&#39;/&#39;)[2]

let pathName = details.url.split(&#39;/&#39;).splice(3).join(&#39;/&#39;)

if(domainMap[domain] && details.method.toLowerCase() !== &#39;options&#39;){

return {

redirectUrl: `http://rap2api.alibaba-inc.com/app/mock/${domainMap[domain]}/${pathName}`

};

}

}

},

{urls: [""]},

[&#39;blocking&#39;, "requestBody"]

);

chrome.webRequest.onBeforeSendHeaders.addListener(function(details){

var headers = details.requestHeaders

if(headers && headers.length){

headers.map(item => {

if(item.name.toLowerCase() === "access-control-request-method"){

console.log(&#39;access-aontrol-request-method&#39;, item.value)

}

})

}

return {requestHeaders: headers};

},

{urls: [ "" ]},[&#39;blocking&#39;, &#39;requestHeaders&#39;]);

chrome.webRequest.onSendHeaders.addListener(function(details){

// console.log(&#39;onSendHeaders---&#39;, JSON.stringify(details))

},{urls: [ "" ]})

chrome.webRequest.onHeadersReceived.addListener(details => {

let headers = details.responseHeaders;

let temptOrigin = details.initiator || "*";

let domainMap = {}

domainMapArr.map(item => {

if(item){

domainMap[item.domain] = item.id

}

})

let domain = details.url.split(&#39;/&#39;)[2]

if(domainMap[domain]){

for( var i = 0, l = headers.length; i

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线