我在使用XMLHttpRequest时遇到问题,在身体中使用表情符号时会切断json编码信息的正文。
var emoji = '"\u2764\uFE0F"';
var data = {
id: messageid, time: new Date(),
layout: { 'type': "message", title: emoji, body: emoji, largeIcon: "http://site/icons/icon.png", foregroundColor: "#445566", backgroundColor: "#222222" },
createNotification: {
layout: { 'type': "genericNotification", title: emoji, subtitle: emoji, largeIcon: "http://site/icons/icon.png" }
}
};
jsonenc = JSON.stringify(data);
console.log(jsonenc) //displays data fine.
var request = new XMLHttpRequest();
request.open('PUT', dict.url, true);
request.setRequestHeader('Content-Type', 'application/json;charset=UTF-16');
request.setRequestHeader('X-User-Token', dict.token);
request.setRequestHeader("Content-length", data.length);
request.send(dict.data);
如果我在console.log中记录了json数据,那么数据是全长的,但是如果我在mitmproxy下查看请求,它会被切断:
{"id":"messageid-123456","time":"2015-05-29T03:43:17.566Z","layout":{"type":"message","title":"\"......\"","body":"\"......\"","largeIcon":"http://site/icons/icon.png","foregroundColor":"#445566","backgroundColor":"#222222"},"createNotification":{"layout":{"type":"genericNotification""title":"\"......\"","subtitle":"\"......\"","largeIcon":"http://site/icons/ic
答案 0 :(得分:1)
request.setRequestHeader('Content-Type', 'application/json;charset=UTF-16');
charset
媒体类型没有application/json
参数。如果有,UTF-16将是错误的选择。当XMLHttpRequest发送JS String
时,它将其编码为UTF-8。
request.setRequestHeader("Content-length", data.length);
这没有任何作用。 XMLHttpRequest始终根据您发送的数据长度填充Content-Length并忽略此调用。如果没有,data.length
将是错误的值,因为这是UTF-16代码单元的长度,但Content-Length是以字节为单位测量的。
如果我查看mitmproxy下的请求,它会被切断:
这似乎是mitmproxy用户界面的问题。
"title":"\"......\""
U + 2764,U + FE0F被编码为UTF-8,字节为0xE2,0x9D,0xA4,0xEF,0xB8,0x8F。 mitmproxy仅显示ASCII流数据而不尝试解码任何其他编码,因此它将每个顶部位设置的字节显示为占位符.
。