ColdFusion 10 RESTful Web服务无法接收gzip&#d; d(二进制)正文

时间:2013-05-31 13:24:57

标签: rest coldfusion gzip coldfusion-10

我已经编写了一个CF10 RESTful Web服务,它接受来自第三方的POST。 POST成功地使用正确的标题显示它的内容类型是application / json,内容编码是gzip。

然而,身体就是这样来的

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

问题是,在接收函数中,cfargument的{​​{1}}设置为body,而它应该是type="string"。不幸的是,将类型设置为二进制会导致调用失败。呼叫服务器收到以下内容:

  

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

     

{“消息”:“变量BODY未定义。”}

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

有没有人有任何想法允许我的REST端点接收这个gzip(二进制)主体?或者,有没有人知道如何将字符串表示转换回gzip'd二进制文件然后可以膨胀,然后我可以恢复json数据包?

我的代码如下所示:

type="binary"

提前谢谢大家。

3 个答案:

答案 0 :(得分: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

感谢。

答案 1 :(得分:2)

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

来完成

简而言之,CF的休息支持是基于JERSEY API构建的。当请求到达休息端点(在URL中定义)时,会在调用实际函数之前执行一系列泽西过滤器。这是此过滤器将执行的位置,并为您处理GZIP压缩。

您可以只配置请求过滤器(如果库不期望回复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&amp; * .xml请求。

HTH, Chandan Kumar

答案 2 :(得分:0)