我正在使用HttpURLConnection,我对客户端和服务器如何同步有一个问题。假设简单的下载文件示例。此示例将从Web复制到某处。我只使用代码来陈述标准流程。
Servlet代码如下:
response.setContentType(mimeType);
response.setContentLength((int) downloadFile.length());
String headerKey = "Content-Disposition";
String headerValue = String.format("attachment; filename=\"%s\"", downloadFile.getName());
response.setHeader(headerKey, headerValue);
// obtains response's output stream
OutputStream outStream = response.getOutputStream();
//write to stream
//close the stream
客户端代码如下:
HttpURLConnection httpConn = (HttpURLConnection) url.openConnection();
int responseCode = httpConn.getResponseCode();
if (responseCode == HttpURLConnection.HTTP_OK) {
String disposition = httpConn.getHeaderField("Content-Disposition");
String contentType = httpConn.getContentType();
int contentLength = httpConn.getContentLength();
//parse content-disposition
....
InputStream inputStream = httpConn.getInputStream();
String saveFilePath = saveDir + File.separator + fileName;
// opens an output stream to save into file
FileOutputStream outputStream = new FileOutputStream(saveFilePath);
//write to stream
//close stream
} else {
//if non Ok status
}
我的第一个问题是:httConn.getResponseCode()
是否阻塞调用等待servlet完成处理?否则,如果出现错误或servlet调用response.sendError()
,当你在if (responseCode == HttpURLConnection.HTTP_OK) {
内时,会发生什么。
第二个问题:是第一个问题的延伸。如果responseCode没有阻塞,那么当我访问disposition,contentType,cotentLength时,我如何确定它们已经被设置。
第三个问题。如果httConn.getResponseCode()
被阻止。因此,如果我想向客户端发送一些消息,那么在响应标头中将其发送到客户端是多么正确,如:resposnse.setHeader("my-message", "some message I want to send");
而不是使用response.getWriter()
写入流。所以我相信客户肯定会读到它。
第四个问题:如果我在servlet上写两个对象流,客户端将如何区分或区分?假设我正在使用response.getObjectOutputStream()
编写一个类对象,然后我可能正在使用writer编写一些字符串,或者之后可能会编写一个文件。客户端可以区分流中的这些不同项目,还是我必须使用多个请求。每个对象或文件一个请求或要从流中读取的字符串。
答案 0 :(得分:2)
从HTTP响应消息中获取状态代码。例如,在以下状态行的情况下:
HTTP/1.0 200 OK HTTP/1.0 401 Unauthorized
它将分别返回200和401。如果无法从响应中识别出代码,则返回-1(即,响应不是有效的HTTP)。
NA
如果需要,您可以使用标题,但标题仅限于文本且长度有限(AFAIR)。响应主体通常用于包含......响应主体。而标题通常用于元数据。
服务器和客户端必须就协议达成一致。如果协议是响应包含两个对象,则客户端应该读取两个对象。我不会这样做。您最好按顺序发送一个唯一的容器对象而不是2。 HTTP可用于传输任何内容,但JSON或XML文档通常用于传输结构化数据。