
Python調用Google Bard API 完整指南
現在,您需要安裝構建 gRPC 服務所需的依賴項。這些依賴項包括:
.proto
在 gRPC 服務中加載文件。使用以下代碼安裝這些依賴項:
npm 安裝 @gRPC/gRPC-js @gRPC/proto-loader
創建您將在此項目中主要處理的兩個文件,分別是product.proto
和server.js
:
觸摸product.proto server.js
接下來,您將在文件中編寫服務定義product.proto
。如上所述,gRPC 使用 Protobuf 作為其接口定義語言。
首先,指定您將使用的 Protobuf 語法 – 并使用package
關鍵字為您的服務聲明命名空間:
語法=“proto3”;
包裝產品;
接下來,聲明客戶端可以在您的服務中遠程調用的 RPC 方法。在本教程中,您將聲明五種不同的方法對產品執行不同的操作:createProduct
、、、和readProduct
。readProducts
這些方法可以使用以下代碼聲明:updateProduct
deleteProduct
服務產品 {
rpc CreateProduct (ProductItem) 返回 (ProductItem);
rpc ReadProduct(ProductId) 返回(ProductItem);
rpc ReadProducts (VoidParam) 返回 (ProductItems);
rpc UpdateProduct(ProductItem) 返回(ProductItem);
rpc DeleteProduct(ProductId) 返回(DeleteProductResponse);
}
在此服務中,我們使用幾種消息類型作為這些方法的輸入和輸出參數:
這些消息可以用以下代碼來定義:
消息 VoidParam {}
消息產品編號 {
int32 ID=1;
}
枚舉類別 {
智能手機=1;
相機=2;
筆記本電腦=3;
耳機 = 4;
充電器=5;
揚聲器 = 6;
電視機=7;
調制解調器=8;
鍵盤 = 9;
麥克風=10;
}
消息產品項目 {
int32 ID=1;
字符串名稱 = 2;
字符串描述=3;
浮動價格=4;
類別category = 5;
}
消息產品項目 {
重復ProductItem產品=1;
}
消息 DeleteProductResponse {
bool 已刪除 = 1;
}
現在,您將使用 gRPC-js 和 proto-loader 包設置 gRPC 服務器。導航到server.js
以下代碼并粘貼:
const gRPC = require('@gRPC/gRPC-js');
const protoLoader = require(“@gRPC/proto-loader”);
const packageDef = protoLoader.loadSync("product.proto", {});
const gRPCObject = gRPC.loadPackageDefinition(packageDef);
const productPackage = gRPCObject.產品;
const 產品 = [];
函數 createProduct(調用,回調) {}
函數 readProduct(調用,回調){}
函數 readProducts(調用,回調){}
函數 updateProduct(調用,回調) {}
函數 deleteProduct(調用,回調) {}
const 服務器 = 新的 gRPC.Server();
服務器.addService(產品包.產品.服務,{
創建產品,
讀取產品,
閱讀產品,
更新產品,
刪除產品,
});
服務器.bindAsync("0.0.0.0:4000", gRPC.ServerCredentials.createInsecure(), () => {
服務器.啟動();
});
這段代碼首先.proto
使用該方法加載服務定義文件loadSync
,并將其轉換為 gRPC 對象。然后從該 gRPC 對象中引用產品包。
空products
數組將作為您的數據庫。您將從此數組中添加、刪除、更新和查詢對象。
空數組的正下方是服務函數,我們將在其中添加在 中聲明的服務方法的實現邏輯product.proto
。這些函數接受兩個參數:call
和callback
。
參數call
引用傳入的請求對象,其中包括隨該請求發送的所有參數。這callback
是服務器處理程序在處理完請求后調用的函數。它用于將響應發送回客戶端或在發生錯誤時傳達錯誤。該callback
函數的第一個參數接受一個錯誤對象(或者null
如果沒有錯誤)。第二個參數是響應對象,用于將數據返回給客戶端。
接下來使用 gRPC 模塊創建 gRPC 服務器,并使用addService
方法將服務方法添加到此服務中。最后將服務器綁定到端口并啟動。
現在,我們將編寫服務方法邏輯 – 并使用 Postman gRPC 客戶端來確認我們的方法按預期工作。
Postman gRPC 客戶端的 UI
Postman gRPC 客戶端可讓您輕松測試、協作和使用 gRPC API。您可以上傳 Protobuf 定義,Postman 將自動了解其所有服務和可用方法。它可以為每種方法生成示例有效負載,以及為整個服務生成模擬服務器。它支持服務器反射以及所有四種類型的數據流。
導航到工作臺左側邊欄上的API選項卡,然后單擊+圖標以創建新 API。選擇繼續而不使用存儲庫,單擊添加新定義文件,然后選擇Protobuf 3。創建定義,復制并粘貼整個 Protobuf 文件,然后單擊保存:
注意:您還可以使用我們的編輯器直接在 Postman 中創作 Protobuf 文件 – 或者從遠程存儲庫導入它。
接下來創建一個新的 gRPC 請求,并將此請求保存在一個新的集合中,如下所示:
服務方法的函數已在 server.js 文件中定義。我們現在將為這些不同的方法編寫邏輯。
該createProduct
方法接收一個產品對象并將其推送到數據庫數組。產品對象從中獲取request.data
。此數據被解構為包含產品 ID 的新對象。然后,將新對象推送到products
數組并發送回客戶端:
函數 createProduct(調用,回調){
const 數據 = 調用.請求;
const newProductData = {...數據,id:產品.length + 1};
產品.推送(新產品數據);
返回回調(null,newProductData);
}
添加此代碼后,使用以下命令啟動服務器:
節點服務器.js
導航到您的 Postman Collection 并創建一個名為“創建產品”的新 gRPC 請求。
將服務器 URL ( 0.0.0.0:4000
) 復制并粘貼到服務器 URL 輸入框中,然后單擊選擇方法。選擇您在上一步中創建的 API 的名稱。這應該會加載您的所有服務方法。選擇createProduct
方法。然后,在消息選項卡中,單擊使用示例消息或手動添加產品消息。修改示例消息以滿足您的需求,然后單擊調用:
您將收到包含新創建產品數據的響應,該響應可保存為此請求的示例響應:
要讀取單個產品,您將使用其 ID 在產品數組中搜索它。 如果數組中不存在具有指定 ID 的產品,則該函數將返回 gRPC 錯誤,并帶有預定義狀態代碼之一:
函數 readProduct(調用,回調){
const productId = 調用.請求.id;
const selectedProduct = products.find(product => product.id === productId);
如果(selectedProduct){
返回回調(null,selectedProduct);
} 別的 {
打回來({
代碼:gRPC.status.NOT_FOUND,
詳細信息:“找不到具有指定 ID 的產品”
});
}
}
要讀取所有產品,只需將產品數組返回給客戶端:
函數 readProducts(調用,回調){
返回回調(null,{產品});
}
重新啟動服務器,導航到您的集合,然后分別使用方法readProduct
和創建兩個新的 gRPC 請求readProducts
。正如我們所解釋的,該readProduct
方法接受id
作為其消息并僅返回指定的產品(如果該產品不存在則返回錯誤),而readProducts
消息返回所有產品的數組:
要更新產品,我們首先使用其 ID 在產品數組中找到它。然后,我們創建一個新對象,其中包含來自請求的更新產品信息。請求中未包含的任何字段都將保留其當前值。然后,這個新對象將替換產品數組中的現有對象:
函數更新產品(調用,回調){
const productInfo = 調用.請求;
const productIndex = products.findIndex(product => product.id === productInfo.id);
如果(!productIndex){
返回回調({
代碼:gRPC.status.NOT_FOUND,
詳細信息:“無法找到要更新的具有指定 ID 的產品”
});
}
const selectedProduct = 產品[productIndex];
const updatedProduct = {
id:selectedProduct.id,
名稱:productInfo.name ??selectedProduct.name,
描述:productInfo.description??selectedProduct.description,
價格:productInfo.price??selectedProduct.price,
類別:productInfo.category??selectedProduct.category,
}
產品.拼接(產品索引, 1,更新產品);
返回回調(null,updatedProduct);
}
重啟服務器,導航到您的收藏,然后添加UpdateProduct
請求。提供您要更新的產品的 ID,以及您要更新的屬性:
單擊“調用”。然后,導航到該viewProducts
方法并調用它以確認具有指定 ID 的產品確實已更新。
要刪除產品,我們將使用請求中的產品 ID 在產品數組中找到該產品的索引。然后我們將使用此索引從數組中刪除產品對象:
函數 deleteProduct(調用,回調){
const productId = 調用.請求.id;
const productIndex = products.findIndex(product => product.id === productId);
如果(!productIndex){
返回回調({
代碼:gRPC.status.NOT_FOUND,
詳細信息:“無法找到要刪除的具有指定 ID 的產品”
});
}
產品.拼接(產品索引,1);
返回回調(null,{deleted:true});
}
重新啟動服務器,在集合中創建一個新的請求,并deleteProduct
在特定的 ID 上調用該方法:
最后,調用該ReadProducts
方法來確認具有指定 ID 的產品確實已被刪除。
我們在本教程中涵蓋了很多內容。我們設置了一個 Node.js 項目,使用 Protobuf 創建了一個 gRPC 服務,并設置了一個基本服務器。然后,我們為 gRPC 服務編寫了服務函數,并了解了 Postman gRPC 客戶端如何幫助您更有效地使用 gRPC API。