好吧,这将有点难以解释,所以请多多包涵...
我有一个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\"; …Run Code Online (Sandbox Code Playgroud)