我正在尝试通过 AJAX 向服务器发送字节数组:
$.ajax({
url: armd.scieldan.server + "/detachedSignFile/",
timeout: 120000,
type: "POST",
data: byteArray,
responseType: 'arraybuffer',
success: function(response) {
console.log("Sign: " + response);
},
error: function() {
console.log("error");
}
});
并尝试从
httpExchange
中提取该数组,但 requestBody
的内容为空:
public void handle(HttpExchange httpExchange) throws IOException {
httpExchange.getResponseHeaders().set("Content-Type", "text/plain");
InputStream requestBody = httpExchange.getRequestBody();
byte[] receivedBytes = IOUtils.toByteArray(requestBody);
}
实际上
BufferedInputStream
包含在requestBody
内部,但无法访问。
有什么想法可以如何通过 JSON 正确地将字节数组传递到
HttpExchange
?
如果您在客户端使用 AJAX,在服务器上使用 HTTP/REST,它通常会将您的内容视为字符串数据,除非您另有说明并使用特殊处理。
改进现有内容的最简单方法是对字节进行 Base-64 编码并将其作为有效负载发送为
text/plain
(请求内容类型)。在服务器上,您可以读取整个输入流并解码或将流包装在 Base-64 解码器中。
另一种选择是使用二进制内容类型发送数据,例如
application/octet-stream
,除非您有特定的文件类型。这样,从浏览器/客户端到服务器的网络基础设施就知道如何处理发送的字节。
可能发生的情况是,当前未明确指定内容类型,并且默认为
text/plain
或 application/json
之类的内容,然后在需要 ASCII 或其他编码时遇到无效的字节序列,例如空字符。这会导致您的输入流处理被中断并且输入数据丢失,从而导致没有向服务器报告任何内容。