下面的代码是用Spring MVC编写的。我首先通过读取文件来模拟 SELECT t.*,
CASE WHEN t.ENDTIME < m.MaxStartTime THEN 0
WHEN t.STARTTIME > m.MinEndTime THEN 0
ELSE 1 END AS Covered
FROM @tbl AS t
JOIN
(SELECT DATES,
MIN(ENDTIME) MinEndTime,
MAX(STARTTIME) MaxStartTime
FROM @tbl
GROUP BY DATES) AS m
ON t.DATES = m.DATES
并将其发送给客户端。
对于dynamic response generation
方法,响应将包含GET
标头而不是Transfer-Encoding: chunked
标头。
对于Content-Length
方法,我该如何实现响应?我应该手动插入HEAD
标题并删除Transfer-Encoding: chunked
标题吗?
Content-Length
我的客户的行为是:
首先发起@RestController
public class ChunkedTransferAPI {
@Autowired
ServletContext servletContext;
@RequestMapping(value = "xxx.iso", method = { RequestMethod.GET })
public void doChunkedGET(HttpServletResponse response) {
String filename = "/xxx.iso";
try {
ServletOutputStream output = response.getOutputStream();
InputStream input = servletContext.getResourceAsStream(filename);
BufferedInputStream bufferedInput = new BufferedInputStream(input);
int datum = bufferedInput.read();
while (datum != -1) {
output.write(datum); //data transfer happens here.
datum = bufferedInput.read();
}
output.flush();
output.close();
} catch (IOException e) {
// TODO Auto-generated catch block
System.out.println(e.getMessage());
}
}
@RequestMapping(value = "xxx.iso", method = { RequestMethod.HEAD })
public void doChunkedHEAD(HttpServletResponse response) {
// response.setHeader("Server", "Apache-Coyote/1.1");
// response.setHeader("Transfer-Encoding", "chunked");
}
}
请求以获取HEAD
。此大小用于分配一些缓冲区。
然后发起anticipated response size
请求以实际获取响应内容并将其放入缓冲区。
我有种感觉,我GET
客户端的行为,而不是遵循一些RFC标准。我担心即使我能让客户满意我的回复,它也会因其他服务器的响应而失败。
任何人都可以对此有所了解吗?我该如何实施HEAD响应? 或者客户端永远不应该依赖HEAD响应来决定GET响应的大小,因为RFC说:
服务器 应该 发送相同的标题字段以响应HEAD 请求,如果请求是GET,它会发送, 除外 有效负载标题字段 (第3.3节) 可以省略 。
而catering to
恰好是Content-Length
之一。