首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ColdFusion 10 RESTful Web服务无法接收gzip'd (二进制)主体

ColdFusion 10 RESTful Web服务无法接收gzip'd (二进制)主体
EN

Stack Overflow用户
提问于 2013-05-31 13:24:57
回答 3查看 690关注 0票数 3

我编写了一个CF10 RESTful web服务,它接受第三方的帖子。文章成功地附带了适当的标题,显示它的内容类型是application/json,内容编码是gzip。

然而,身体却是这样出现的

代码语言:javascript
复制
??VJ.-.??M-?LQ?R22?0W?Q??Os-????b??????_?ZT??175 ????T?E???r??KKJ??3??S]A?@u??%??`?f??FJ???`?

问题是,在接收函数中,cfargument for body被设置为type="string",而实际上它应该是type="binary"。不幸的是,将类型设置为二进制将导致调用失败。呼叫服务器接收以下信息:

通知响应HTTP/1.1 500内部服务器错误内容-长度: 41内容-类型:文本/普通服务器:Microsoft/7.5 CF_TOMCAT_REUSE_THIS_CONNECTION: FALSE X驱动-By: ASP.NET,日期:清华,2013年5月30日19:53:17 GMT连接:关闭 {“消息”:“变量体未定义”}

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

有人有什么想法可以让我的REST端点接收这个gzipped (二进制)主体吗?或者,是否有人知道如何将字符串表示形式转换回gzip'd二进制文件,然后可以充气,然后我可以恢复json数据包?

我的代码如下所示:

代码语言:javascript
复制
<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>

先谢谢大家。

EN

回答 3

Stack Overflow用户

发布于 2014-01-22 17:34:14

为了在这里添加一些额外的输入,我确实提交了一个bug请求,因为试图更改web.xml配置文件的尝试最初并不适合我。我为GZIP解码在配置文件中添加了其他条目,而需要做的是在现有条目中添加GZIP编码过滤器的参数值。

web.xml中原始的未更改的文件应该显示类似于名为CFRestServlet的servlet下面的条目:

代码语言:javascript
复制
<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过滤器,更新这两个参数使它们以如下方式出现:

代码语言:javascript
复制
<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编码数据。

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

谢谢。

票数 3
EN

Stack Overflow用户

发布于 2013-08-22 13:31:31

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

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

您可以只配置请求筛选器(如果库不期望gzipped响应返回)。只需在web.xml中添加以下内容,希望能够完成。

代码语言:javascript
复制
 <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请求。

昌丹·库马尔

票数 2
EN

Stack Overflow用户

发布于 2014-06-10 01:09:27

页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16858387

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档