我知道我可以使用jQuery和其他库轻松处理此问题,但我想亲自了解处理这些响应的最佳方法。我花了很多时间寻找处理它们的正确方法,但是我发现它们为什么存在的原因是相同的:反劫持。
因此,标题说明了一切。我知道一种非常普遍的实现方式是利用while
循环的前缀,可以使用.replace(/^while\(\d*\);/, '')
来处理,但是这感觉像是一种粗暴而骇人的处理方式,它只能解决一个可能的变化
有更好的处理方法吗?
为简单起见,例如:
var oReq = new XMLHttpRequest();
oReq.addEventListener("load", function() {
console.log(this.responseText);
});
oReq.open("GET", "http://www.example.org/example.json");
oReq.send();
这可能会产生如下响应:
while(1);{"menu":{"id":"file","value":"File","popup":{"menuitem":[{"value":"New","onclick":"CreateNewDoc()"},{"value":"Open","onclick":"OpenDoc()"},{"value":"Close","onclick":"CloseDoc()"}]}}}
答案 0 :(得分:1)
这感觉像是处理它的粗俗方法,它只能说明一种可能的变化。
不,这正是您要做的。或更不通用的.slice(9)
。服务器不添加任何甚至是动态生成的循环,它们使用最短/最简单的一个to prevent JSON hijacking。因此,您只需要处理所请求服务使用的特定前缀即可。
答案 1 :(得分:0)
除了replace()
之外,另一种方法可能是在前9个字符中使用slice()
,因为while(1);
具有 9 个字符,因此您可以丢弃它并使用{ {1}},使其成为字符串对象。
JSON.parse()