【Hook】postman工具的代碼生成工具讓它錦上添花


 

修改postman工具的代碼生成工具加入response自動生成POJO代碼

image

如上圖可以快速把請求這個動作轉成code,減少重復性勞動。

但是有一點我覺得可以優化下 就是返回的json如果也能自動轉成代碼就好了。

不然在需要把json序列化成java或者csharp的POJO對象時還得自己coding轉一遍。

由於最近經常會用到這個功能,雖然我找到一個站點把json復制粘貼進去,然后點個按鈕就可以轉成POJO,但是我覺得還是有很多重復性的勞動。

對我我這種懶人,postman又沒有提供可擴展的功能。該怎么辦呢?

分析postman

 

postman是基於Electron框架的一個產品,如下圖可以把ChromeTool打開

image

嘗試一:LocalOverrides功能

這個功能可以修改代碼后 保存到你的本機磁盤,然后下一次就會檢測 如果有設置localOverrides的話就用你修改過后的代碼!

結論:postman比較是一個商業工具,它內部有檢測機制,開啟這個功能就會不能正常使用!所以放棄! image

嘗試二:直接修改postman的源碼

1.定位到postman的源碼如下圖是一個asar文件

image

2.安裝asar工具解壓到本地

安裝asar工具

npm install -g asar

image

定位到postman的asar目錄解壓出來


asar extract app.asar app

image

3.找到源碼

找源碼的過程我就不說了 這里面要實現我上面說的功能 需要修改2個js源碼

  • vendor-shared.js --》這是postman的主源碼 有幾百萬行代碼
  • postman-code-generators.js --》這個是代碼生成的邏輯
4. 修改vendor-shared.js源碼

定位到483842行 加入代碼

代碼的作用:在點擊發送請求后,postman拿到代碼如果是json格式的話 就存到本地緩存中

image

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);
  } };

image

4. 修改postman-code-generators.js源碼

原理說明:這里是在網上找了一個接口,傳json就可以轉成代碼

這里注意一下,用的xhr,同步的方式調用

(異步的方式postman我測試了不行,因為postman的上游代碼是直接拿結果的,改成異步的話上游代碼也得改,這個功能其實同步也還好,就比之前稍微慢了1秒左右)

  1. 定位到632行 這里是生成csharp代碼
	//下面加入jsonPOJO的代碼
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);
}

  1. 定位到16668行 這里是生成java代碼

//下面加入jsonPOJO的代碼
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) {
	
}

image

5.源碼修改后重新打包成asar文件

asar pack app app.asar

image

搞定驗證結果

java的方式

image

csharp的方式

image

image


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM