From 6d5405bb6618eff1c55628c79d24352850153cc2 Mon Sep 17 00:00:00 2001 From: Vincent Zhang Date: Mon, 29 Jan 2024 20:28:52 +0800 Subject: [PATCH 1/3] Add https outcalls sample. --- .../img/candid-web-ui-get.png | Bin 0 -> 27257 bytes .../img/candid-web-ui-post.png | Bin 0 -> 29588 bytes .../7-code-examples/4-https-outcalls/index.md | 1521 +++++++++++++++++ 3 files changed, 1521 insertions(+) create mode 100644 docusaurus/docs/getting-started/7-code-examples/4-https-outcalls/img/candid-web-ui-get.png create mode 100644 docusaurus/docs/getting-started/7-code-examples/4-https-outcalls/img/candid-web-ui-post.png create mode 100644 docusaurus/docs/getting-started/7-code-examples/4-https-outcalls/index.md diff --git a/docusaurus/docs/getting-started/7-code-examples/4-https-outcalls/img/candid-web-ui-get.png b/docusaurus/docs/getting-started/7-code-examples/4-https-outcalls/img/candid-web-ui-get.png new file mode 100644 index 0000000000000000000000000000000000000000..d35ba815e4e9ac9a6ce6c1d30a725083a30b74f6 GIT binary patch literal 27257 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 U>kfJZ7-Wap6|2jLOJ1;l0TE08&j0`b literal 0 HcmV?d00001 diff --git a/docusaurus/docs/getting-started/7-code-examples/4-https-outcalls/img/candid-web-ui-post.png b/docusaurus/docs/getting-started/7-code-examples/4-https-outcalls/img/candid-web-ui-post.png new file mode 100644 index 0000000000000000000000000000000000000000..b26a2ac0d48e0756d95a2dbc5988143cfd2f8f50 GIT binary patch literal 29588 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 async HttpResponsePayload; + context : Blob; + }; + + //2.2 These types describes the arguments the transform function needs + public type TransformArgs = { + response : HttpResponsePayload; + context : Blob; + }; + + public type CanisterHttpResponsePayload = { + status : Nat; + headers : [HttpHeader]; + body : [Nat8]; + }; + + public type TransformContext = { + function : shared query TransformArgs -> async HttpResponsePayload; + context : Blob; + }; + + //3. Declaring the management canister which you use to make the HTTPS outcall + public type IC = actor { + http_request : HttpRequestArgs -> async HttpResponsePayload; + }; + + } + ``` + + :::info + + 上述代码有可能更新,请参考 [Types.mo](https://github.com/dfinity/examples/blob/master/motoko/send_http_get/src/send_http_get_backend/Types.mo) 获取最新版本。 + + ::: + +- 本地部署并测试。 + + 执行以下命令: + ``` + dfx start --background + dfx deploy + ``` + + 如果成功,您将在命令行看到类似如下的输出: + ``` + Deployed canisters. + URLs: + Backend canister via Candid interface: + send_http_get_motoko_backend: http://127.0.0.1:4943/?canisterId=avqkn-guaaa-aaaaa-qaaea-cai&id=b77ix-eeaaa-aaaaa-qaada-cai + ``` + + 您可以打开 Candid Web UI 并调用 `get_icp_usd_exchange()` 方法。 + +- 在 IC 主网部署并测试。 + + 执行以下命令: + ``` + dfx deploy --network ic + ``` + + 如果成功,您将在命令行看到类似如下的输出: + ``` + Deployed canisters. + URLs: + Backend canister via Candid interface: + send_http_get_motoko_backend: https://a4gq6-oaaaa-aaaab-qaa4q-cai.raw.icp0.io/?id=eppuh-hqaaa-aaaan-qlsoa-cai + ``` + + 同样您可以打开 Candid Web UI 并调用 `get_icp_usd_exchange()` 方法。 + + +### Rust 版本 {#rust-version-get} + +#### Rust 代码结构 {#rust-code-structure-get} + +在您深入了解之前,我们先介绍您将要接触的代码的大致结构: + +```jsx +//1. DECLARE MANAGEMENT CANISTER +use ic_cdk::api::management_canister::http_request::{ + http_request, CanisterHttpRequestArgument, HttpHeader, HttpMethod, HttpResponse, TransformArgs, + TransformContext, +}; + +//Update method using the HTTPS outcalls feature +#[ic_cdk::update] +async fn foo() { + //2. SETUP ARGUMENTS FOR HTTP GET request + let request = CanisterHttpRequestArgument { + //instantiate the request + }; + + //3. MAKE HTTPS REQUEST AND WAIT FOR RESPONSE + //Note: in Rust, `http_request()` already sends the cycles needed + //so no need for explicit Cycles.add() as in Motoko + match http_request(request).await { + + //4. DECODE AND RETURN THE RESPONSE + Ok((response,)) => { + //Ok case + } + Err((r, m)) => { + //error case + } + } +} + +// 4. CREATE TRANSFORM FUNCTION +#[query] +fn transform(raw: TransformArgs) -> HttpResponse { } +``` + +#### Rust 步骤 {#rust-steps-get} + +- 进入您想要创建工程的目录,执行以下命令创建新工程: + ``` + dfx new --type=rust --no-frontend send_http_get_rust + cd send_http_get_rust + ``` + 这里我们使用了 `--no-frontend` 选项,创建了一个最简单的工程。 + +- 打开 `dfx.json` 文件,替换为以下内容: + + ``` + { + "canisters": { + "send_http_get_rust_backend": { + "candid": "src/send_http_get_rust_backend/send_http_get_rust_backend.did", + "package": "send_http_get_rust_backend", + "type": "rust" + } + }, + "defaults": { + "build": { + "args": "", + "packtool": "" + } + }, + "output_env_file": ".env", + "version": 1 + } + ``` + 这样您的工程只包含一个后端容器,同时您可以删除掉 `src\send_http_get_rust_frontend` 目录。 + +- 打开 `src/send_http_get_rust_backend/src/lib.rs` 替换为以下内容: + + ```jsx + //1. IMPORT MANAGEMENT CANISTER + //This includes all methods and types needed + use ic_cdk::api::management_canister::http_request::{ + http_request, CanisterHttpRequestArgument, HttpHeader, HttpMethod, HttpResponse, TransformArgs, + TransformContext, TransformFunc, + }; + + use ic_cdk_macros::{query, update}; + + //Update method using the HTTPS outcalls feature + #[update] + async fn get_icp_usd_exchange() -> String { + //2. SETUP ARGUMENTS FOR HTTP GET request + + // 2.1 Setup the URL and its query parameters + type Timestamp = u64; + let start_timestamp: Timestamp = 1682978460; //May 1, 2023 22:01:00 GMT + let seconds_of_time: u64 = 60; //start with 60 seconds + let host = "api.pro.coinbase.com"; + let url = format!( + "https://{}/products/ICP-USD/candles?start={}&end={}&granularity={}", + host, start_timestamp, start_timestamp, seconds_of_time + ); + + // 2.2 prepare headers for the system http_request call + //Note that `HttpHeader` is declared in line 4 + let request_headers = vec![ + HttpHeader { + name: "Host".to_string(), + value: format!("{host}:443"), + }, + HttpHeader { + name: "User-Agent".to_string(), + value: "exchange_rate_canister".to_string(), + }, + ]; + + //note "CanisterHttpRequestArgument" and "HttpMethod" are declared in line 4 + let request = CanisterHttpRequestArgument { + url: url.to_string(), + method: HttpMethod::GET, + body: None, //optional for request + max_response_bytes: None, //optional for request + transform: Some(TransformContext { + // The "method" parameter needs to the same name as the function name of your transform function + function: TransformFunc(candid::Func { + principal: ic_cdk::api::id(), + method: "transform".to_string(), + }), + // The "TransformContext" function does need a context parameter, it can be empty + context: vec![], + }), + headers: request_headers, + }; + + //3. MAKE HTTPS REQUEST AND WAIT FOR RESPONSE + + //Note: in Rust, `http_request()` needs to pass cycles if you are using ic_cdk: ^0.9.0 + let cycles = 230_949_972_000; + + match http_request(request, cycles).await { + //4. DECODE AND RETURN THE RESPONSE + + //See:https://docs.rs/ic-cdk/latest/ic_cdk/api/management_canister/http_request/struct.HttpResponse.html + Ok((response,)) => { + //if successful, `HttpResponse` has this structure: + // pub struct HttpResponse { + // pub status: Nat, + // pub headers: Vec, + // pub body: Vec, + // } + + //You need to decode that Vec that is the body into readable text. + //To do this: + // 1. Call `String::from_utf8()` on response.body + // 3. You use a switch to explicitly call out both cases of decoding the Blob into ?Text + + //The API response will looks like this: + + // ("[[1682978460,5.714,5.718,5.714,5.714,243.5678]]") + + //Which can be formatted as this + // [ + // [ + // 1682978460, <-- start/timestamp + // 5.714, <-- low + // 5.718, <-- high + // 5.714, <-- open + // 5.714, <-- close + // 243.5678 <-- volume + // ], + // ] + + //Return the body as a string and end the method + String::from_utf8(response.body).expect("Transformed response is not UTF-8 encoded.") + } + Err((r, m)) => { + let message = + format!("The http_request resulted into error. RejectionCode: {r:?}, Error: {m}"); + + //Return the error as a string and end the method + message + } + } + } + + // Strips all data that is not needed from the original response. + #[query] + fn transform(raw: TransformArgs) -> HttpResponse { + let headers = vec![ + HttpHeader { + name: "Content-Security-Policy".to_string(), + value: "default-src 'self'".to_string(), + }, + HttpHeader { + name: "Referrer-Policy".to_string(), + value: "strict-origin".to_string(), + }, + HttpHeader { + name: "Permissions-Policy".to_string(), + value: "geolocation=(self)".to_string(), + }, + HttpHeader { + name: "Strict-Transport-Security".to_string(), + value: "max-age=63072000".to_string(), + }, + HttpHeader { + name: "X-Frame-Options".to_string(), + value: "DENY".to_string(), + }, + HttpHeader { + name: "X-Content-Type-Options".to_string(), + value: "nosniff".to_string(), + }, + ]; + + let mut res = HttpResponse { + status: raw.response.status.clone(), + body: raw.response.body.clone(), + headers, + }; + + if res.status == 200u64 { + res.body = raw.response.body; + } else { + ic_cdk::api::print(format!("Received an error from coinbase: err = {:?}", raw)); + } + res + } + ``` + + :::info + + 上述代码有可能更新,请参考 [lib.rs](https://github.com/dfinity/examples/blob/master/rust/send_http_get/src/send_http_get_backend/src/lib.rs) 获取最新版本。 + + ::: + + - `get_icp_usd_exchange() -> String` 返回了一个字符串。这不是必须的,本教程中这样做是为了更容易测试。 + + - `lib.rs` 文件使用了 [http_request](https://docs.rs/ic-cdk/latest/ic_cdk/api/management_canister/http_request/fn.http_request.html),这是 Rust CDK 提供的一个方法,它在底层向 IC 管理容器发送 cycles。该方法能够计算出在大多数情况下,对于一个 13 节点的子网需要发送多少cycles。如果您的 HTTPS outcall 需要更多的 cycles,请使用 `http_request_with_cycles()` 方法,并明确地提供所需的 cycles 数量。 + + - 上面使用的 Rust CDK 方法 `http_request` 封装了 IC 管理容器的 `http_request` 方法,但它们两者并不严格相同。 + +- 打开 `src/send_http_get_rust_backend/send_http_get_rust_backend.did` 文件,替换为以下内容: + + ``` + service : { + "get_icp_usd_exchange": () -> (text); + } + ``` + + 这样 Candid 接口文件就能匹配 `src/send_http_get_rust_backend/src/lib.rs` 中的 `get_icp_usd_exchange()` 方法。 + +- 打开 `src/send_http_get_rust_backend/Cargo.toml` 文件,替换为以下内容: + ``` + [package] + name = "send_http_get_rust_backend" + version = "0.1.0" + edition = "2021" + + # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + + [lib] + crate-type = ["cdylib"] + + [dependencies] + candid = "0.10.2" + ic-cdk = "0.12.1" + ic-cdk-macros = "0.8.4" + ``` + +- 本地部署并测试。 + + 执行以下命令: + ``` + dfx start --background + dfx deploy + ``` + + 如果成功,您将在命令行看到类似如下的输出: + ``` + Deployed canisters. + URLs: + Backend canister via Candid interface: + send_http_get_rust_backend: http://127.0.0.1:4943/?canisterId=avqkn-guaaa-aaaaa-qaaea-cai&id=b77ix-eeaaa-aaaaa-qaada-cai + ``` + + 您可以打开 Candid Web UI 并调用 `get_icp_usd_exchange()` 方法。 + +- 在 IC 主网部署并测试。 + + 执行以下命令: + ``` + dfx deploy --network ic + ``` + + 如果成功,您将在命令行看到类似如下的输出: + ``` + Deployed canisters. + URLs: + Backend canister via Candid interface: + send_http_get_rust_backend: https://a4gq6-oaaaa-aaaab-qaa4q-cai.raw.icp0.io/?id=eppuh-hqaaa-aaaan-qlsoa-cai + ``` + + 同样您可以打开 Candid Web UI 并调用 `get_icp_usd_exchange()` 方法。 + +## HTTPS outcalls: POST + +这里我们实现一个进行 POST HTTPS request 的最简单示例。示例代码包含 Motoko 和 Rust 两个版本,展示了容器向一个免费的 API 发送一个带有 JSON 数据 的 POST 请求、并验证头部和正文是否发送正确。 + +这个示例容器的主要意图是向开发者展示如何进行[幂等](https://en.wikipedia.org/wiki/Idempotence)的 POST 请求,只需要不到 5 分钟就能完成。 + +:::info + +HTTPS outcalls 功能只适用于向支持 IPV6 的服务器或 API 端点发送 HTTP POST 请求。 + +::: + +### 示例 dapp {#sample-dapp-post} + +本教程中的容器包含一个名为 `send_http_post_request()` 的公共方法。当该方法被调用时,它会触发一个 HTTP POST request。该示例只有一个后端容器,您可以通过 Candid Web UI 与它的公共方法进行交互,如下图所示: + +![candid_web_ui_post](./img/candid-web-ui-post.png) + +当您调用该方法时,容器将发送一个 HTTP POST 请求,其响应体中包含如下 JSON 数据: + +``` +{ + "name": "Grogu", + "force_sensitive": "true" +} +``` + +#### 验证 HTTP POST request {#verify-http-post-request} + +为了验证您的容器发送了您期望的 HTTP request,该示例容器向一个[公开的 API 服务](https://putsreq.com/aL1QS5IbaQd4NTqN3a81/inspect)发送 HTTP request,您可以在那里检查 HTTP request。如下图所示,您可以检查 POST request 的头部和正文,以确保它是容器所发送的内容。 + + +### 关于 POST requests 的重要注意事项 {#http-post-request-notes} + +由于 HTTPS outcalls 需要经过共识,开发者应该预期容器发出的任何 HTTPS POST request 都会被多次发送。即使不是 Web3 的世界,也存在多个相同的 POST 请求会被发送的问题,因为客户端出于各种原因(例如目标服务器不可用)而重试请求是很常见的。 + +HTTP POST request 的建议使用方式是在头部添加幂等性键,以便目标服务器知道哪些来自客户端的 POST requests 是相同的。 + +开发者应该小心,目标服务器需要能理解和使用幂等性键。一个容器可以被编写为发送幂等性键,但最终还是由服务器决定如何处理它们。这里有一个使用幂等性键的 API 服务的[例子](https://stripe.com/docs/api/idempotent_requests),供大家参考。 + +### Motoko 版本 {#motoko-version-post} + +#### Motoko 代码结构 {#motoko-code-structure-post} + +在您深入了解之前,我们先介绍您将要接触的代码的大致结构: + +- main.mo + + ```jsx + //Import some custom types from `src/backend_canister/Types.mo` file + import Types "Types"; + + actor { + + //method that uses the HTTP outcalls feature and returns a string + public func foo() : async Text { + + //1. DECLARE MANAGEMENT CANISTER + let ic : Types.IC = actor ("aaaaa-aa"); + + //2. SETUP ARGUMENTS FOR HTTP GET request + let request : Types.HttpRequestArgs = { + //construct the request + }; + + //3. ADD CYCLES TO PAY FOR HTTP REQUEST + //code to add cycles + + //4. MAKE HTTPS REQUEST AND WAIT FOR RESPONSE + let response : Types.HttpResponsePayload = await ic.http_request(request); + + //5. DECODE THE RESPONSE + //code to decode response + + //6. RETURN RESPONSE OF THE BODY + response + }; + }; + ``` + +- Types.mo + + ```jsx + module Types { + + //type declarations for HTTP requests, HTTP responses, management canister, etc... + + } + ``` + +#### Motoko 步骤 {#motoko-steps-post} + +- 进入您想要创建工程的目录,执行以下命令创建新工程: + ``` + dfx new --no-frontend send_http_post_motoko + cd send_http_post_motoko + ``` + 这里我们使用了 `--no-frontend` 选项,创建了一个最简单的工程。 + +- 打开 `dfx.json` 文件,替换为以下内容: + + ``` + { + "canisters": { + "send_http_post_motoko_backend": { + "main": "src/send_http_post_motoko_backend/main.mo", + "type": "motoko" + } + }, + "defaults": { + "build": { + "args": "", + "packtool": "" + } + }, + "output_env_file": ".env", + "version": 1 + } + ``` + 这样您的工程只包含一个后端容器,同时您可以删除掉 `src\send_http_post_motoko_frontend` 目录。 + +- 打开 `src/send_http_post_motoko_backend/main.mo` 替换为以下内容: + + ```jsx + import Debug "mo:base/Debug"; + import Blob "mo:base/Blob"; + import Cycles "mo:base/ExperimentalCycles"; + import Array "mo:base/Array"; + import Nat8 "mo:base/Nat8"; + import Text "mo:base/Text"; + + //import the custom types you have in Types.mo + import Types "Types"; + + actor { + + //function to transform the response + public query func transform(raw : Types.TransformArgs) : async Types.CanisterHttpResponsePayload { + let transformed : Types.CanisterHttpResponsePayload = { + status = raw.response.status; + body = raw.response.body; + headers = [ + { + name = "Content-Security-Policy"; + value = "default-src 'self'"; + }, + { name = "Referrer-Policy"; value = "strict-origin" }, + { name = "Permissions-Policy"; value = "geolocation=(self)" }, + { + name = "Strict-Transport-Security"; + value = "max-age=63072000"; + }, + { name = "X-Frame-Options"; value = "DENY" }, + { name = "X-Content-Type-Options"; value = "nosniff" }, + ]; + }; + transformed; + }; + + //PUBLIC METHOD + //This method sends a POST request to a URL with a free API you can test. + public func send_http_post_request() : async Text { + + //1. DECLARE MANAGEMENT CANISTER + //You need this so you can use it to make the HTTP request + let ic : Types.IC = actor ("aaaaa-aa"); + + //2. SETUP ARGUMENTS FOR HTTP GET request + + // 2.1 Setup the URL and its query parameters + //This URL is used because it allows you to inspect the HTTP request sent from the canister + let host : Text = "putsreq.com"; + let url = "https://putsreq.com/aL1QS5IbaQd4NTqN3a81"; //HTTP that accepts IPV6 + + // 2.2 prepare headers for the system http_request call + + //idempotency keys should be unique so create a function that generates them. + let idempotency_key: Text = generateUUID(); + let request_headers = [ + { name = "Host"; value = host # ":443" }, + { name = "User-Agent"; value = "http_post_sample" }, + { name= "Content-Type"; value = "application/json" }, + { name= "Idempotency-Key"; value = idempotency_key } + ]; + + // The request body is an array of [Nat8] (see Types.mo) so do the following: + // 1. Write a JSON string + // 2. Convert ?Text optional into a Blob, which is an intermediate reprepresentation before you cast it as an array of [Nat8] + // 3. Convert the Blob into an array [Nat8] + let request_body_json: Text = "{ \"name\" : \"Grogu\", \"force_sensitive\" : \"true\" }"; + let request_body_as_Blob: Blob = Text.encodeUtf8(request_body_json); + let request_body_as_nat8: [Nat8] = Blob.toArray(request_body_as_Blob); // e.g [34, 34,12, 0] + + // 2.2.1 Transform context + let transform_context : Types.TransformContext = { + function = transform; + context = Blob.fromArray([]); + }; + + // 2.3 The HTTP request + let http_request : Types.HttpRequestArgs = { + url = url; + max_response_bytes = null; //optional for request + headers = request_headers; + //note: type of `body` is ?[Nat8] so it is passed here as "?request_body_as_nat8" instead of "request_body_as_nat8" + body = ?request_body_as_nat8; + method = #post; + transform = ?transform_context; + // transform = null; //optional for request + }; + + //3. ADD CYCLES TO PAY FOR HTTP REQUEST + + //The management canister will make the HTTP request so it needs cycles + //See: https://internetcomputer.org/docs/current/motoko/main/cycles + + //The way Cycles.add() works is that it adds those cycles to the next asynchronous call + //See: https://internetcomputer.org/docs/current/references/ic-interface-spec/#ic-http_request + Cycles.add(21_850_258_000); + + //4. MAKE HTTPS REQUEST AND WAIT FOR RESPONSE + //Since the cycles were added above, you can just call the management canister with HTTPS outcalls below + let http_response : Types.HttpResponsePayload = await ic.http_request(http_request); + + //5. DECODE THE RESPONSE + + //As per the type declarations in `Types.mo`, the BODY in the HTTP response + //comes back as [Nat8s] (e.g. [2, 5, 12, 11, 23]). Type signature: + + //public type HttpResponsePayload = { + // status : Nat; + // headers : [HttpHeader]; + // body : [Nat8]; + // }; + + //You need to decode that [Na8] array that is the body into readable text. + //To do this: + // 1. Convert the [Nat8] into a Blob + // 2. Use Blob.decodeUtf8() method to convert the Blob to a ?Text optional + // 3. Use Motoko syntax "Let... else" to unwrap what is returned from Text.decodeUtf8() + let response_body: Blob = Blob.fromArray(http_response.body); + let decoded_text: Text = switch (Text.decodeUtf8(response_body)) { + case (null) { "No value returned" }; + case (?y) { y }; + }; + + //6. RETURN RESPONSE OF THE BODY + let result: Text = decoded_text # ". See more info of the request sent at at: " # url # "/inspect"; + result + }; + + //PRIVATE HELPER FUNCTION + //Helper method that generates a Universally Unique Identifier + //this method is used for the Idempotency Key used in the request headers of the POST request. + //For the purposes of this exercise, it returns a constant, but in practice it should return unique identifiers + func generateUUID() : Text { + "UUID-123456789"; + } + }; + ``` + + :::info + + 上述代码有可能更新,请参考 [main.mo](https://github.com/dfinity/examples/blob/master/motoko/send_http_post/src/send_http_post_backend/main.mo) 获取最新版本。 + + ::: + +- 创建 `src/send_http_post_motoko_backend/Types.mo` 文件,并将其内容替换为以下文本: + + ```jsx + module Types { + + //1. Type that describes the Request arguments for an HTTPS outcall + //See: https://internetcomputer.org/docs/current/references/ic-interface-spec/#ic-http_request + public type HttpRequestArgs = { + url : Text; + max_response_bytes : ?Nat64; + headers : [HttpHeader]; + body : ?[Nat8]; + method : HttpMethod; + transform : ?TransformRawResponseFunction; + }; + + public type HttpHeader = { + name : Text; + value : Text; + }; + + public type HttpMethod = { + #get; + #post; + #head; + }; + + public type HttpResponsePayload = { + status : Nat; + headers : [HttpHeader]; + body : [Nat8]; + }; + + //2. HTTPS outcalls have an optional "transform" key. These two types help describe it. + //"The transform function may, for example, transform the body in any way, add or remove headers, + //modify headers, etc. " + //See: https://internetcomputer.org/docs/current/references/ic-interface-spec/#ic-http_request + + //2.1 This type describes a function called "TransformRawResponse" used in line 14 above + //"If provided, the calling canister itself must export this function." + //In this minimal example for a GET request, declare the type for completeness, but + //you do not use this function. You will pass "null" to the HTTP request. + public type TransformRawResponseFunction = { + function : shared query TransformArgs -> async HttpResponsePayload; + context : Blob; + }; + + //2.2 This type describes the arguments the transform function needs + public type TransformArgs = { + response : HttpResponsePayload; + context : Blob; + }; + + public type CanisterHttpResponsePayload = { + status : Nat; + headers : [HttpHeader]; + body : [Nat8]; + }; + + public type TransformContext = { + function : shared query TransformArgs -> async HttpResponsePayload; + context : Blob; + }; + + //3. Declaring the management canister which is used to make the HTTPS outcall + public type IC = actor { + http_request : HttpRequestArgs -> async HttpResponsePayload; + }; + } + ``` + + :::info + + 上述代码有可能更新,请参考 [Types.mo](https://github.com/dfinity/examples/blob/master/motoko/send_http_post/src/send_http_post_backend/Types.mo) 获取最新版本。 + + ::: + +- 本地部署并测试。 + + 执行以下命令: + ``` + dfx start --background + dfx deploy + ``` + + 如果成功,您将在命令行看到类似如下的输出: + ``` + Deployed canisters. + URLs: + Backend canister via Candid interface: + send_http_post_motoko_backend: http://127.0.0.1:4943/?canisterId=a4tbr-q4aaa-aaaaa-qaafq-cai&id=a3shf-5eaaa-aaaaa-qaafa-cai + ``` + + 您可以打开 Candid Web UI 并调用 `send_http_post_request()` 方法。 + +- 在 IC 主网部署并测试。 + + 执行以下命令: + ``` + dfx deploy --network ic + ``` + + 如果成功,您将在命令行看到类似如下的输出: + ``` + Deployed canisters. + URLs: + Backend canister via Candid interface: + send_http_post_motoko_backend: https://a4gq6-oaaaa-aaaab-qaa4q-cai.raw.icp0.io/?id=b5wdk-xiaaa-aaaan-qlsqq-cai + ``` + + 同样您可以打开 Candid Web UI 并调用 `send_http_post_request()` 方法。 + +### Rust 版本 {#rust-version-post} + +#### Rust 代码结构 {#rust-code-structure-post} + +在您深入了解之前,我们先介绍您将要接触的代码的大致结构: + +```jsx +//1. DECLARE MANAGEMENT CANISTER +use ic_cdk::api::management_canister::http_request::{ + http_request, CanisterHttpRequestArgument, HttpHeader, HttpMethod, HttpResponse, TransformArgs, + TransformContext, +}; + +//Update method using the HTTPS outcalls feature +#[ic_cdk::update] +async fn foo() { + //2. SETUP ARGUMENTS FOR HTTP GET request + let request = CanisterHttpRequestArgument { + //instantiate the request + }; + + //3. MAKE HTTPS REQUEST AND WAIT FOR RESPONSE + //Note: in Rust, `http_request()` already sends the cycles needed + //so no need for explicit Cycles.add() as in Motoko + match http_request(request).await { + + //4. DECODE AND RETURN THE RESPONSE + Ok((response,)) => { + //Ok case + } + Err((r, m)) => { + //error case + } + } +} +``` + +#### Rust 步骤 {#rust-steps-post} + +- 进入您想要创建工程的目录,执行以下命令创建新工程: + ``` + dfx new --type=rust --no-frontend send_http_post_rust + cd send_http_get_rust + ``` + 这里我们使用了 `--no-frontend` 选项,创建了一个最简单的工程。 + +- 打开 `dfx.json` 文件,替换为以下内容: + + ``` + { + "canisters": { + "send_http_post_rust_backend": { + "candid": "src/send_http_post_rust_backend/send_http_post_rust_backend.did", + "package": "send_http_post_rust_backend", + "type": "rust" + } + }, + "defaults": { + "build": { + "args": "", + "packtool": "" + } + }, + "output_env_file": ".env", + "version": 1 + } + ``` + 这样您的工程只包含一个后端容器,同时您可以删除掉 `src\send_http_post_rust_frontend` 目录。 + +- 打开 `src/send_http_post_rust_backend/src/lib.rs` 替换为以下内容: + + ```jsx + //1. IMPORT MANAGEMENT CANISTER + //This includes all methods and types needed + use ic_cdk::api::management_canister::http_request::{ + http_request, CanisterHttpRequestArgument, HttpHeader, HttpMethod, HttpResponse, TransformArgs, + TransformContext, + }; + + use ic_cdk_macros::{self, query, update}; + use serde::{Serialize, Deserialize}; + use serde_json::{self, Value}; + + // This struct is legacy code and is not really used in the code. + #[derive(Serialize, Deserialize)] + struct Context { + bucket_start_time_index: usize, + closing_price_index: usize, + } + + //Update method using the HTTPS outcalls feature + #[ic_cdk::update] + async fn send_http_post_request() -> String { + //2. SETUP ARGUMENTS FOR HTTP GET request + + // 2.1 Setup the URL + let host = "putsreq.com"; + let url = "https://putsreq.com/aL1QS5IbaQd4NTqN3a81"; + + // 2.2 prepare headers for the system http_request call + //Note that `HttpHeader` is declared in line 4 + let request_headers = vec![ + HttpHeader { + name: "Host".to_string(), + value: format!("{host}:443"), + }, + HttpHeader { + name: "User-Agent".to_string(), + value: "demo_HTTP_POST_canister".to_string(), + }, + //For the purposes of this exercise, Idempotency-Key" is hard coded, but in practice + //it should be generated via code and unique to each POST request. Common to create helper methods for this + HttpHeader { + name: "Idempotency-Key".to_string(), + value: "UUID-123456789".to_string(), + }, + HttpHeader { + name: "Content-Type".to_string(), + value: "application/json".to_string(), + }, + ]; + + //note "CanisterHttpRequestArgument" and "HttpMethod" are declared in line 4. + //CanisterHttpRequestArgument has the following types: + + // pub struct CanisterHttpRequestArgument { + // pub url: String, + // pub max_response_bytes: Option, + // pub method: HttpMethod, + // pub headers: Vec, + // pub body: Option>, + // pub transform: Option, + // } + //see: https://docs.rs/ic-cdk/latest/ic_cdk/api/management_canister/http_request/struct.CanisterHttpRequestArgument.html + + //Where "HttpMethod" has structure: + // pub enum HttpMethod { + // GET, + // POST, + // HEAD, + // } + //See: https://docs.rs/ic-cdk/latest/ic_cdk/api/management_canister/http_request/enum.HttpMethod.html + + //Since the body in HTTP request has type Option> it needs to look something like this: Some(vec![104, 101, 108, 108, 111]) ("hello" in ASCII) + //where the vector of u8s are the UTF. In order to send JSON via POST, do the following: + //1. Declare a JSON string to send + //2. Convert that JSON string to array of UTF8 (u8) + //3. Wrap that array in an optional + let json_string : String = "{ \"name\" : \"Grogu\", \"force_sensitive\" : \"true\" }".to_string(); + + //note: here, r#""# is used for raw strings in Rust, which allows you to include characters like " and \ without needing to escape them. + //You could have used "serde_json" as well. + let json_utf8: Vec = json_string.into_bytes(); + let request_body: Option> = Some(json_utf8); + + // This struct is legacy code and is not really used in the code. Need to be removed in the future + // The "TransformContext" function does need a CONTEXT parameter, but this implementation is not necessary + // the TransformContext(transform, context) below accepts this "context", but it does nothing with it in this implementation. + // bucket_start_time_index and closing_price_index are meaninglesss + let context = Context { + bucket_start_time_index: 0, + closing_price_index: 4, + }; + + let request = CanisterHttpRequestArgument { + url: url.to_string(), + max_response_bytes: None, //optional for request + method: HttpMethod::POST, + headers: request_headers, + body: request_body, + transform: Some(TransformContext::new(transform, serde_json::to_vec(&context).unwrap())), + }; + + //3. MAKE HTTPS REQUEST AND WAIT FOR RESPONSE + + //Note: in Rust, `http_request()` already sends the cycles needed + //so no need for explicit Cycles.add() as in Motoko + match http_request(request).await { + //4. DECODE AND RETURN THE RESPONSE + + //See:https://docs.rs/ic-cdk/latest/ic_cdk/api/management_canister/http_request/struct.HttpResponse.html + Ok((response,)) => { + //if successful, `HttpResponse` has this structure: + // pub struct HttpResponse { + // pub status: Nat, + // pub headers: Vec, + // pub body: Vec, + // } + + //You need to decode that Vec that is the body into readable text. + //To do this: + // 1. Call `String::from_utf8()` on response.body + // 3. Use a switch to explicitly call out both cases of decoding the Blob into ?Text + let str_body = String::from_utf8(response.body) + .expect("Transformed response is not UTF-8 encoded."); + ic_cdk::api::print(format!("{:?}", str_body)); + + //The API response will looks like this: + // { successful: true } + + //Return the body as a string and end the method + let result: String = format!( + "{}. See more info of the request sent at: {}/inspect", + str_body, url + ); + result + } + Err((r, m)) => { + let message = + format!("The http_request resulted into error. RejectionCode: {r:?}, Error: {m}"); + + //Return the error as a string and end the method + message + } + } + } + + // Strips all data that is not needed from the original response. + #[query] + fn transform(raw: TransformArgs) -> HttpResponse { + + let headers = vec![ + HttpHeader { + name: "Content-Security-Policy".to_string(), + value: "default-src 'self'".to_string(), + }, + HttpHeader { + name: "Referrer-Policy".to_string(), + value: "strict-origin".to_string(), + }, + HttpHeader { + name: "Permissions-Policy".to_string(), + value: "geolocation=(self)".to_string(), + }, + HttpHeader { + name: "Strict-Transport-Security".to_string(), + value: "max-age=63072000".to_string(), + }, + HttpHeader { + name: "X-Frame-Options".to_string(), + value: "DENY".to_string(), + }, + HttpHeader { + name: "X-Content-Type-Options".to_string(), + value: "nosniff".to_string(), + }, + ]; + + let mut res = HttpResponse { + status: raw.response.status.clone(), + body: raw.response.body.clone(), + headers, + ..Default::default() + }; + + if res.status == 200 { + + res.body = raw.response.body; + } else { + ic_cdk::api::print(format!("Received an error from coinbase: err = {:?}", raw)); + } + res + } + ``` + + :::info + + 上述代码有可能更新,请参考 [lib.rs](https://github.com/dfinity/examples/blob/master/rust/send_http_post/src/send_http_post_backend/src/lib.rs) 获取最新版本。 + + ::: + + - `send_http_post_request() -> String` 返回了一个字符串。这不是必须的,本教程中这样做是为了更容易测试。 + + - `lib.rs` 文件使用了 [http_request](https://docs.rs/ic-cdk/latest/ic_cdk/api/management_canister/http_request/fn.http_request.html),这是 Rust CDK 提供的一个方法,它在底层向 IC 管理容器发送 cycles。该方法能够计算出在大多数情况下,对于一个 13 节点的子网需要发送多少cycles。如果您的 HTTPS outcall 需要更多的 cycles,请使用 `http_request_with_cycles()` 方法,并明确地提供所需的 cycles 数量。 + + - 上面使用的 Rust CDK 方法 `http_request` 封装了 IC 管理容器的 `http_request` 方法,但它们两者并不严格相同。 + +- 打开 `src/send_http_post_rust_backend/send_http_post_rust_backend.did` 文件,替换为以下内容: + + ``` + service : { + "send_http_post_request": () -> (text); + } + ``` + + 这样 Candid 接口文件就能匹配 `src/send_http_post_rust_backend/src/lib.rs` 中的 `send_http_post_request()` 方法。 + +- 打开 `src/send_http_post_rust_backend/Cargo.toml` 文件,替换为以下内容: + ``` + [package] + name = "send_http_post_rust_backend" + version = "0.1.0" + edition = "2021" + + # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + + [lib] + crate-type = ["cdylib"] + + [dependencies] + candid = "0.8.2" + ic-cdk = "0.6.0" + ic-cdk-macros = "0.6.0" + serde = "1.0.152" + serde_json = "1.0.93" + serde_bytes = "0.11.9" + ``` + +- 本地部署并测试。 + + 执行以下命令: + ``` + dfx start --background + dfx deploy + ``` + + 如果成功,您将在命令行看到类似如下的输出: + ``` + Deployed canisters. + URLs: + Backend canister via Candid interface: + send_http_get_rust_backend: http://127.0.0.1:4943/?canisterId=avqkn-guaaa-aaaaa-qaaea-cai&id=b77ix-eeaaa-aaaaa-qaada-cai + ``` + + 您可以打开 Candid Web UI 并调用 `send_http_post_request()` 方法。 + +- 在 IC 主网部署并测试。 + + 执行以下命令: + ``` + dfx deploy --network ic + ``` + + 如果成功,您将在命令行看到类似如下的输出: + ``` + Deployed canisters. + URLs: + Backend canister via Candid interface: + send_http_get_rust_backend: https://a4gq6-oaaaa-aaaab-qaa4q-cai.raw.icp0.io/?id=eppuh-hqaaa-aaaan-qlsoa-cai + ``` + + 同样您可以打开 Candid Web UI 并调用 `send_http_post_request()` 方法。 + + \ No newline at end of file From fd4054a23b58ec6f662f6869eb06c4618a9d6243 Mon Sep 17 00:00:00 2001 From: Vincent Zhang Date: Tue, 30 Jan 2024 20:01:36 +0800 Subject: [PATCH 2/3] Add front matter section. --- .../4-https-outcalls/img/https-outcalls.jpg | Bin 0 -> 76114 bytes .../7-code-examples/4-https-outcalls/index.md | 5 +++++ 2 files changed, 5 insertions(+) create mode 100644 docusaurus/docs/getting-started/7-code-examples/4-https-outcalls/img/https-outcalls.jpg diff --git a/docusaurus/docs/getting-started/7-code-examples/4-https-outcalls/img/https-outcalls.jpg b/docusaurus/docs/getting-started/7-code-examples/4-https-outcalls/img/https-outcalls.jpg new file mode 100644 index 0000000000000000000000000000000000000000..da60e135d720ee2054955f189bd8ee98792c0864 GIT binary patch literal 76114 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�L}3OM25sOnsa+%s?qI&)L}u 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%0All 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 Z3Q_!o(KS@v&?ep2s>?;R&RhQ`{s+U(h}HlA literal 0 HcmV?d00001 diff --git a/docusaurus/docs/getting-started/7-code-examples/4-https-outcalls/index.md b/docusaurus/docs/getting-started/7-code-examples/4-https-outcalls/index.md index 946daa6..4f1df37 100644 --- a/docusaurus/docs/getting-started/7-code-examples/4-https-outcalls/index.md +++ b/docusaurus/docs/getting-started/7-code-examples/4-https-outcalls/index.md @@ -1,4 +1,9 @@ --- +title: HTTPS outcalls +image: './img/https-outcalls.jpg' +description: 如何利用 IC 的 HTTPS outcalls 功能从智能合约直接调用区块链外部的 HTTPS 服务 +keywords: [DFINITY, ICP, IC, 互联网计算机, HTTPS outcalls, HTTPS, Motoko, Rust] + # Display h2 to h4 headings toc_min_heading_level: 2 toc_max_heading_level: 4 From 09ad39e3ca4e6987558cef67413b305dba8a832d Mon Sep 17 00:00:00 2001 From: Vincent Zhang Date: Tue, 30 Jan 2024 20:01:52 +0800 Subject: [PATCH 3/3] Fixed one typo. --- docusaurus/docs/contact.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docusaurus/docs/contact.md b/docusaurus/docs/contact.md index f60794a..c2363b5 100644 --- a/docusaurus/docs/contact.md +++ b/docusaurus/docs/contact.md @@ -21,4 +21,4 @@ https://oc.app/community/gb3c3-hiaaa-aaaar-a35sa-cai/channel/316363584640902102086769779217159683798/?ref=inda5-hyaaa-aaaaf-aaioq-cai ::: - 欢迎您申请 DFINITY 基金会的 [Developer Grant 项目](https://ic123.xyz/docs/dev-resources/dev-grants/), ,加入互联网计算机的大家庭! \ No newline at end of file + 欢迎您申请 DFINITY 基金会的 [Developer Grant 项目](https://ic123.xyz/docs/dev-resources/dev-grants/),加入互联网计算机的大家庭! \ No newline at end of file