struct2文件上傳
『壹』 使用 Clia Swagger Generator,在 VSCode 中從 Rust Web 介面創建文檔
這是一個提高工作效率的VSCode插件,能夠從使用Rust開發的後台介面,一鍵生成Swagger文檔,然後可以導入YAPI中,快速創建介面的文檔。
一、開發背景我們為什麼要開發這個VSCode插件?開發出來能夠帶來什麼樣的好處?
我們開發後台介面時,一般是先定義這個介面,在開發團隊內部對介面的描述進行評審,前後端開發者取得一致的意見之後,再進行介面實際程序的開發。
這樣一方面開發的介面方向不會錯,另一方面前端開發者也可以第一時間針對介面描述開始進行開發工作了。
這就要求我們文檔先行,先寫好介面的描述文檔。
以往,我們都是直接在YAPI上先進行介面文檔的編寫工作,取得一致意見後再進行介面的開發。
但是感覺直接在YAPI上編寫介面文檔,效率不是很高;而且編寫好文檔,已經出了一次力,然後再按照介面文檔開發介面的程序,這又是出了第二次力了。能不能把這兩次力合並成只出一次力呢?
於是我們想到,首先直接在程序里定義好介面,然後從程序直接生成介面文檔。
這樣做有以下幾個好處:
程序寫起來比在YAPI上寫介面文檔要稍快一點;
寫程序時更難發生拼寫錯誤,生成的文檔也就不會有了;
詳盡的文檔來源於詳盡的程序注釋,這樣會促使我們把程序注釋寫得完整詳盡,代碼更好維護一點;
導出文檔需要程序有規范的介面輸入輸出參數的類型定義,這樣會促使我們把程序也寫得更規范一點;
今後對於介面有什麼修改,也可以方便快速地導出到文檔上面來;
二、安裝插件插件使用的演示
在VSCode插件裡面直接搜索clia,應該就能看到插件「Clia Swagger Generator」了。
安裝即可。
在插件的擴展設置里,有 basePath、host、schemes 三項是需要我們進行填寫的。
三、編寫介面一個合適導出的Rust介面是什麼樣子的?
如下 Rust 代碼:
use ntex::http::StatusCode;use ntex::web::types::Json;use ntex::web::{self, Error, HttpRequest, HttpResponse};use serde::{Deserialize, Serialize};/// 注冊新開發者介面的請求。#[derive(Debug, Clone, Serialize, Deserialize)]pub struct RegisterDeveloperJson {/// 開發者注冊郵箱pub dev_email: String,/// 開發者名稱pub dev_name: String,/// 開發者類型:個人(indivial) | 企業(enterprise)pub dev_type: String,/// 開發者設定的密碼pub user_password: String,}/// 注冊新開發者介面的響應格式。#[derive(Debug, Clone, Serialize, Deserialize)]pub struct RegisterDeveloperResponse {/// 返回代碼pub code: i32,/// 返回消息pub msg: String,/// 返回數據pub data: RegisterDeveloperData,}/// 注冊新開發者介面的數據格式。#[derive(Debug, Clone, Serialize, Deserialize)]pub struct RegisterDeveloperData {/// 創建的開發者IDpub developer_id: u64,}/// 注冊新開發者。////// 請求 JSON 示例:////// <pre><code>/// {/// "dev_email": "[email protected]",/// "dev_name": "Some One",/// "dev_type": "indivial",/// "user_password": "abcd1234"/// }/// </code></pre>/// /// 返回 JSON 示例:/// /// <pre><code>/// {/// "code":0,/// "msg":"success",/// "data":{/// "developer_id":2349/// }/// }/// </code></pre>////// @returns RegisterDeveloperResponse///#[web::post("/mp/register-developer")]pub async fn register_developer(req: HttpRequest,body: Json<RegisterDeveloperJson>,) -> Result<HttpResponse, Error> {log::debug!("{:?}", req);log::debug!("{:?}", body);// responseOk(HttpResponse::build(StatusCode::OK).content_type("application/json; charset=utf-8").body(r#"{"code":0,"msg":"success","data":{"developer_id":2349}}"#,))}以上是一個實際的Rust介面程序。
需要注意以下幾點:
插件是根據 #[web:: 這個來判斷介面的位置的;
支持的參數類型包括:Query, Json;
插件根據注釋中的 @returns 判斷返回類型;
目前所有參數結構定義必須都要在這個文件裡面;
四、生成Swagger從介面定義生成Swagger文檔
在介面定義下面有個「Generate Swagger」按鈕,點一下就會生成出右邊的 Swagger 文檔來了。
在文檔上點一下「Save Swagger.json」按鈕,就可以保存文檔,保存時自動添加時間戳。
五、 導入YAPI最後一步,直接把生成的 Swagger 文檔導入到 YAPI 中。
在 YAPI 的數據管理中,選好 Swagger 格式和要導入的目錄,直接把剛才生成的 Swagger 文檔拖到上傳區域,就可以了。
介面文檔就生成出來了。
六、後續計劃羅列待辦事項
事項1:根據介面實現中的各種錯誤的返回值,自動生成錯誤代碼列表
事項2:支持其他語言開發的介面,或是Rust的其他Web框架的介面
倉庫地址:https://github.com/clia/swagger-generator
原文:https://juejin.cn/post/7100010294360932383『貳』 cmd上傳命令是啥
ftp上傳?
send
put
『叄』 C語言實現從FTP下載、上傳文件
FTP 是File Transfer Protocol(文件傳輸協議)的英文簡稱,而中文簡稱為「文傳協議」。
1.C語言可以使用CStdioFile函數打開本地文件。使用類CInternetSession 創建並初始化一個Internet打開FTP伺服器文件。
CStdioFile繼承自CFile,一個CStdioFile 對象代表一個用運行時函數fopen 打開的C 運行時流式文件。
流式文件是被緩沖的,而且可以以文本方式(預設)或二進制方式打開。文本方式提供對硬回車—換行符對的特殊處理。當你將一個換行符(0x0A)寫入一個文本方式的CStdioFile 對象時,位元組對(0x0D,0x0A)被發送給該文件。當你讀一個文件時,位元組對(0x0D,0x0A)被翻譯為一個位元組(0x0A)。
CStdioFile 不支持Duplicate,LockRange,和UnlockRange 這幾個CFile 函數。如果在CStdioFile 中調用了這幾個函數,將會出現CNoSupported 異常。
使用類CInternetSession 創建並初始化一個或多個同時的Internet 會話。如果需要,還可描述與代理伺服器的連接。
如果Internet連接必須在應用過程中保持著,可創建一個類CWinApp的CInternetSession成員。一旦已建立起Internet 會話,就可調用OpenURL。CInternetSession會通過調用全局函數AfxParseURL來為分析映射URL。無論協議類型如何,CInternetSession 解釋URL並管理它。它可處理由URL資源「file://」標志的本地文件的請求。如果傳給它的名字是本地文件,OpenURL 將返回一個指向CStdioFile對象的指針。
如果使用OpenURL在Internet伺服器上打開一個URL,你可從此處讀取信息。如果要執行定位在伺服器上的指定的服務(例如,HTTP,FTP或Gopher)行為,必須與此伺服器建立適當的連接。
在Python中編寫腳本和小程序非常便捷,但它們需要特定的Python環境才能運行。這導致了在不同電腦上運行時可能出現問題,尤其當Python版本和相關依賴庫不一致時。為了解決這個問題,一種方法是利用Pyinstaller將代碼、依賴庫以及編譯環境打包到一起,生成一個exe文件,方便跨平台運行。接下來,我們將探討如何使用Pyinstaller來實現這一功能。
一、使用Pyinstaller打包Python代碼
1. **安裝Pyinstaller**:安裝過程簡單,在命令行中運行`pip install pyinstaller`即可完成安裝。
2. **打包代碼**:以一個簡單的代碼示例進行演示。創建一個主文件`main.py`,引入自定義庫`mylib.py`,並執行特定功能。打包過程如下:
python
# mylib.py
import time
def myfunc():
now = time.time()
timetime_str = time.strftime("%Y-%m-%d %H:%M", time.localtime(now))
print('現在是' + time_str)
print("Have a nice day!")
# main.py
import mylib
import os
if __name__ == "__main__":
mylib.myfunc()
os.system('pause')
在命令行中運行`pyinstaller.exe -F yourcode.py`,執行打包操作。輸出信息會顯示打包過程的各個階段,最終生成的文件會保存在指定目錄下。此時,你將在當前文件夾下看到一系列文件,包括`main.exe`,這是打包完成的exe文件,直接雙擊即可運行。
編輯
然而,簡單的打包過程引出了一個關鍵問題:打包後的exe文件是否安全,是否會輕易被反編譯?讓我們深入探討反編譯的過程。
二、反編譯過程
1. **下載並使用pyinstxtractor解包**:採用pyinstxtractor.py工具將Pyinstaller生成的exe文件解包,以獲取源代碼。首先下載並安裝pyinstxtractor,然後將其復制到待解包的exe文件同級目錄下,執行命令`python pyinstxtractor.py xx.exe`,解包後會在目錄中生成`xx.exe_extracted`文件夾,包含多個dll、pyd等文件,其中`xxx.exe.manifest`文件是真實名稱,而一個名為`xxx`的無後綴文件則是對應的pyc文件。
2. **反編譯pyc文件**:找到pyc文件後,可以使用在線工具或本地軟體進行反編譯。注意,直接上傳可能無法反編譯成功,因為文件可能缺少首部的16個位元組(magic number),表示Python版本和編譯時間。通過從`struct`文件中復制正確的magic number,再進行反編譯,可以成功還原源代碼。
通過上述步驟,我們了解到Pyinstaller生成的exe文件其實是相對容易被反編譯的。那麼,如何保護源碼安全呢?
三、使用Pyinstaller加密打包exe
Pyinstaller本身支持加密打包,只需在打包時添加`--key`參數。例如,執行命令`pyinstaller.exe -F --key 123456 xxx.py`,這需要`pycrypto`包的支持。因此,首先確保安裝了`pycrypto`,可以通過命令`pip install pycrypto`完成安裝。如果遇到安裝問題,可以參考StackOverflow上的解答,通過設置環境變數解決VS編譯器相關問題。
總結,如果你希望保護代碼安全,可以採用以下策略:將主程序功能放入單獨的文件中,並使用加密打包。這樣,即使他人嘗試反編譯exe文件,也只能獲取到主程序入口,而無法訪問內部的源代碼。這為保護知識產權和代碼安全提供了一定程度的保障。