如何为通用 HTTP 请求的响应文件指定唯一名称?
Posted
技术标签:
【中文标题】如何为通用 HTTP 请求的响应文件指定唯一名称?【英文标题】:How can I give the response file of a universal HTTP request a unique name? 【发布时间】:2013-03-16 22:51:49 【问题描述】:我开发了一个 HTTP API 服务器(旨在由第三方应用程序调用,不一定由 Web 浏览器调用),它通过传递name
请求文件的查询字符串中的参数。所有调用,无论针对哪个文件,都在我的同一个自定义请求处理程序中处理,称为 Get
(不要与标准 HTTP get
混淆)。查询字符串包含一个属性name
,它标识要获取的唯一文件。
所以一个请求可能看起来像:
http://MyServerURL.com/Get?Key=SomeAPIKeyForAuthentication&Name=SomeUniqueIdentifier
首先,我知道我显然可以让服务器只使用 URI 来获取文件,例如...
http://MyServerURL.com/SomeUniqueIdentifier?Key=SomeAPIKeyForAuthentication
...但是该设计专门用于使用这个通用的get
命令,因此我需要在查询字符串中保留这个唯一标识符。连接到此 API 的实际应用程序永远不需要知道此文件名,但是当手动提供 URL 以供某人在浏览器中打开以下载文件时,可能会发生事件。
但是,每当通过 Web 浏览器下载文件时,由于调用是 get
,因此保存的文件名最终也只是 get
。
HTTP 中有什么技巧可以在我的服务器上实现,它会强制下载的文件名成为唯一标识符,而不仅仅是get
?比如使用re-direct之类的一些方法?
我在 Delphi XE2 中使用 Indy 10 TIdHTTPWebBrokerBridge
作为 Web 服务器。当它处理此get
请求时,我正在此组件中寻找一种方法(技术上在其相应的TWebModule
处理程序中),以使响应的文件名成为我想要的任何字符串(在本例中为SomeUniqueIdentifier
)。我听说过“URL 重写”这个词,但这是一个完全不同的话题,我认为这不是我需要的,但它可能会。
【问题讨论】:
【参考方案1】:这似乎是一种相当冗长的说法,即您想为 HTTP 下载设置文件名,与用于获取它的 URL 无关。在这种情况下,您只需发送一个 Content-Dispositon 标头,指定所需的文件名。见section 19.5.1 of rfc 2616
例如
Content-Disposition: attachment; filename="stackoverlow.ans"
【讨论】:
谢谢,这看起来很有希望,一旦我回到我的 IDE 前,我会尝试,我只是希望 Indy 已经为我正在使用的组件提供了这种内置功能。 您可以轻松地将自定义标题添加到 Indy 如果下载的文件是物理文件,可以使用TIdHTTPResponseInfo.ServeFile()
将文件发送给客户端,ServeFile()
会为你填写Content-Disposition
头部。否则可以手动填写TIdHTTPResponseInfo.ContentDisposition
属性:AResponseInfo.ContentDisposition := Format('attachment; filename="%s";', [TheDesiredFileNameHere]);
以上是关于如何为通用 HTTP 请求的响应文件指定唯一名称?的主要内容,如果未能解决你的问题,请参考以下文章
如何为带有可选 URL 参数的 GET 请求映射不同的 JSON 响应