当出现 4xx 或 5xx Http 错误代码时解析 Javascript 中的 JSONP 响应
我正在实现一个应用程序,该应用程序依赖于 JavaScript 客户端和服务器之间的通信,该服务器知道如何使用 JSONP 表示法响应客户端。
我正在尝试处理我的 Javascript 客户端中的情况,其中我的服务器返回 http 状态代码为 4xx 或 5xx。目前我看到的是,该脚本没有被评估,因为浏览器认为它是一个错误(事实确实如此)。但是,我仍然想阅读我的服务器在出现此 4xx 或 5xx 响应时必须说的内容我的 JavaScript 客户端中的代码。
我发现这确实会在脚本标记元素上引发错误,但我担心这不是跨浏览器,也不是一个可靠的解决方案。
即使 http 状态代码是 4xx 或 5xx,是否有人仍然能够解析 jsonp 响应?
我开始相信我应该使用这个“设置超时”解决方案,该解决方案通过声明 jsonp 请求的回调函数将在特定时间范围内完成来“检测”失败,如果没有,则有一个错误。
编辑:当我的服务器检测到 jsonp 客户端时,我暂时总是返回 200 状态代码,然后在返回的 json 对象中传输错误消息/状态。我希望利用 HTTP 状态代码,但我认为这对于 javscript 客户端来说是不行的。
I am implementing an application which relies upon communication between a JavaScript client and a server which knows how to respond to the client using JSONP notation.
I am attempting to handle the case in my Javascript client where my server returns with an http status code of 4xx or 5xx. Currently what I'm seeing is that the script is not evaluated as the browser believes it to be an error (which it is.) However, I still want to read what my server has to say in the event of this 4xx or 5xx response code in my JavaScript client.
I'm seeing that this does raise an error on the script tag element, but I'm concerned that this is not cross browser and will not be a robust solution.
Has anyone had any luck on still parsing a jsonp response even though the http status code is 4xx or 5xx?
I'm beginning to believe I should just use this "set a timeout" solution which "detects" a failure by stating the callback function to the jsonp request would complete within a certain time frame, and if it doesn't, there was an error.
EDIT: I'm temporarily always returning 200 status code when my server detects a jsonp client and then tunneling the error message/status in the json object returned. I was hoping to take advantage of the HTTP status codes but I'm thinking that is no-go for a javscript client.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
JSONP 是一种解决跨域问题的 hack。当它起作用时,效果很好。但如果没有,你就没有办法找出问题所在。
setTimeout 是在原始方法之上的另一种方法。如果您必须使用 JSONP 并且仍然需要错误检测(而不是处理),那么您就必须这样做。没有更好的解决方案。
如果您控制服务器,请尝试使用跨域资源共享 (CORS) 或 Flash 的 crossdomain.xml 等替代方案来允许跨域请求。如果您不控制服务器,您可以通过您的服务器代理响应以获得更好的控制。
JSONP is a hack to work-around cross-domain issues. When it works, it works well. But when it doesn't you don't have a way to figure out what went wrong.
setTimeout is another hack on top of the original one. If you must use JSONP and still need error detection (not handling), thats what you'd have to do. There isn't a better solution.
If you control the server, try to use alternatives such as Cross-Origin-Resource-Sharing (CORS), or Flash's crossdomain.xml to allow cross domain requests. If you don't control the server, you can proxy the response through your server to get better control.
使用 JSONP 的一种方法是在回调中嵌入状态信息。因此,回调函数签名看起来像
这样,如果您的调用看起来像
为成功调用生成代码,则看起来像
并且针对异常条件
One approach when using JSONP is to embed status information in the callback. So the callback function signature would look like
So if your call looks like
generate code for a successful call that looks like
and for an exceptional condition
您可以检查 XHR 对象的
状态
(如果您没有使用 JS 库)。如果您使用 jQuery,则可以传入
statusCode
来处理 的特殊情况$.ajaxYou can check the
status
of the XHR object (if you are not using a JS library).If you are using jQuery, you can pass in a
statusCode
to handle special cases for $.ajax