透過 plumber 完成 RESTAPI 在 R 上的應用

內容說明

RESTAPI 有點類似於打包程式碼成為 class 的概念,一開始再碰 RESTAPI 會較難懂。我第一次學 API 就是現在,我花了快兩三個小時才懂RRR
plumber 可以應用在 RESTAPI
以下紀錄 plumber 在 R 上的應用與需要注意的地方

安裝 plumber

首先需要 plumber

1
install.packages("plumber")

教學範例

使用 R plumber 可以檢的使用 R 創建 RESTFUL API,plumber 識別 #*,以下提供簡單範例

1
2
3
4
5
6
7
8
9
10
11
12
library(plumber)

#* @method /url

#* Echo provided text
#* @param text The text to be echoed in the response
#* @get /echo
function(text = "") {
list(
message_echo = paste("The text is:", text)
)
}

在 R 上面啟動 api 指令

1
plumber::plumb(file='./plumber.R')$run(port = 5762)

其中 port 可以忽略不打(則會隨機產生),接下來用 curl 來試著呼叫

1
curl --data "text=hi_my_friend" "localhost:5762/echo"

如果要輸出 json 呢

這點 R 完全幫你做好,R 可以自動幫你轉成 json,但還是有少部分情況例外。裡面完全不需要轉成 json,就放心地給他輸出吧!
只限定傳送一個參數並且是 json 檔案

我想要輸入 json,但我卻輸入不進去..

這點就比較有趣了,看下面的程式碼就能了解箇中奧妙

1
2
3
4
5
6
7
8
#* parse JSON
#* @param req the request object
#* @get /json
#* @post /json
echo_json <- function(req){
print(req$postBody)
return(req$postBody)
}

看到了嘛!? 我們必須在物件後使用 $postBody,就可以成功輸入 json

我遇到了一個問題,我不懂要怎麼把 json post 給 api

小問題,我已經試過了,早就狀況排除了~ 血與淚的過程

1
curl "localhost:8551/url" --header "Content-type:application/json" -X POST -d @path/file

QUESTIONS and ERRORS 集合地

這裡有些作者已經經歷過的問題就放在這裡供大家參考怎麼解決或放棄

QUESTION: windows上傳遞參數的時候出現亂碼怎麼辦?

改用 LINUX 平台是目前作者最好的解法。由於 Window 似乎在傳遞進來時編碼會遇到問題例如 透過字串傳輸在 windows 上是亂碼,但在 Linux 不會,於是建議遇到此問題一律都使用 linux server 來解決。

寫一個 api 傳送許多參數

有時候我們並不是只需要傳送一個參數,而是傳送多個參數時就必須這樣寫。

如果參數後面的等於配上空字串表示預設為空,只有被傳回來有;那後面如果有值則代表如果 api 沒有傳此參數就已預設為主。
注意,參數後面一律都必須搭配字串,api 傳送的都是字串格式

1
2
3
4
path_json <- function(data = "" , path_length = "20" ){
json_content <- run_path(data , path_length )
return(json_content)
}

心得

其實不得不說,要不是因為有上班的地方願意讓我磨練,不然我可能連 api 是甚麼都還需要等到未來 2,3 年後我才能夠熟悉並且知道這些事物,也很謝謝高鈺成學長在我有些遇到狀況時會給我些許提示,然後專案報告真的好趕阿QwQ,希望我能夠如期做完,那就是最完美的了!謝謝 Luft 學長 幫我很多忙,也謝謝 steam 基礎教育聯盟給我機會學習。

連結

我在翻找資料的過程中,閱讀到一些對我非常有意義的資料。如下:

REST APIs and Plumber
Routing & Input
Sending json file in curl and receiving it in R using plumber
How do I POST JSON data with cURL?

  • 版權聲明: 本部落格所有文章除有特別聲明外,均採用 Apache License 2.0 許可協議。轉載請註明出處!
  • © 2020-2024 John Doe
  • Powered by Hexo Theme Ayer
  • PV: UV: