通过HTTP GET调用时,使一个闪亮的应用程序执行代码(例如cURL)

通过HTTP GET调用时,使一个闪亮的应用程序执行代码(例如cURL),r,get,shiny,R,Get,Shiny,我正在构建一个R/shinny应用程序,当通过httpget调用它时,它应该会执行一些代码,这与。现在,当我通过web浏览器查看应用程序时,它工作得很好,但我真正想要的是能够在web浏览器之外远程调用该应用程序,例如,通过来自cURL或服务器端javascript的HTTP GET调用,并使用发送给它作为输入的URL参数使其执行代码 如果我在web浏览器中访问以下URL(假设Shining应用程序在localhost上运行),一切正常: http://127.0.0.1:8000/?param1

我正在构建一个R/shinny应用程序,当通过httpget调用它时,它应该会执行一些代码,这与。现在,当我通过web浏览器查看应用程序时,它工作得很好,但我真正想要的是能够在web浏览器之外远程调用该应用程序,例如,通过来自cURL或服务器端javascript的HTTP GET调用,并使用发送给它作为输入的URL参数使其执行代码

如果我在web浏览器中访问以下URL(假设Shining应用程序在localhost上运行),一切正常:

http://127.0.0.1:8000/?param1=val1&param2=val2
但是,如果我改为使用cURL调用相同的URL,则不会发生任何事情(除了返回闪亮应用程序的HTML):

我的应用程序基本上是在上面链接的问题的第一个答案中的示例应用程序的基础上构建的(由user@jdharison提供),只是它还执行一些专门用于服务器端的代码(即,用户看不到,前端也没有返回),因此作为代码示例,这应该足够了:

library(shiny)
runApp(list(
  ui = bootstrapPage(
    textOutput('text')
  ),
  server = function(input, output, session) {
    output$text <- renderText({
      query <- parseQueryString(session$clientData$url_search)
      paste(names(query), query, sep = "=", collapse=", ")
    })
  }
), port = 5678, launch.browser = FALSE)
库(闪亮)
runApp(列表(
ui=引导(
text输出('text')
),
服务器=功能(输入、输出、会话){

output$text如果生成的HTML包含Javascript,那么在浏览器中执行与在Curl中执行会有很大的不同,因为后者不会执行Javascript部分。

这是一个好观点-也许整个设计思想从一开始就错了。但核心问题仍然存在:是否可以使用Shiny来构建一个工作的web AP我与通用RESTful API有相似之处,可通过通用GET访问?@LCHansson是的,我认为使用Shiny的整个想法是错误的。如果没有JavaScript和WebSocket,Shiny可能一点用处都没有。我建议您从Shiny的依赖项开始,改为包。@Yihui,很抱歉回答得太晚。您的评论正是我正在寻找的f指针。如果您愿意将评论转换为答案,我很乐意将其标记为解决方案。谢谢!@LCHansson我所说的不完全正确,但我没有时间向您提供完整的图片。这取决于您真正想要什么。shiny中可能有一些实用程序可供您使用。特别是
session$registerDataObj()
,这是一个潜在的非常强大的函数,但我很少在公开场合提到它。解释它有点复杂。如果您足够好奇,我建议您研究
renderDataTable()是如何实现的
是在shiny中实现的,或者@Yihui的第3.2节。好的,我将研究如何从shiny中调用DataTable。感谢您的指点和宝贵的时间!
library(shiny)
runApp(list(
  ui = bootstrapPage(
    textOutput('text')
  ),
  server = function(input, output, session) {
    output$text <- renderText({
      query <- parseQueryString(session$clientData$url_search)
      paste(names(query), query, sep = "=", collapse=", ")
    })
  }
), port = 5678, launch.browser = FALSE)