我编写了一个CF10 RESTful web服务,它接受第三方的帖子。文章成功地附带了适当的标题,显示它的内容类型是application/json,内容编码是gzip。
然而,身体却是这样出现的
??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数据包?
我的代码如下所示:
<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>先谢谢大家。
发布于 2014-01-22 17:34:14
为了在这里添加一些额外的输入,我确实提交了一个bug请求,因为试图更改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编码数据。
作为参考,我的bug请求可以在这里阅读:https://bugbase.adobe.com/index.cfm?event=bug&id=3694176
谢谢。
发布于 2013-08-22 13:31:31
如果我正确理解了您的问题,这可以用GZIPContentEncodingFilter来完成。
简而言之,CF的rest支持建立在JERSEY之上。当请求到达rest端点(在URL中定义)时,将在调用实际函数之前执行一系列jersey过滤器。这就是这个过滤器为您执行和处理GZIP压缩的地方。
您可以只配置请求筛选器(如果库不期望gzipped响应返回)。只需在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请求。
昌丹·库马尔
发布于 2014-06-10 01:09:27
https://stackoverflow.com/questions/16858387
复制相似问题