我们公司应该通过HTTP调用类似REST的服务,该服务响应状态代码102 Processing
以进行冗长(耗时)的操作。据我所知,102 Processing并不是官方HTTP标准的一部分,而是WebDAV协议的扩展。也就是说,我们尝试访问的不是WebDAV,而是"借用"此状态代码的HTTP服务。
哪个 Java 库支持此功能?
1)HTTP规范定义了一个状态代码注册表(http://www.iana.org/assignments/http-status-codes);在哪个规范中描述状态代码并不重要。
2)话虽如此,RFC 4918(过时的RFC 2518)不再定义代码102(因为缺乏任何实现)。
首先,102 处理状态在以下情况下似乎很有用:
该操作运行时间很长,例如,一些带有级联的复杂数据库删除操作,或者在 WebDAV 上,大目录深度复制等。
我需要这个,因为在某些环境中,访问是通过防火墙进行的,并且有 5 分钟的超时时间。如果 TCP 连接超过 5 分钟,则连接将关闭。在服务器端,这显示为 IOError 连接已关闭,在客户端,这也显示为连接关闭或超时错误消息。
我们使用 102 PROCESSING,因为我们需要保持我们的选项打开,以便在写入 servlet 输出流之前仍然使用 finall 200、300(重定向)或 400(错误)进行回复。
确实,102 处理没有得到很好的支持。JETTY(服务器)有一些基本的实现,我用一个单独的线程在上面制作了一些东西,该线程休眠 5 分钟,检查 servlet 输出流是否仍未提交,然后发出响应.sendProcessing() 并再次进入睡眠状态。线程在写入实际输出后立即终止。
Apache HTTPD 如果用作此 JETTY 实现的反向代理,则会通过 fine 传递这些 102 个处理响应。但是在 10 个之后,它会抛出错误。
sun.net.www.protocol.http.HttpURLConnection不能很好地解决这个问题。我有一个小测试程序:
import java.net.URL;
import java.net.URLConnection;
import java.net.HttpURLConnection;
import java.io.*;
public class urlcontest {
public static void main(String args[]) throws Exception {
URLConnection conn = new URL(args[0]).openConnection();
System.err.println("URLConnection class: " + conn.getClass());
if(args.length > 1)
conn.setRequestProperty("Cookie",args[1]);
conn.setAllowUserInteraction(false);
conn.setDoOutput(false);
conn.setDoInput(true);
InputStream in = null;
if(conn instanceof HttpURLConnection) {
HttpURLConnection hconn = (HttpURLConnection)conn;
int responseStatus = hconn.getResponseCode();
try {
in = hconn.getInputStream();
System.err.println("HTTP input: " + responseStatus);
} catch(IOException e) {
System.err.println("HTTP error: " + responseStatus);
in = ((HttpURLConnection)conn).getErrorStream();
}
} else
in = conn.getInputStream();
byte[] buf = new byte[4096];
int nread = 0;
while((nread = in.read(buf)) > 0)
System.out.write(buf, 0, nread);
in.close();
}
}
有了这个,我得到以下行为:
URLConnection class: class sun.net.www.protocol.http.HttpURLConnection
HTTP input: 102
HTTP/1.1 102 Processing
HTTP/1.1 102 Processing
HTTP/1.1 102 Processing
HTTP/1.1 301 Moved Permanently
Location: ...
Content-Type: text/html
Content-Length: ...
Server: Jetty(6.0.1)
<html>...</html>
因此,很明显,它将第一个 102 PROCESSING 作为最终响应,然后从输入流中读取其他所有内容,在暂停期间阻塞。
如果我能找到这个或其他HttpURLConnection实现的源代码,我会做一些事情来让它工作。
不知何故,它也应该已经处理了 100 个 CONTINUE 响应。这应该不难做到。