2

好吧,这有点难以解释,所以请多多包涵……

我有一个 Rails 应用程序,其中包含为 ESRI ArcGIS javascript API 编写的大型 javascript 代码库,用于与存储在 ESRI ArcGIS Server 上的空间数据进行交互。ESRI ArcGIS javascript API 使用通常称为“ArcGIS Server 代理”的东西将请求转发到需要基于令牌的身份验证或太长而无法在 URL 中直接处理的 ArcGIS Server 服务。AGS 代理只需向传递给它的 URL 发出 HTTP 请求,将与原始请求一起传递的任何附加参数转发到 ArcGIS Server 服务,该服务执行实际繁重的工作并以 JSON 响应。有关 AGS 代理的详细信息,请参阅 ArcGIS 资源中心的以下页面

鉴于 AGS 代理仅由 ESRI 在 ASP.Net、Java 和 PHP 风格中提供,我冒昧地将 AGS 代理编写为 Rails 控制器。我选择采用这种方法是因为 JSAPI 不支持跨域请求,并且出于托管原因,我不想在我的 Rails 应用程序中提供 PHP 或在 JRuby 之上运行我的应用程序。我的 Rails AGS 代理在我目前遇到的所有情况下都可以工作,除了多部分请求,它与附件编辑器功能一起发生,这里说明了

在尝试使多部分请求工作时,我选择使用 Faraday 向 ArcGIS Server 服务发出 HTTP 请求,因为 Faraday 的简单性和对多部分请求的支持。我尝试执行多部分请求的代码如下:

# Configure the request
uri = URI.parse(url)
conn = Faraday.new(:url => ("http://" + uri.host.downcase)) do |faraday|
  faraday.request :multipart
  faraday.request :url_encoded
  faraday.response :logger
  faraday.adapter Faraday.default_adapter
end

# Make request
response = conn.post uri.path do |req|
  req.body = agsparams
end

“agsparams”变量是传递给 ArcGIS Server 的参数散列。

尝试执行此代码时,在发出实际请求的行上出现 Ruby 错误,并出现以下错误,这是我目前遇到的问题:

NoMethodError (undefined method `local_path' for #ActionDispatch::Http::UploadedFile:0x007ffbe198fe60

当我在控制器中转储 params 哈希时,它看起来类似于以下内容:

{
   "attachment"=>#ActionDispatch::Http::UploadedFile:0x007ffbe198fe60
   @original_filename="test_image.jpg",
   @content_type="image/jpeg",
   @headers="Content-Disposition: form-data; name=\"attachment\"; filename=\"test_image.jpg\"\r\nContent-Type: image/jpeg\r\n",
   @tempfile=#File:/var/folders/mh/2mfy5nr54gngrzg06gzp1jcw0000gn/T/RackMultipart20120718-2772-xwbgjy,
   "f"=>"json",
   "http://arcgisserver.com/arcgis/rest/services/multitenant/test_organization/FeatureServer/0/4808/addAttachment"=>nil
}

(我删除了一些括号,以便在 StackOverflow 上显示。)

我不知道在哪里调用了“local_path”方法,因为我没有调用它,但我猜这是某种与我不理解的 ActionDispatch 相关的内置功能。ActionDispatch 中是否有我需要覆盖的方法,如果有,我该怎么做?我有一种预感,当我真的只想将文件输入参数转发到 ArcGIS Server 以便 ArcGIS Server 进行上传时,ActionDispatch 正在尝试上传我指定的文件。我不认为我想使用 Faraday::UploadIO,因为我认为我只需要将参数转发到 ArcGIS Server,但我可能是错的。我从这里去哪里??

作为一些额外的尽职调查,我已经确认我的映射 javascript 可以与其他风格的 AGS 代理一起使用;我还检查了使用 Wireshark 工作的多部分代理请求,并将这些请求与使用我的 Rails AGS 代理发出的请求进行了比较,它们看起来是一致的(标头和参数看起来正确)。我尝试添加附件的数据实际上已正确配置为接受附件。我被困住了,真的可以使用一些帮助。

关于我的环境的一些信息:我的应用程序是在 Ruby 1.9.2 上用 Rails 3.2 编写的(我目前使用 CarrierWave 和 Fog 来处理应用程序其他非映射部分的附件,如果这很重要的话)。我正在尝试通过 ArcGIS JSAPI 2.8/Dojo 1.6 发布到运行 ArcGIS Server 10.1 的服务器。

提前致谢...

4

2 回答 2

6

差点忘了这个问题。我最终通过重写要使用的请求并在需要执行多部分请求时 Net::HTTP使用multipart-post gem来解决这个问题。Net::HTTP::Post::Multipart接受一个UploadIO对象,所以我只需打开附件临时文件并将其用作我的 POST 请求中的参数。问题解决了。

于 2012-09-06T23:52:37.863 回答
1

我知道我参加聚会有点晚了,但我想我应该在这里发布以供参考。

我目前正在开发一个项目,该项目使用 Rails 作为外部 API 服务器的中间件。我们的 Rails 服务器从客户端接收到的许多请求都只是经过验证、身份验证,并提供了适当的标头以访问外部 API。自然,我一直在使用 Faraday 向 API 发出请求并遇到了这个问题(特别是图像上传)。我找不到通过未经处理的方式传递请求的方法,但我能够单独使用 Faraday 传递请求,并使用Faraday::UploadIO对象通过 Rails 代理图像数据将其传递给外部 API。我在这里创建了一个 GitHub Gist:

https://gist.github.com/mjquinlan2000/10929611

于 2014-04-16T20:45:33.293 回答