参考
J2MP如何Post数据在网上可以搜到不少例子,代码虽然有一些差别,但是一般都是可以用的,其中搜索的个别帖子提到了写入提交数据后必须用flush,代码如下:
测试发现,无论模拟器还是实机,调用flush后服务器完全无法获取参数,不用flush则正常,后来在网上找到不用flush的原因:
在servlet端使用request.getContentLength();语句得不到数据长度的问题
原因主要是flush()语句的使用问题,flush方法即使在缓冲区中没有满的情况下,也会将缓冲区内的内容强制写到外设,也就是所谓的刷新。 flush方法不是对所有的OutputStream子类起作用,只对那些使用缓冲区的OutputStream子类有效。。。。,因此在使用 flush()方法时,发出的数据包就无法确定长度,这时底层自动使用chunked编码,就不会有"Content-Length"这个头域,因此在服务器端就没法获取长度。所以你在程序中要注意对flush的调用,不然可能碰到奇怪的问题。。。
其实调用close方法,系统在关闭这个流前,也会将缓冲区的内容写到外设上,所以一般必须使用close()方法就行。
wtk文档给的post例子也用了flush,但并没说明情况,看来文档只是参考用的。
J2MP如何Post数据在网上可以搜到不少例子,代码虽然有一些差别,但是一般都是可以用的,其中搜索的个别帖子提到了写入提交数据后必须用flush,代码如下:
if(!postData.equals("")){
System.out.println(postData);
conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
conn.setRequestProperty( "Content-Length",String.valueOf(postData.length()));
DataOutputStream dos = conn.openDataOutputStream();
dos.write(postData.getBytes("UTF-8"));
dos.flush();
dos.close();
}
if(!postData.equals("")){
System.out.println(postData);
conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
conn.setRequestProperty( "Content-Length",String.valueOf(postData.length()));
DataOutputStream dos = conn.openDataOutputStream();
dos.write(postData.getBytes("UTF-8"));
dos.flush();
dos.close();
}测试发现,无论模拟器还是实机,调用flush后服务器完全无法获取参数,不用flush则正常,后来在网上找到不用flush的原因:
在servlet端使用request.getContentLength();语句得不到数据长度的问题
原因主要是flush()语句的使用问题,flush方法即使在缓冲区中没有满的情况下,也会将缓冲区内的内容强制写到外设,也就是所谓的刷新。 flush方法不是对所有的OutputStream子类起作用,只对那些使用缓冲区的OutputStream子类有效。。。。,因此在使用 flush()方法时,发出的数据包就无法确定长度,这时底层自动使用chunked编码,就不会有"Content-Length"这个头域,因此在服务器端就没法获取长度。所以你在程序中要注意对flush的调用,不然可能碰到奇怪的问题。。。
其实调用close方法,系统在关闭这个流前,也会将缓冲区的内容写到外设上,所以一般必须使用close()方法就行。
wtk文档给的post例子也用了flush,但并没说明情况,看来文档只是参考用的。
探讨了Java中使用POST方法发送数据时flush方法的使用问题,分析了flush导致服务器端无法获取参数的原因,并提供了正确的实现方式。
6643

被折叠的 条评论
为什么被折叠?



