我已经编写了一个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"
提前谢谢大家。
答案 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)