gpt4 book ai didi

ruby - 使用 Rails 转发未经处理的多部分 HTTP 请求

转载 作者:数据小太阳 更新时间:2023-10-29 08:33:24 26 4
gpt4 key购买 nike

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

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

鉴于 AGS 代理仅由 ESRI 在 ASP.Net、Java 和 PHP 风格中提供,我冒昧地将 AGS 代理编写为 Rails Controller 。我选择采用这种方法是因为 JSAPI 不支持跨域请求,并且出于托管原因,我不想在我的 Rails 应用程序中提供 PHP 服务或在 JRuby 之上运行我的应用程序。我的 Rails AGS 代理适用于我目前遇到的所有情况,但多部分请求除外,它与附件编辑器功能一起出现,如图 here 所示。 .

在尝试使多部分请求起作用时,我选择使用 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

当我将参数散列转储到 Controller 中时,它看起来类似于以下内容:

{
"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 代理发出的请求进行了比较,它们看起来一致( header 和参数看起来正确)。我尝试添加附件的数据实际上已正确配置为接受附件。我被卡住了,真的需要一些帮助。

关于我的环境的一些信息:我的应用程序是在 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 请求中的参数。问题解决了。

关于ruby - 使用 Rails 转发未经处理的多部分 HTTP 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11553154/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com