将数据发布到 JsonP
可以将数据发布到JsonP吗?或者所有数据都必须作为 GET 请求在查询字符串中传递吗?
我需要跨域发送到服务的大量数据,并且数据太大而无法通过查询字符串发送
解决此问题的选项有哪些?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
可以将数据发布到JsonP吗?或者所有数据都必须作为 GET 请求在查询字符串中传递吗?
我需要跨域发送到服务的大量数据,并且数据太大而无法通过查询字符串发送
解决此问题的选项有哪些?
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
接受
或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
发布评论
评论(7)
由于 同源策略。 JSON-P 之所以有效,是因为您可以将
标签插入到 DOM 中,并且它们可以指向任何地方。
当然,您可以将另一个域上的页面设为常规表单 POST 的操作。
编辑:有一些有趣的技巧,如果您愿意付出大量努力插入隐藏的
并修改它们的属性。
It is not possible to do an asynchronous
POST
to a service on another domain, due to the (quite sensible) limitation of the same origin policy. JSON-P only works because you're allowed to insert<script>
tags into the DOM, and they can point anywhere.You can, of course, make a page on another domain the action of a regular form POST.
Edit: There are some interesting hacks out there if you're willing to go to a lot of effort inserting hidden
<iframe>
s and mucking about with their properties.如果需要跨域发送大量数据。我通常创建一个可以通过两个步骤调用的服务:
首先,客户端执行表单提交(允许跨域发布)。该服务将输入存储在服务器上的会话中(使用 GUID 作为密钥)。 (客户端创建一个 GUID 并将其作为输入的一部分发送)
然后客户端执行正常的脚本注入 (JSONP) 作为参数,您使用与 FORM 帖子中使用的相同的 GUID。该服务处理来自会话的输入并以正常的 JSONP 方式返回数据。此后,会话将被销毁。
这当然依赖于您编写服务器后端。
If you need to send a lot of data cross-domain. I usually create a service that you can call in two steps:
First the client do a FORM submit (post allowed cross domain). The service stores the input in the session on the server (using the GUID as key). (the client creates a GUID and send's it as a part of the input)
Then the client do a normal script-inject (JSONP) as a parameter you use the same GUID as you used in the FORM post. The service processes the input from the session and returns the data in the normal JSONP-fashion. After this the session is destroyed.
This of course relies on that you write the server-backend.
我知道这是严重的死灵术,但我想我应该使用 jQuery 发布我的 JSONP POST 实现,我已成功地将其用于我的 JS 小部件(这用于客户注册和登录):
基本上,我正在使用IFrame 方法,如已接受的答案中所建议的。我所做的不同之处在于发送请求后,我正在观察是否可以使用计时器在 iframe 中访问该表单。当表单无法到达时,说明请求已返回。然后,我使用普通的 JSONP 请求来查询操作的状态。
我希望有人觉得它有用。在 >= IE8、Chrome、FireFox 和 Safari 中进行了测试。
I know this is serious necromancy, but I thought I'd post my implementation of JSONP POST using jQuery, which I'm successfully using for my JS widget (this is used for customer registration and login):
Basically, I'm using an IFrame approach, as suggested in the accepted answer. What I'm doing differently is after sending the request, I'm watchin, if the form can be reached in the iframe, using a timer. When the form cannot be reached, it means the request has returned. Then, I'm using a normal JSONP request to query for the status of the operation.
I hope that someone finds it useful. Tested in >=IE8, Chrome, FireFox and Safari.
一般来说,JSONP 是通过向调用文档添加
标签来实现的,这样 JSONP 服务的 URL 就是“src”。浏览器通过 HTTP GET 事务获取脚本源。
现在,如果您的 JSONP 服务与您的调用页面位于同一域中,那么您可能可以通过简单的
$.ajax()
调用将某些内容拼凑在一起。如果它不在同一个域中,那么我不确定它怎么可能。Well generally JSONP is implemented by adding a
<script>
tag to the calling document, such that the URL of the JSONP service is the "src". The browser fetches script source with an HTTP GET transaction.Now, if your JSONP service is in the same domain as your calling page, then you could probably cobble something together with a simple
$.ajax()
call. If it's not in the same domain, then I'm not sure how it'd be possible.您可以使用 CORS 代理 使用此 项目。它将所有流量定向到您域上的端点,并将该信息中继到外部域。由于浏览器将所有请求注册到同一域中,因此我们可以发布 JSON。
注意:这也适用于服务器上保存的 SSL 证书。
You could use a CORS Proxy using this project. It would direct all traffic to an endpoint on your domain and relay that information to an external domain. Since the browser is registering all requests to be on the same domain we are able to post JSON.
NOTE: This also works with SSL certificates held on the server.
有一个(黑客)解决方案我已经做过很多次了,你将能够使用 JsonP 发布。
(您将能够发布表单,大于 2000 个字符,超过您可以通过 GET 使用的字符)
客户端应用程序 Javascript
JAVA:
PHP:
像这样,您正在向任何发布请求开放服务器,您应该通过提供身份或其他内容来重新保护它。
使用此方法,您还可以将请求类型从 jsonp 更改为 json,两者都可以,只需设置正确的响应内容类型
jsonp
json
请注意,您的服务器将不再尊重SOP(同源政策),但谁在乎呢?
There's a (hack) solution I've did it many times, you'll be able to Post with JsonP.
(You'll be able to Post Form, bigger than 2000 char than you can use by GET)
Client application Javascript
JAVA:
PHP:
Doing like this, you are opening your server to any post request, you should re-secure this by providing ident or something else.
With this method, you could also change the request type from jsonp to json, both work, just set the right response content type
jsonp
json
Please not that you're server will no more respect the SOP (same origin policy), but who cares ?
有可能,这是我的解决方案:
在您的 javascript 中:
在您的 url.php 中:
It is possible, here is my solution:
In your javascript:
In your url.php: