如何在REST服务中阻止Content-Length标头截断短JSON片段

时间:2015-12-04 14:20:39

标签: json rest coldfusion

对于简短的JSON字符串,如果指定了Content-Length标头,则内容将被截断并错过最后几个字符。有没有办法解决这个问题:

简单的最小例子:

component restpath="test" rest = true {
  remote void function test(
    numeric len restargsource = "Path"
  )
    httpmethod = "GET"
    restpath   = "{len}"
    produces   = "application/json"
  {
    var value = {};
    var sb    = CreateObject( "java", "java.lang.StringBuffer" );
    for ( var i = 0; i < len; i++ )
      sb.append( 'a' );
    value[ sb.toString() ] = 1;

    var json  = SerializeJSON( value );

    restSetResponse(
      {
        "status"  = 200,
        "content" = json,
        "headers" = {
          "Content-Length" = Len( json.getBytes( 'UTF-8' ) ),
          "actual-value"   = json
        }
      }
    );
  }
}

尝试

  • /test/1/test/5,然后返回的内容为空
  • /test/6返回的内容为{
  • /test/7返回的内容为{"
  • /test/8返回的内容为{"a
  • /test/9返回的内容为{"aaaaaaaaa
  • /test/10返回的内容为{"aaaaaaaaaa"
  • /test/11返回的内容为{"aaaaaaaaaaa":
  • /test/12返回的内容为{"aaaaaaaaaaaa":1
  • /test/13返回的内容为{"aaaaaaaaaaaaa":1} - 最后是正确的值!

actual-value标头始终返回整个JSON字符串,Content-Length标头是整个JSON字符串的长度(即长于截断内容的长度但等于{的长度{1}}标题)。

如果注释掉设置actual-value标题的行,则返回完整的JSON字符串。

如何让Content-Length标题不截断内容?

[注意:目前正在运行Apache 2.2,ColdFusion 11,0,03,292866和Oracle JVM 1.8.0_25(虽然我现在正在升级Apache并将最新的修补程序应用于ColdFusion) ]

0 个答案:

没有答案