【Hook】postman工具的程式碼生成工具讓它錦上添花
阿新 • • 發佈:2021-01-09
修改postman工具的程式碼生成工具加入response自動生成POJO程式碼
如上圖可以快速把請求這個動作轉成code,減少重複性勞動。
但是有一點我覺得可以優化下 就是返回的json如果也能自動轉成程式碼就好了。
不然在需要把json序列化成java或者csharp的POJO物件時還得自己coding轉一遍。
由於最近經常會用到這個功能,雖然我找到一個站點把json複製貼上進去,然後點個按鈕就可以轉成POJO,但是我覺得還是有很多重複性的勞動。
對我我這種懶人,postman又沒有提供可擴充套件的功能。該怎麼辦呢?
分析postman
postman是基於Electron框架的一個產品,如下圖可以把ChromeTool開啟
嘗試一:LocalOverrides功能
這個功能可以修改程式碼後 儲存到你的本機磁碟,然後下一次就會檢測 如果有設定localOverrides的話就用你修改過後的程式碼!
結論:postman比較是一個商業工具,它內部有檢測機制,開啟這個功能就會不能正常使用!所以放棄!
嘗試二:直接修改postman的原始碼
1.定位到postman的原始碼如下圖是一個asar檔案
2.安裝asar工具解壓到本地
安裝asar工具
npm install -g asar
定位到postman的asar目錄解壓出來
asar extract app.asar app
3.找到原始碼
找原始碼的過程我就不說了 這裡面要實現我上面說的功能 需要修改2個js原始碼
- vendor-shared.js --》這是postman的主原始碼 有幾百萬行程式碼
- postman-code-generators.js --》這個是程式碼生成的邏輯
4. 修改vendor-shared.js原始碼
定位到483842行 加入程式碼
程式碼的作用:在點擊發送請求後,postman拿到程式碼如果是json格式的話 就存到本地快取中
const transformResponseForLanguage = { json: function (value) { // This unescape step handles escape sequences like - // 1. Unicode code points - hexadecimal - fixed length - \uD834 // 2. Special escape characters - \/ // 這裡加 try { localStorage.setItem('_current_reponse_json', value); } catch (e) { } return Object(_js_modules_services_StringUnescape__WEBPACK_IMPORTED_MODULE_9__["unescape"])(value); } };
4. 修改postman-code-generators.js原始碼
原理說明:這裡是在網上找了一個介面,傳json就可以轉成程式碼
這裡注意一下,用的xhr,同步的方式呼叫
(非同步的方式postman我測試了不行,因為postman的上游程式碼是直接拿結果的,改成非同步的話上游程式碼也得改,這個功能其實同步也還好,就比之前稍微慢了1秒左右)
- 定位到632行 這裡是生成csharp程式碼
//下面加入json轉POJO的程式碼
try {
var input = localStorage.getItem('_current_reponse_json');
var code = '';
if(input){
var requestType = {
input : input,
operationid:"jsontocsharp",
settings:{
UsePascalCase:true,
UseJsonAttributes:false,
UseFields:false,
UseJsonPropertyName:false
}
};
var data = JSON.stringify(requestType);
var xhr = new XMLHttpRequest();
xhr.addEventListener("readystatechange", function() {
if(this.readyState === 4) {
var next = false;
var result = [];
for(var i = 0;i< this.responseText.length;i++)
{
var item = this.responseText[i];
if(item == '\"'){}
else if(item == "\\" || item == "/"){next = true}
else if(next){next = false,result.push("\n")}
else{result.push(item)}
}
code= '\n //Deserialize json response to POJO \n'+result.join("").replace('myJsonResponse','response.Content');
}
});
xhr.onerror = function () {
return callback(null, headerSnippet + snippet + footerSnippet);
}
xhr.open("POST", "https://json2csharp.com/api/Default",false);
xhr.setRequestHeader("Accept", "*/*");
xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest");
xhr.setRequestHeader('Content-type', 'application/json');
xhr.send(data);
return callback(null, headerSnippet + snippet + code + footerSnippet);
}
} catch (e) {
return callback(null, headerSnippet + snippet + footerSnippet);
}
- 定位到16668行 這裡是生成java程式碼
//下面加入json轉POJO的程式碼
try {
var input = localStorage.getItem('_current_reponse_json');
var code = '';
if(input){
var requestType = {
input : input,
operationid:"jsontopojo",
settings:{
UseProperties:false
}
};
var data = JSON.stringify(requestType);
var xhr = new XMLHttpRequest();
xhr.addEventListener("readystatechange", function() {
if(this.readyState === 4) {
var next = false;
var result = [];
for(var i = 0;i< this.responseText.length;i++)
{
var item = this.responseText[i];
if(item == '\"'){}
else if(item == "\\"){next = true}
else if(next){next = false,result.push("\n")}
else{result.push(item)}
}
code= '\n //Deserialize json response to POJO \n'+result.join("").replace('myJsonResponse','response.Content');
}
});
xhr.onerror = function () {
return callback(null, headerSnippet + snippet + footerSnippet);
}
xhr.open("POST", "https://json2csharp.com/api/Default",false);
xhr.setRequestHeader("Accept", "*/*");
xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest");
xhr.setRequestHeader('Content-type', 'application/json');
xhr.send(data);
snippet = snippet + code;
}
} catch (e) {
}
5.原始碼修改後重新打包成asar檔案
asar pack app app.asar
搞定驗證結果
java的方式
csharp的方式