我們可以使用Web3j OpenAPI建立RESTful服務來部署該應用程式並與之無縫整合。Swagger UI包含在服務中,因此您可以輕鬆地嘗試使用它。
建立一個新的應用程式
要使用Web3j-OpenAPI生成器生成OpenAPI專案,您需要在計算機上安裝Epirus-CLI(注意-Epirus CLI替代了Web3j CLI)。
使用以下命令安裝Epirus-CLI
$ curl -L get.epirus.io | sh
要檢查安裝是否成功以及OpenAPI生成器是否正常工作,請執行以下命令:
$ epirus openapi import --help
您應該看到生成器幫助顯示:
在本文中,我們將使用上面的Hello World合約。首先將上述程式碼複製到名為HelloWorld.sol的檔案中,並將其複製到本地目錄中。
然後,執行以下命令:
$ epirus openapi import \
-s=HelloWorld.sol \
--package=com.tutorial \
--project-name=HelloWorldProject \
--output-dir=.
您應該看到類似於以下內容的輸出:
這意味著OpenAPI專案已與SwaggerUI一起成功生成。確認目錄中有一個名為HelloWorldProject的資料夾。
如果是這樣,則您成功使用Web3j-OpenAPI生成了第一個OpenAPI專案。
下一步是執行專案。
您可以使用Epirus-CLI輕鬆執行專案,而無需指定任何配置。
如果不是,則需要指定執行時引數:例如用於簽名的私鑰或錢包檔案,要連線的節點端點等。
配置環境
要檢查所有可用選項,請使用--help標誌執行專案:
$ cd HelloWorldProject
$ ./gradlew run --args="--help"
您將看到以下顯示:
有多種方法可以指定這些引數:
環境變數
配置檔案
直接從CLI
這裡我們將透過環境變數傳遞引數,但是您可以閱讀文件中的其他選項。
為此,請執行以下命令:
$ export WEB3J_ENDPOINT=<link_to_your_Ethereum_node>
$ export WEB3J_PRIVATE_KEY=<your_private_key>
$ export WEB3J_OPENAPI_HOST=localhost
$ export WEB3J_OPENAPI_PORT=9090
執行應用程式
按如下方式執行應用程式
$ ./gradlew run
您應該能夠執行伺服器並看到以下內容:
與API互動
執行專案後,將定義端點,等待請求。為了傳送請求,我們將使用生成的Swagger-UI。
使用SwaggerUI
可以透過以下連結訪問Swagger-UI:http://<host>:<port>/swagger-ui。
在我們的例子中,它將位於http//localhost:9090/swagger-ui。
然後,使用端點POST/HellowWorldProject/contracts/helloworld部署您的合約:
如果合約成功部署,您應該會看到一個交易收據模型:
如果沒有,您應該收到一條錯誤訊息,您可以在響應中或伺服器日誌中看到該錯誤訊息。
然後,我將透過提供在上一個交易收據中收到的合約地址來呼叫greeting GET方法:
您應該看到以下響應:
透過Java / Kotlin進行互動
我們還可以使用Java或Kotlin客戶端與OpenAPI專案進行互動。
為此,首先將Web3j-OpenApi客戶端依賴項新增到您的專案中:
dependencies {
implementation "org.web3j.openapi:web3j-openapi-client:4.7.1"
}
然後與服務互動,如下所示:
var service = new ClientService("http://localhost:9090");
var helloWorldProject = ClientFactory.create(
HelloWorldProjectApi.class, service
);
System.out.println("Deploying the HelloWorld contract...");
var deployParams = new HelloWorldDeployParameters("Hello");
var receipt = helloWorldProject.getContracts()
.getHelloWorld().deploy(deployParams);
System.out.println("Deployed contract address: " +
receipt.getContractAddress());
// Load the contract from the returned transaction receipt
var helloWorld = helloWorldProject.getContracts()
.getHelloWorld().load(receipt.getContractAddress());
// Change the greeting message
var newReceipt = helloWorld.newGreeting(
new NewGreetingParameters("Hello Web3j-OpenAPI")
);
System.out.println("NewGreeting transaction hash: " +
newReceipt.getTransactionHash());
// Check that the smart contract has been updated
var greeting = helloWorld.greeting().getResult();
System.out.println("Greeting method result: " + greeting);
根據您使用的網路,部署可能需要一些時間。
處理事件
在Web3j-OpenAPI中,我們使用伺服器傳送事件(SSE)處理事件。
簡而言之,SSE是一種單向機制,一旦客戶端與客戶端建立連線,伺服器就可以將資料從伺服器非同步推送到客戶端。
要從Kotlin/Java查詢事件,請按照上面的步驟新增Web3j-OpenAPI-client依賴項。然後使用以下程式碼:
var countdownLatch = new CountDownLatch(1);
// Start listening for events
helloWorld.getEvents().getModified().onEvent(e -> {
System.out.println("Received event: " +
modifiedEvent.getNewGreeting());
countdownLatch.countDown();
});
helloWorld.newGreeting(new NewGreetingParameters(
"This will trigger a modified event"));
countdownLatch.await(); // Waits for the event
然後執行此程式碼。您應該可以在螢幕上看到事件列印。
結論
在這裡,演示了為智慧合約啟動API端點是多麼容易。考慮到現在可以輕鬆地生成它們,我們希望您可以開始考慮用於以太坊整合的api,而不是迄今為止一直是標準的討厭的整合程式碼。