作者cywhale (cywhale)
看板R_Language
标题[问题]利用opencpu API传递档案与参数给Rpackage
时间Tue Dec 6 23:20:17 2016
[问题类型]:
程式谘询(我想用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://webptt.com/cn.aspx?n=bbs/R_Language/M.1481037620.A.1D5.html
1F:推 Wush978: 不知道能不能同时用HTTP Post + Get... 12/06 23:31
3F:推 obarisk: 看你的web server吐给你什麽file 12/07 00:11
4F:→ obarisk: opencpu有绑apache? 12/07 00:12
6F:→ cywhale: 可以看到回传/ocpu/tmp/x04b063e194/files/tmp.txt 12/07 00:23
7F:→ cywhale: 但这种temporary dir每次路径名都换?我在程式中要怎麽抓 12/07 00:25
8F:→ cywhale: 另外就是没有-d arguemnts..我也没法继续处理这个file.. 12/07 00:26
10F:→ obarisk: post-parameter 12/07 06:50
11F:→ obarisk: 暂存档都是生成的,要看opencpu怎麽接apache 12/07 06:51
13F:→ obarisk: 手册看起来是接一个named file 12/07 07:01
14F:→ obarisk: 所以你post要送file=upload_file 12/07 07:02
15F:→ obarisk: opencpu会帮你把http request处理掉 12/07 07:02
16F:→ cywhale: 感谢提示,还在try看起来档案有传但其他参数没有真的传进 12/07 10:26
17F:→ cywhale: 如o大连结用-F "file=@localfile" -F "argument1=..;.." 12/07 10:35
18F:→ cywhale: 前面的file会被opencpu处理,但後面的参数没有进到程式中 12/07 10:37
19F:→ Wush978: GET的意思是在网址後面加上?arg1=value1&arg2=value2 12/07 10:48
20F:→ Wush978: 这样POST的部分放档案,GET的部分放参数 12/07 10:48
21F:→ Wush978: 只是我不清楚OpenCPU能不能处理这样的request,可以的话 12/07 10:48
22F:→ Wush978: 就能是一种workaround 12/07 10:48
23F:→ cywhale: 谢谢Wush大我原先误解意思,但我这样写opencpu会导到别处 12/07 11:42
24F:→ cywhale: 不过我刚试出来了 -F 要一个个写,不可以用;隔开参数!! 12/07 11:42
25F:→ cywhale: 感谢诸位回应帮忙的大大们! R里头还是写 fread(file)即可 12/07 11:43
26F:→ cywhale: 然後 curl -F "file=@myfile" -F "arg1=.." -F "arg2=.." 12/07 11:44
27F:→ cywhale: 然後curl url写../R/myFunc/json 就可以导出output json 12/07 11:48
28F:→ cywhale: It save my day!! Really thanks~~ ^^ 12/07 11:49
29F:推 obarisk: 分享一下架opencpu的心得啊,我也想直接用r串api 12/07 19:32
30F:→ cywhale: 可以,我再找时间写,其实很好用 opencpu实在很赞~~ 12/07 19:45
32F:→ celestialgod: 至於安装opencpu,按照官网装一下就好了 12/07 19:49
33F:→ celestialgod: sudo yum install opencpu 12/07 19:49
34F:→ celestialgod: 上面是Fedora一键就可以安装 12/07 19:50
36F:→ cywhale: 太好了,装在ubuntu很简单,但centos6.5我装不起来,再来 12/07 20:28
37F:→ cywhale: 照你的步骤试看看,谢谢分享~~ 12/07 20:28
38F:→ cywhale: 资讯很丰富哩,看来可以偷学,也可以偷懒不用写了XD 12/07 20:30