3

我编写了一个接受第三方 POST 的 CF10 RESTful Web 服务。POST 成功地带有正确的标头,表明它的内容类型是 application/json 并且内容编码是 gzip。

然而身体是这样进来的

??VJ.-.??M-?LQ?R22?0W?Q??Os-????b??????_?ZT??175 ????T?E???r??KKJ??3??S]A?@u??%??`?f??FJ???`?

问题在于,在接收函数中,cfargumentforbody设置type="string"为何时真正应该是type="binary"。不幸的是,将类型设置为二进制会导致调用失败。调用服务器收到以下信息:

通知响应 HTTP/1.1 500 内部服务器错误 Content-Length: 41 Content-Type: text/plain Server: Microsoft-IIS/7.5 CF_TOMCAT_REUSE_THIS_CONNECTION: FALSE X-Powered-By: ASP.NET Date: Thu, 30 May 2013 19:53 :17 GMT 连接:关闭

{"Message":"变量 BODY 未定义。"}

我无法控制第三方对我的 REST 端点的调用。

有没有人有任何想法可以让我的 REST 端点接收这个 gzip 压缩的(二进制)正文?或者,有谁知道如何将字符串表示形式转换回 gzip 的二进制文件,然后可以对其进行膨胀,然后我可以恢复 json 数据包?

我的代码如下所示:

<cffunction name="trigger" access="remote" returntype="string" httpmethod="POST">
    <cfargument name="body" type="any" >
    <cfargument name="Length" type="String" restArgsource="Header" restargname="Content-Length" >
    <cfargument name="Type" type="String" restArgsource="Header" restargname="Content-Type">
    <cfargument name="Encoding" type="String" restArgsource="Header" restargname="Content-Encoding" >
    <cfset var result = "HTTP/1.1 200 OK" >
    <!---        Do some processing here     --->
    <cfreturn result>
</cffunction>

谢谢大家。

4

3 回答 3

3

只是为了在这里添加一些额外的输入,我确实提交了一个错误请求,因为尝试更改 web.xml 配置文件最初对我不起作用。我在配置文件中添加了额外的条目以进行 GZIP 解码,而需要做的是将 GZIP 编码过滤器的参数值添加到现有条目中。

web.xml 中原始未更改的文件应显示如下条目,可在名为 CFRestServlet 的 servlet 下找到:

<init-param>
    <param-name>com.sun.jersey.spi.container.ContainerRequestFilters</param-name>
    <param-value>coldfusion.rest.servlet.CFUriConnegFilter;coldfusion.rest.servlet.CFRequestFilter</param-value>
</init-param>
<init-param>
    <param-name>com.sun.jersey.spi.container.ContainerResponseFilters</param-name>
    <param-value>coldfusion.rest.servlet.CFResponseFilter</param-value>
</init-param>

为了启用 gzip 过滤器,请更新这两个参数以使它们以这种方式显示:

<init-param>
    <param-name>com.sun.jersey.spi.container.ContainerRequestFilters</param-name>
    <param-value>coldfusion.rest.servlet.CFUriConnegFilter;com.sun.jersey.api.container.filter.GZIPContentEncodingFilter;coldfusion.rest.servlet.CFRequestFilter</param-value>
</init-param>
<init-param>
    <param-name>com.sun.jersey.spi.container.ContainerResponseFilters</param-name>
    <param-value>coldfusion.rest.servlet.CFResponseFilter;com.sun.jersey.api.container.filter.GZIPContentEncodingFilter</param-value>
 </init-param>

如您所见,您只需将“com.sun.jersey.api.container.filter.GZIPContentEncodingFilter”作为另一个值添加到分号分隔的值列表中。完成更改后,重新启动 CF 服务器,然后基于 REST 的服务将正确并自动解码它们接收到的任何 GZip 编码数据。

作为参考,我的错误请求可以在这里阅读:https ://bugbase.adobe.com/index.cfm?event=bug&id=3694176

谢谢。

于 2014-01-22T17:34:14.373 回答
2

如果我正确理解您的问题,可以使用GZIPContentEncodingFilter来完成

简而言之,CF 的 rest 支持是建立在 JERSEY API 之上的。当请求到达休息端点(在 URL 中定义)时,会在调用实际函数之前执行一系列球衣过滤器。这是此过滤器将为您执行和处理 GZIP 压缩的地方。

您可以只配置请求过滤器(如果库不期望得到压缩响应)。只需在 web.xml 中添加以下内容,希望可以完成。

 <init-param>
         <param-name>com.sun.jersey.spi.container.ContainerRequestFilters</param-name>
         <param-value>com.sun.jersey.api.container.filter.GZIPContentEncodingFilter</param-value>
</init-param>

CF 已经添加了一个过滤器来处理 *.json 和 *.xml 请求。

HTH,钱丹库马尔

于 2013-08-22T13:31:31.207 回答
0

CF11 中添加了 GZip 编码支持:https ://wikidocs.adobe.com/wiki/display/coldfusionen/RESTful+Web+Services+in+ColdFusion#RESTfulWebServicesinColdFusion-SupportforGZipencoding

于 2014-06-10T01:09:27.670 回答