这个问题是关于ColdFusion中HTTP块传输的previous question的延续。
现在,我使用java.net.URL
来读取块,这就是我尝试过的:
<cfset local.objURL = createObject("java", "java.net.URL")
.init(javaCast("string", "https://test.com/abc.xml"))>
<!--- Open Connection --->
<cfset local.objConnection = local.objURL.openConnection()>
<!--- Input Stream --->
<cfset local.inputStream = local.objConnection.getInputStream()>
<!--- Read Chunks --->
<cfloop condition="true">
<!--- Get Chunk Length --->
<cfset local.chunkLength = local.inputStream.read()>
<cfif local.chunkLength LT 0>
<cfbreak>
</cfif>
<!--- Byte Array --->
<cfset local.chunk = getByteArray(local.chunkLength)>
<cfset local.offset = 0>
<!--- Read Chunk Data --->
<cfloop condition="local.offset LT local.chunkLength">
<cfset local.bytesRead = local.inputStream.read(local.chunk, local.offset, local.chunkLength - local.offset)>
<cfif local.bytesRead LT 0>
<cfbreak>
</cfif>
<cfset local.offset += local.bytesRead>
</cfloop>
<!--- Chunk --->
<cfdump var="#charsetEncode( local.chunk, 'utf-8' )#"><br />
</cfloop>
使用上面的代码,我能够读取数据,但我遇到的问题是每个块中的第一个字符缺失,即
First Chunk是:
<?xml version="1.0" encoding="utf-8" ?> <root>
但我只是 得到?xml version="1.0" encoding="utf-8" ?> <root>
有什么建议吗?
答案 0 :(得分:2)
我不认为这部分是正确的:
<!--- Get Chunk Length --->
<cfset local.chunkLength = local.inputStream.read()>
<cfif local.chunkLength LT 0>
<cfbreak>
</cfif>
您希望块长度位于流的开头。为什么?这是你自己的协议吗?如果您正在讨论http分块,则应检查http响应标头Transfer-Encoding
是否具有值chunked
。否则,假设内容被分块是完全错误的。
另外,你only read one byte。这意味着块长度最多可以是255个字节,这不是很灵活。 HTTP块可以比这长,并且块大小由所有数字组成,直到换行,例如1234\r\n
。
我强烈怀疑上面的read()
总是消耗你的<
并返回一个60的chunkLength,这是<
的ascii值。