如何为通用 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 响应

如何为Web请求指定标头

如何为通用 iPhone/iPad 应用程序指定图标?

如何为所有控制器方法返回公共/通用响应对象?

如何为 Android Room 请求制作通用 AsyncTask

如何为 UITableView 中的每个单元格类别指定特定的部分名称