将数据发布到JsonP

可以发布数据到JsonP吗? 还是所有的数据都必须作为GET请求传递给查询string?

我有很多数据,我需要发送到服务,跨域,这是太大,通过查询string发送

有什么方法可以解决这个问题?

由于同一起源策略的(相当明智的)限制,不可能对另一个域上的服务执行asynchronousPOST 。 JSON-P只能用,因为你可以在DOM中插入<script>标签,并且可以指向任何地方。

当然,您可以在另一个域上创build一个常规表单POST的操作页面。

编辑 :有一些有趣的黑客 ,如果你愿意去插入隐藏的<iframe>和大量的努力与他们的属性。

如果你需要跨域发送大量的数据。 我通常会创build一个服务,您可以分两步调用:

  1. 首先客户做一个FORM提交(允许跨域)。 服务将input存储在服务器上的会话中(使用GUID作为键)。 (客户端创build一个GUID并将其作为input的一部分发送)

  2. 然后客户端做一个正常的脚本注入(JSONP)作为一个参数,你使用相同的GUID在FORM中使用。 服务处理来自会话的input并以正常的JSONP方式返回数据。 在此之后,会议被销毁。

这当然依赖于你编写服务器的后端。

我知道这是严重的necormancy,但我想我会使用jQuery,我成功地使用我的JS小部件(这是用于客户注册和login)使用JSONP POST的实现:

基本上,我正在使用IFrame方法,正如接受的答案中所build议的那样。 我做的不同是在发送请求之后,如果可以在iframe中使用定时器访问表单。 当表单无法到达时,表示请求已经返回。 然后,我使用正常的JSONP请求来查询操作的状态。

我希望有人发现它有用。 testing> = IE8,Chrome,FireFox和Safari。

 function JSONPPostForm(form, postUrl, queryStatusUrl, queryStatusSuccessFunc, queryStatusData) { var tmpDiv = $('<div style="display: none;"></div>'); form.parent().append(tmpDiv); var clonedForm = cloneForm(form); var iframe = createIFrameWithContent(tmpDiv, clonedForm); if (postUrl) clonedForm.attr('action', postUrl); var postToken = 'JSONPPOST_' + (new Date).getTime(); clonedForm.attr('id', postToken); clonedForm.append('<input name="JSONPPOSTToken" value="'+postToken+'">'); clonedForm.attr('id', postToken ); clonedForm.submit(); var timerId; var watchIFrameRedirectHelper = function() { if (watchIFrameRedirect(iframe, postToken )) { clearInterval(timerId); tmpDiv.remove(); $.ajax({ url: queryStatusUrl, data: queryStatusData, dataType: "jsonp", type: "GET", success: queryStatusSuccessFunc }); } } if (queryStatusUrl && queryStatusSuccessFunc) timerId = setInterval(watchIFrameRedirectHelper, 200); } function createIFrameWithContent(parent, content) { var iframe = $('<iframe></iframe>'); parent.append(iframe); if (!iframe.contents().find('body').length) { //For certain IE versions that do not create document content... var doc = iframe.contents().get()[0]; doc.open(); doc.close(); } iframe.contents().find('body').append(content); return iframe; } function watchIFrameRedirect(iframe, formId) { try { if (iframe.contents().find('form[id="' + formId + '"]').length) return false; else return true; } catch (err) { return true; } return false; } //This one clones only form, without other HTML markup function cloneForm(form) { var clonedForm = $('<form></form>'); //Copy form attributes $.each(form.get()[0].attributes, function(i, attr) { clonedForm.attr(attr.name, attr.value); }); form.find('input, select, textarea').each(function() { clonedForm.append($(this).clone()); }); return clonedForm; } 

一般来说,JSONP是通过向调用文档添加一个<script>标记来实现的,这样JSONP服务的URL就是“src”。 浏览器使用HTTP GET事务来获取脚本源。

现在,如果你的JSONP服务与你的调用页面在同一个域中,那么你可以用一个简单的$.ajax()调用来拼凑一些东西。 如果它不在同一个域中,那么我不确定它是怎么可能的。

您可以使用此项目使用CORS代理 。 它会将所有stream量引导到您的域上的端点,并将该信息中继到外部域。 由于浏览器注册的所有请求都在同一个域上,所以我们可以发布JSON。 注意:这也适用于服务器上的SSL证书。

有一个(黑客)解决scheme,我已经做了很多次,你将能够张贴JsonP。 (您可以发布表单,比GET可以使用的大2000字符)

客户端应用的Javascript

 $.ajax({ type: "POST", // you request will be a post request data: postData, // javascript object with all my params url: COMAPIURL, // my backoffice comunication api url dataType: "jsonp", // datatype can be json or jsonp success: function(result){ console.dir(result); } }); 

JAVA:

 response.addHeader( "Access-Control-Allow-Origin", "*" ); // open your api to any client response.addHeader( "Access-Control-Allow-Methods", "POST" ); // a allow post response.addHeader( "Access-Control-Max-Age", "1000" ); // time from request to response before timeout 

PHP:

 header('Access-Control-Allow-Origin: *'); header('Access-Control-Allow-Methods: POST'); header('Access-Control-Max-Age: 1000'); 

这样做,你打开你的服务器的任何职位请求,你应该通过提供身份证或其他东西重新安全。

有了这个方法,你也可以把请求types从jsonp改为json,都可以工作,只需设置正确的响应内容types

JSONP

 response.setContentType( "text/javascript; charset=utf-8" ); 

JSON

 response.setContentType( "application/json; charset=utf-8" ); 

请不要认为你的服务器不会再尊重SOP(同源策略),但是谁在乎呢?

这是可能的,这是我的解决scheme:

在你的javascript:

 jQuery.post("url.php",data).complete(function(data) { eval(data.responseText.trim()); }); function handleRequest(data){ .... } 

在你的url.php中:

 echo "handleRequest(".$responseData.")";