Rya*_*yan 2 ruby http arcgis-server actiondispatch ruby-on-rails-3.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 Resource Center上的下一页。
鉴于AGS代理仅由ESRI以ASP.Net,Java和PHP形式提供,因此我自由地将AGS代理编写为Rails控制器。我之所以选择这种方法,是因为JSAPI不支持跨域请求,并且出于托管的原因,我不想在Rails应用程序中提供PHP或在JRuby之上运行我的应用程序。我的Rails AGS在我遇到到目前为止,除了多的要求,这与附件编辑器的功能,这是说明发生的所有情况下,代理的作品在这里。
在尝试使多部分请求正常工作的过程中,由于法拉第的简单性和对多部分请求的支持,我选择使用Faraday向ArcGIS Server服务发出HTTP请求。我尝试执行多部分请求的代码如下:
# 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
Run Code Online (Sandbox Code Playgroud)
“ agsparams”变量是传递给ArcGIS Server的参数的哈希。
尝试执行此代码时,Ruby在发出实际请求的行上出错,并显示以下错误,这是我当前遇到的错误:
NoMethodError (undefined method `local_path' for #ActionDispatch::Http::UploadedFile:0x007ffbe198fe60
Run Code Online (Sandbox Code Playgroud)
当我将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
}
Run Code Online (Sandbox Code Playgroud)
(我删除了一些括号,以便将其显示在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的服务器。
提前致谢...
几乎忘记了这个问题。我最终通过重写要使用的请求Net::HTTP并在需要执行多部分请求时使用multipart-post gem来解决了这个问题。 Net::HTTP::Post::Multipart接受一个UploadIO对象,因此我只需打开附件临时文件并将其用作我的POST请求中的参数。问题解决了。
| 归档时间: |
|
| 查看次数: |
2068 次 |
| 最近记录: |