问题 我正在使用Jquery ajax发布请求发送HSV颜色。 HSV颜色(色相,饱和度和值)均为0-255的整数。因此,对于H,S和V,我一起发送了3个字节,分别表示它们的值。但是,只要3个字节之一为零(0),我就会收到“ net :: ERR_EMPTY_RESPONSE”错误。错误发生并且开发工具显示5s停顿时,服务器未收到发布请求。
我尝试过 我已经测试了服务器端,这不是问题。我已经用ajax进行了一些测试,并且无论H是0还是S或V都在Uint8Array中放置零,每次发送零字节都会导致错误。这不是CORS的问题,因为服务器正在正确处理CORS预检,并且始终可以执行非零字节有效载荷数据请求。
某些代码“ getHSVArray”返回一个Uint8Array,其HSV值在0-255范围内。 Chrome和Firefox允许将类型化数组(Uint8Array)传递到XMLHTTPRequest数据中。请求有效负载以UTF-8格式的文本发送。因此,任何零都被写为NUL UTF-8控制字符,我认为这是造成此问题的原因。
$("#sendBtn").click(() => {
var byteArray = getHSVArray(kendo.parseColor(colorSelected).toHSV());
// ex. Uint8Array([255, 255, 255]);
// error ex. Uint8Array([0, 255, 255]); or Uint8Array([255, 0, 255]);
$.ajax({
url: "http://192.168.0.25/",
type: "POST",
contentType: false,
data: byteArray,
processData: false,
crossDomain: true
});
});
我期望,它应该正常发送所有3个字节,就像所有3个HSV字节都是非零的1-255数字一样。
答案 0 :(得分:0)
HTTP协议仅允许传输字符串。例如,在发布请求中发送TypedArray时,它将数组中的0-255小数转换为字符。但是0x000000字节会导致nul控制字符,这会导致字符串变量出错,处理器会将其视为字符串的结尾。为了解决这个问题,我需要弄清楚如何使用更像TCP的协议来传输字节数组,该协议允许发送直字节数据。解决方案是WebSockets,它允许将TypedArrays发送为基数16个十六进制字节。它们基本上是从您使用其初始化的基数为10的输入中获取一个Uint8Array,将其转换为基数为16,然后将其发送到托管websocket的服务器。然后在服务器端,您只需将字节转换回以10为基数,并获取客户端的输入值即可。