我们公司应该通过HTTP调用类似REST的服务,响应状态代码102 Processing
进行冗长(耗时)的操作。据我所知,102 Processing并不是官方HTTP标准的一部分,而是an extension for the WebDAV protocol。说,它不是我们尝试访问的WebDAV,而是一个借用"借用的HTTP服务。这个状态代码。
哪个java库支持这个?
答案 0 :(得分:3)
1)HTTP规范定义了状态代码注册表(http://www.iana.org/assignments/http-status-codes);无论在哪种规范中描述状态代码都无关紧要。
2)话虽如此,RFC 4918(废弃RFC 2518)不再定义代码102(缺少任何实现)。
答案 1 :(得分:0)
首先,在以下情况下,“ 102正在处理”状态似乎很有用:
操作持续时间很长,例如,一些复杂的带有级联的数据库删除操作,或者在WebDAV上,是大目录深度复制等。
我需要这样做,因为在某些环境中,访问是通过防火墙进行的,超时时间为5分钟。如果超过5分钟没有任何TCP连接通过连接,则连接已关闭。在服务器端,这显示为IOError连接已关闭,在客户端,这也显示为连接已关闭或超时错误消息。
我们使用102 PROCESSING,因为我们需要保持打开选项以在写入Servlet输出流之前仍然以最终200、300(重定向)或400(错误)进行回复。
确实不能很好地支持102 PROCESSING。 JETTY(服务器)有一些基本的实现,我用一个单独的线程在上面进行了处理,该线程休眠5分钟,检查Servlet输出流是否仍未提交,然后发出response.sendProcessing()并再次进入睡眠状态。写入实际输出后立即杀死线程。
如果将Apache HTTPD用作此JETTY实现的反向代理,则可以将这102个PROCESSING响应很好地传递。但是在其中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个处理作为最终响应,然后从输入流中读取其他所有内容,并在暂停期间阻塞。
如果我可以找到该实现或另一个HttpURLConnection实现的源代码,我会做一些事情使其生效。
它应该也已经可以处理100 CONTINUE响应了。这样做应该不难。