【发布时间】:2016-07-25 14:31:37
【问题描述】:
我正在尝试创建一个使用数据库来响应通过 URI 引入的某些查询的网络服务器。
我遇到的问题与 HTTP 处理程序有关。 Chrome 会返回 ERR_CONTENT_LENGTH_MISMATCH。
我按照 Java 文档中的示例进行操作,理论上它应该可以工作。 IE 和 Edge 不显示任何错误或文本。
如果有问题,请您看看并告诉我吗?
代码如下:
private class QueryHandler implements HttpHandler {
private Map<String, String> parameters;
private String result;
private OutputStream os;
@Override
public void handle(HttpExchange exchange) throws IOException {
parameters = this.extractParameters(exchange.getRequestURI().getRawQuery());
result = dbController.jsonQueryResponse(parameters.get("year"), parameters.get("day"), parameters.get("category")).toString();
exchange.getResponseHeaders().set("Content-Type", "application/json; charset=UTF-32");
exchange.sendResponseHeaders(200, result.getBytes("UTF-32").length);
os.write(result.getBytes("UTF-32"));
exchange.close();
}
private Map<String, String> extractParameters(String query){
Map<String, String> toBeReturned = new HashMap<>();
for(String parameterValue : query.replaceFirst("\\?", "").split("&")){
String[] parameter = parameterValue.split("=");
toBeReturned.put(parameter[0], parameter[1]);
}
return toBeReturned;
}
}
有趣的事实:
- Edge 让我下载一个 txt 文件。
- IE 没有。
谢谢!
【问题讨论】:
-
如果您提到的 2 个浏览器没有显示任何错误或文本,您在哪里看到 ERR_CONTENT_LENGTH_MISMATCH?
-
您似乎发送了
result.length()的内容长度,但这可能与result.getBytes().length不同 - 取决于结果字符串的编码和值,因此会出现不匹配错误。所以将result.getBytes().length作为内容长度发送。 -
@f1sh 请查看编辑。
-
@wero 我已经尝试过了,但它不起作用(在写到这里之前我又尝试了一次以更加确定)。
-
@PetruDanielTudosiu 至少这消除了可能的错误来源。您还应该使用
String.getBytes(CharSet)显式控制编码并在内容类型标头中宣布编码