[問題] 利用opencpu API傳遞檔案與參數給Rpackage

看板R_Language作者 (cywhale)時間9年前 (2016/12/06 23:20), 編輯推噓5(5033)
留言38則, 4人參與, 最新討論串1/1
[問題類型]: 程式諮詢(我想用R 做某件事情,但是我不知道要怎麼用R 寫出來) 我寫了一個工作上用的小package,利用opencpu可以實現API傳遞參數叫用函數運算 (opencpu 可參考作者github: https://github.com/jeroenooms/opencpu Send requests through curl 大致像 curl http://myHost/ocpu/library/myPackage/R/myFunc/json -H "Content-Type: application/json" -d '{"argument1":"...","argument3":"...",..}' -o output.json 原本若要傳遞像vector這種data,就以json format一樣放在argument傳就好了, 但如果我允許user 把data 放在 file.csv中,我發現我沒辦法在同一個request中放進 curl -F file@filename -H .. -d '{"argument1":...}'.. (不能同時-F, ... -d 所以問題1 是,我該如何同時pass file and other arguments 在curl中? 另外在server端,我叫用自己寫的package,也要相對應來做處理傳遞過來的檔案, 但我不太確定該怎麼寫這段,怎麼樣讀取一個由curl 傳過來的檔案? 找不太到網路上有類似這樣實作的例子,懷疑自己是不是根本想錯方向~ 目前覺得可能是這樣做? (如底下## #======== in my Package in server, called by users through Opencpu myFunc <- function (file, data=c(), argument2, argument3,...) { if (length(data)>0) { ##照舊方式 data放在argument傳遞,這部分沒問題 DT <- data.table(matrix(data, ncol=2,byrow=byrow)) } else { #### data如果放在file,所以問題2是: Where (and How) I can fetch the file #### I received if curl successfully send a file? like the following code? #filedt <- httr::POST( # url = "http://myHost/ocpu/library/myPackage/R/myFunc", # body = upload_file( # path = path.expand(file), # type = 'text/csv'), # verbose() #) #DT <- fread(##filedt) } ## then handle DT with other arguments ### ... return(output) } 想請問有沒有類似經驗可以建議我怎麼處理這樣的request 或者別種實現方法、範例皆可~~ 謝謝 [軟體熟悉度]: 請把以下不需要的部份刪除 使用者(已經有用R 做過不少作品) [環境敘述]: 請提供 sessionInfo() 的輸出結果, R version 3.3.2 (2016-10-31) Platform: x86_64-pc-linux-gnu (64-bit) Running under: Ubuntu 14.04.5 LTS locale: [1] LC_CTYPE=en_PH.UTF-8 LC_NUMERIC=C [3] LC_TIME=zh_TW.UTF-8 LC_COLLATE=en_PH.UTF-8 [5] LC_MONETARY=zh_TW.UTF-8 LC_MESSAGES=en_PH.UTF-8 [7] LC_PAPER=zh_TW.UTF-8 LC_NAME=C [9] LC_ADDRESS=C LC_TELEPHONE=C [11] LC_MEASUREMENT=zh_TW.UTF-8 LC_IDENTIFICATION=C attached base packages: [1] stats graphics grDevices utils datasets methods base [關鍵字]: API, opencpu, curl -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 36.225.70.235 ※ 文章網址: https://www.ptt.cc/bbs/R_Language/M.1481037620.A.1D5.html

12/06 23:31, , 1F
不知道能不能同時用HTTP Post + Get...
12/06 23:31, 1F

12/06 23:54, , 2F
curl -d,-F應都是POST?https://www.opencpu.org/api.html
12/06 23:54, 2F

12/07 00:11, , 3F
看你的web server吐給你什麼file
12/07 00:11, 3F

12/07 00:12, , 4F
opencpu有綁apache?
12/07 00:12, 4F

12/07 00:22, , 5F
有跑apache, 如只傳 curl -F "file=@tmp.txt"先不管-d
12/07 00:22, 5F

12/07 00:23, , 6F
可以看到回傳/ocpu/tmp/x04b063e194/files/tmp.txt
12/07 00:23, 6F

12/07 00:25, , 7F
但這種temporary dir每次路徑名都換?我在程式中要怎麼抓
12/07 00:25, 7F

12/07 00:26, , 8F
另外就是沒有-d arguemnts..我也沒法繼續處理這個file..
12/07 00:26, 8F

12/07 06:50, , 10F
post-parameter
12/07 06:50, 10F

12/07 06:51, , 11F
暫存檔都是生成的,要看opencpu怎麼接apache
12/07 06:51, 11F

12/07 07:01, , 12F

12/07 07:01, , 13F
手冊看起來是接一個named file
12/07 07:01, 13F

12/07 07:02, , 14F
所以你post要送file=upload_file
12/07 07:02, 14F

12/07 07:02, , 15F
opencpu會幫你把http request處理掉
12/07 07:02, 15F

12/07 10:26, , 16F
感謝提示,還在try看起來檔案有傳但其他參數沒有真的傳進
12/07 10:26, 16F

12/07 10:35, , 17F
如o大連結用-F "file=@localfile" -F "argument1=..;.."
12/07 10:35, 17F

12/07 10:37, , 18F
前面的file會被opencpu處理,但後面的參數沒有進到程式中
12/07 10:37, 18F

12/07 10:48, , 19F
GET的意思是在網址後面加上?arg1=value1&arg2=value2
12/07 10:48, 19F

12/07 10:48, , 20F
這樣POST的部分放檔案,GET的部分放參數
12/07 10:48, 20F

12/07 10:48, , 21F
只是我不清楚OpenCPU能不能處理這樣的request,可以的話
12/07 10:48, 21F

12/07 10:48, , 22F
就能是一種workaround
12/07 10:48, 22F

12/07 11:42, , 23F
謝謝Wush大我原先誤解意思,但我這樣寫opencpu會導到別處
12/07 11:42, 23F

12/07 11:42, , 24F
不過我剛試出來了 -F 要一個個寫,不可以用;隔開參數!!
12/07 11:42, 24F

12/07 11:43, , 25F
感謝諸位回應幫忙的大大們! R裏頭還是寫 fread(file)即可
12/07 11:43, 25F

12/07 11:44, , 26F
然後 curl -F "file=@myfile" -F "arg1=.." -F "arg2=.."
12/07 11:44, 26F

12/07 11:48, , 27F
然後curl url寫../R/myFunc/json 就可以導出output json
12/07 11:48, 27F

12/07 11:49, , 28F
It save my day!! Really thanks~~ ^^
12/07 11:49, 28F

12/07 19:32, , 29F
分享一下架opencpu的心得啊,我也想直接用r串api
12/07 19:32, 29F

12/07 19:45, , 30F
可以,我再找時間寫,其實很好用 opencpu實在很讚~~
12/07 19:45, 30F

12/07 19:48, , 31F
可以看看我的部落格XD:https://goo.gl/zY0As6
12/07 19:48, 31F

12/07 19:49, , 32F
至於安裝opencpu,按照官網裝一下就好了
12/07 19:49, 32F

12/07 19:49, , 33F
sudo yum install opencpu
12/07 19:49, 33F

12/07 19:50, , 34F
上面是Fedora一鍵就可以安裝
12/07 19:50, 34F

12/07 19:51, , 35F
我在centos上裝,就參考這篇https://goo.gl/on1jmT
12/07 19:51, 35F

12/07 20:28, , 36F
太好了,裝在ubuntu很簡單,但centos6.5我裝不起來,再來
12/07 20:28, 36F

12/07 20:28, , 37F
照你的步驟試看看,謝謝分享~~
12/07 20:28, 37F

12/07 20:30, , 38F
資訊很豐富哩,看來可以偷學,也可以偷懶不用寫了XD
12/07 20:30, 38F
文章代碼(AID): #1OHjSq7L (R_Language)
文章代碼(AID): #1OHjSq7L (R_Language)