Actions & Blinks程式實踐

更新 發佈閱讀 10 分鐘

上篇瞭解完整個工作流程後,我們就來學習如何用程式碼構建屬於自己的Actions & Blinks吧!其實身為開發者,需要做的只有一件事:部署自己的後端伺服器用來接收GET/POST requests!這邊提供簡單的範例程式碼可以參考!

因為Actions & Blinks是一個有特定規範的服務,所以在接下來的程式碼講解中我不會帶到太多邏輯,只會介紹格式該怎麼設置。首先我們來講解GET函式中的架構。

在GET中我們主要是希望Actions Provider回傳要顯示的精美小視窗內容,而這必須符合特定格式(ActionGetResponse)的Response如下,其中每個欄位的意義寫在註解中:

const requestUrl = new URL(req.url);

const payload: ActionGetResponse = {

title: "Your title",

icon: new URL("/path-of-the-icon-file ", requestUrl.origin).toString(), // the path of icon should be the path under /public

description: "Your description",

label: "Does not matter", // this value will be ignored since `links.actions` exists

links: {

actions: [

{

label: "", // button text

href: `${baseHref}&amount=${"1"}`, //when user click the button, send a POST req to this url

},

{

label: "Send SOL", // button text

href: `${baseHref}token_amount={amount}`, // this href will have a text input and bring the variable

parameters: [ // if we have multiple parameters, there will be multiple lines of input, but only one button

{ // the input value will be the value of variable

name: "amount", // variableconst body: ActionPostRequest = await req.json();

// Validate to confirm the user publickey received is valid before use

let account: PublicKey;

try {

account = new PublicKey(body.account);

} catch (err) {

return new Response('Invalid "account" provided', {

status: 400,

headers: ACTIONS_CORS_HEADERS, //Must include CORS HEADERS

});

} name in the `href` above

label: "Enter the amount of SOL to send", // placeholder of the text input

required: true,

},

],

},

],

},

};

最終將payload包起來傳回去即可:

return Response.json(payload, {

headers,

});

在GET的外面要記得加上下面這段!不然會遇到CORS問題導致瀏覽器阻擋(不知道CORS是什麼沒關係,記得加上就對了!後面有一些其他設定也都是為了CORS)

export const OPTIONS = async (req: Request) => {

return new Response(null, { headers });

};

至此我們就成功建好GET的形式啦~其實很多地方都照抄格式即可,是不是很容易呀~


接著來看POST,我們知道在GET中的action在使用者點擊後會發送一POST req到對應的href(用同一個url帶入參數即可),所以我們的POST就是要處理使用者點擊後我們希望他的錢包做的事情,首先會用以下程式碼獲取使用者的錢包地址(account):

const body: ActionPostRequest = await req.json();

let account: PublicKey;

try {

account = new PublicKey(body.account);

} catch (err) {

return new Response('Invalid "account" provided', {

status: 400,

headers: ACTIONS_CORS_HEADERS, //Must include CORS HEADERS

});

}

接著我們要獲取透過url傳過來的參數值(此範例中是password),用以下的程式碼即可:

const params = new URL(req.url).searchParams;

const password = params.get("password");

在獲使用者選擇的參數後,我們就可以任意的編寫我們的程式碼,如同一般我們用@solana/web3.js製造transaction一樣。在範例程式中我們根據已經部署好的鏈上合約創建了一連串的instructions(airdropInstruction),至於中間如何創建instruction就不在今天的範圍內,是需要根據不同的鏈上合約來變化的。總之包完instructions後利用下面這段程式碼包成transaction,並設定好recentBlockhash & feePayer

const transaction = new Transaction().add(airdropInstruction);

transaction.recentBlockhash = (

await connection.getLatestBlockhash()

).blockhash;

transaction.feePayer = account;

最後回傳Response如下格式即可:

const payload: ActionPostResponse = await createPostResponse({

fields: {

transaction,

message: "Successfully claimed!",

},

});

return Response.json(payload, {

headers: ACTIONS_CORS_HEADERS,

});

到此我們終於建立好我們API entry了。最後別忘了加入 /app/actions.json/route.ts這也是為了避免CORS問題,可以照範例程式碼直接複製貼上就好!

至此我們終於大功告成。如果要測試我們的程式碼是否正確,可以到此網址,記得修改API route和port number:https://dial.to?action=solana-action : http:/ localhost: 3000/api/actions/your_api_route,還有一個重點是如果你的合約是部署在devnet上的話,要改用這個domain:https://dial.to/devnet才會正常呼叫到合約喔!


留言
avatar-img
巫竑儒的沙龍
1會員
5內容數
巫竑儒的沙龍的其他內容
2024/08/15
近期Solana重點推出了PayFi觀念以及Token Extension,兩者之間有什麼關係呢?PayFi跟DeFi又有什麼不同?看完這篇文相信你也會跟我一樣對Solana的未來充滿期待!
2024/08/15
近期Solana重點推出了PayFi觀念以及Token Extension,兩者之間有什麼關係呢?PayFi跟DeFi又有什麼不同?看完這篇文相信你也會跟我一樣對Solana的未來充滿期待!
2024/08/14
在上篇我們看到了幾種常見的Token Extensions,現在我們來看看如何組織這些Token Extensions來做到更特殊的應用吧!
2024/08/14
在上篇我們看到了幾種常見的Token Extensions,現在我們來看看如何組織這些Token Extensions來做到更特殊的應用吧!
2024/08/13
你有聽過Solana上新推出的超強功能 「Token Extension」嗎?有了Token Extension,工程師能夠更快速的在Solana上建立專案,並且大幅增強了各個專案之間融合的便利性。如果你還不知道什麼是Token Extension,這篇文章你必須看完!
2024/08/13
你有聽過Solana上新推出的超強功能 「Token Extension」嗎?有了Token Extension,工程師能夠更快速的在Solana上建立專案,並且大幅增強了各個專案之間融合的便利性。如果你還不知道什麼是Token Extension,這篇文章你必須看完!
看更多
你可能也想看
Thumbnail
在 vocus 與你一起探索內容、發掘靈感的路上,我們又將啟動新的冒險——vocus App 正式推出! 現在起,你可以在 iOS App Store 下載全新上架的 vocus App。 無論是在通勤路上、日常空檔,或一天結束後的放鬆時刻,都能自在沈浸在內容宇宙中。
Thumbnail
在 vocus 與你一起探索內容、發掘靈感的路上,我們又將啟動新的冒險——vocus App 正式推出! 現在起,你可以在 iOS App Store 下載全新上架的 vocus App。 無論是在通勤路上、日常空檔,或一天結束後的放鬆時刻,都能自在沈浸在內容宇宙中。
Thumbnail
vocus 慶祝推出 App,舉辦 2026 全站慶。推出精選內容與數位商品折扣,訂單免費與紅包抽獎、新註冊會員專屬活動、Boba Boost 贊助抽紅包,以及全站徵文,並邀請你一起來回顧過去的一年, vocus 與創作者共同留下了哪些精彩創作。
Thumbnail
vocus 慶祝推出 App,舉辦 2026 全站慶。推出精選內容與數位商品折扣,訂單免費與紅包抽獎、新註冊會員專屬活動、Boba Boost 贊助抽紅包,以及全站徵文,並邀請你一起來回顧過去的一年, vocus 與創作者共同留下了哪些精彩創作。
Thumbnail
這篇內容,將會講解什麼是表達式(Expression),什麼是陳述式(Statement)。有了這些概念,各位會更容易理解,要如何設計程式碼。
Thumbnail
這篇內容,將會講解什麼是表達式(Expression),什麼是陳述式(Statement)。有了這些概念,各位會更容易理解,要如何設計程式碼。
Thumbnail
這篇內容,將會講解什麼是函式,以及與函式相關的知識。包括函式的簡介、Runtime Function、自訂函式、Script Function 腳本函式、Method 方法。
Thumbnail
這篇內容,將會講解什麼是函式,以及與函式相關的知識。包括函式的簡介、Runtime Function、自訂函式、Script Function 腳本函式、Method 方法。
Thumbnail
※ 原本狀態:伺服器渲染 這是 MVC 架構下的 request / response 示意圖,在這張圖呈現的架構裡,畫面和資料都由同一個架構處理。 伺服器渲染流程: 瀏覽器針對特定網址送出請求。 路由器解析請求後,轉接給對應的 controller。 controller 按照要求,透過
Thumbnail
※ 原本狀態:伺服器渲染 這是 MVC 架構下的 request / response 示意圖,在這張圖呈現的架構裡,畫面和資料都由同一個架構處理。 伺服器渲染流程: 瀏覽器針對特定網址送出請求。 路由器解析請求後,轉接給對應的 controller。 controller 按照要求,透過
Thumbnail
你好,在下最近在學習開發web,學了html css js,也得出一些心得,由於網路上已有許多教學,所以我會著重在如何開發出to do List,以及解釋我寫的程式碼。相關的教學我會直接貼網址。如果我有什麼地方出錯,或者是可以寫得更好,歡迎在下方留言,討論。 首先先介紹我的開發環境: 我用了vs
Thumbnail
你好,在下最近在學習開發web,學了html css js,也得出一些心得,由於網路上已有許多教學,所以我會著重在如何開發出to do List,以及解釋我寫的程式碼。相關的教學我會直接貼網址。如果我有什麼地方出錯,或者是可以寫得更好,歡迎在下方留言,討論。 首先先介紹我的開發環境: 我用了vs
Thumbnail
前面已經安裝好IIS後,並且也新建站台了,那麼接下來這篇就會分享如何使用它
Thumbnail
前面已經安裝好IIS後,並且也新建站台了,那麼接下來這篇就會分享如何使用它
Thumbnail
接續上一篇 Step2:VC#專案建立 Step3:IIS新建站台 Step4:VC#架設到IIS中
Thumbnail
接續上一篇 Step2:VC#專案建立 Step3:IIS新建站台 Step4:VC#架設到IIS中
Thumbnail
Function的使用方式
Thumbnail
Function的使用方式
Thumbnail
列出一套完整的程式 程式設計有許多種方法,不過通常會先列出清單的再逐一執行,這樣會加快程式設計的速度。設計通常會採取順推的辦法。所以順推的程式設計方式就是經歷觀念溝通、系統分析、資料統合、權限管理、頻率與時間、後台管理、畫面設計等等階段後,將框架設計完了以後,先列出一套完整的程式,將所有使用者都確
Thumbnail
列出一套完整的程式 程式設計有許多種方法,不過通常會先列出清單的再逐一執行,這樣會加快程式設計的速度。設計通常會採取順推的辦法。所以順推的程式設計方式就是經歷觀念溝通、系統分析、資料統合、權限管理、頻率與時間、後台管理、畫面設計等等階段後,將框架設計完了以後,先列出一套完整的程式,將所有使用者都確
Thumbnail
上回說明的手動下指令,傳出訊息。為了節省手動輸入之動作,將欲執行的curl指令內容,事先作成執行檔。當需要傳送訊息時,只要按兩下執行檔,便可立刻傳出訊息至LINE群組內之全員 2. 說明 2.1 因每次要傳送內容不同,將這些會變動的訊息資料,輸入後保存 於bat執行檔內
Thumbnail
上回說明的手動下指令,傳出訊息。為了節省手動輸入之動作,將欲執行的curl指令內容,事先作成執行檔。當需要傳送訊息時,只要按兩下執行檔,便可立刻傳出訊息至LINE群組內之全員 2. 說明 2.1 因每次要傳送內容不同,將這些會變動的訊息資料,輸入後保存 於bat執行檔內
Thumbnail
JavaScript 套件,頁碼 Pagination.js 搭配 axios API 請求範例
Thumbnail
JavaScript 套件,頁碼 Pagination.js 搭配 axios API 請求範例
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News