如何在jsonp ajax调用中使用type:“POST”

我正在使用jQuery ajax jsonp。 我有下面的JQuery代码:

$.ajax({ type:"GET", url: "Login.aspx", // Send the login info to this page data: str, dataType: "jsonp", timeout: 200000, jsonp:"skywardDetails", success: function(result) { // Show 'Submit' Button $('#loginButton').show(); // Hide Gif Spinning Rotator $('#ajaxloading').hide(); } }); 

上面的代码工作正常,我只是想发送请求作为“POST”,而不是“GET” ,请build议如何实现这一点。

谢谢

你不能使用JSONP进行POST …它不会以这种方式工作,它会创build一个<script>元素来获取数据…这必须是一个GET请求。 除了张贴到自己的域名作为代理发布到另一个代理之外,没有什么可以做的,但用户不能直接做到这一点,并看到一个响应。

dataType使用json并发送像这​​样:

  $.ajax({ url: "your url which return json", type: "POST", crossDomain: true, data: data, dataType: "json", success:function(result){ alert(JSON.stringify(result)); }, error:function(xhr,status,error){ alert(status); } }); 

并把这些行放在你的服务器端文件中:

如果PHP:

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

如果java:

 response.addHeader( "Access-Control-Allow-Origin", "*" ); response.addHeader( "Access-Control-Allow-Methods", "POST" ); response.addHeader( "Access-Control-Max-Age", "1000" ); 

现代浏览器允许跨域AJAX查询,它被称为跨源资源共享 (请参阅本文中的一个更简短和更实用的介绍),jQuery的最新版本支持它开箱即用; (FF3.5 +,IE8 +,Safari 4+,Chrome4 +,Opera不支持AFAIK)。

JsonP只能使用types:GET,

更多信息(PHP) http://www.fbloggs.com/2010/07/09/how-to-access-cross-domain-data-with-ajax-using-jsonp-jquery-and-php/

.NET: http : //www.west-wind.com/weblog/posts/2007/Jul/04/JSONP-for-crosssite-Callbacks

如果你只是想使用$.ajax()来做一个表单POST到你自己的网站(例如,模拟一个AJAX体验),那么你可以使用jQuery表单插件 。 但是,如果您需要将表单POST发送到不同的域,或者到您自己的域,但使用不同的协议(非安全的http:页面发布到安全的https:页面),那么您将遇到跨域域脚本的限制,你将无法使用jQuery单独解决( 更多信息 )。 在这种情况下,你需要拿出大枪: YQL 。 简单地说,YQL是一种类似于SQL的语言的networking抓取语言,它允许您将整个互联网查询为一个大型表格。 就目前而言,我认为YQL是唯一的[简单]的方法,如果你想使用客户端JavaScript进行跨域表单POST。

更具体地说,您需要使用YQL的包含Execute块的Open Data Table来实现这一点。 有关如何执行此操作的良好总结,可以阅读文章“ 使用YQL刮擦需要POST数据的HTML文档 ”。 幸运的是,YQL大师Christian Heilmann已经创build了一个处理POST数据的Open Data Table 。 您可以在YQL控制台上使用Christian的“htmlpost”表格。 以下是YQL语法的细目:

  • select * – select所有列,类似于SQL,但在这种情况下,列是由查询返回的XML元素或JSON对象。 在抓取网页的上下文中,这些“列”通常对应于HTML元素,所以如果只想检索页面标题,那么您将使用select head.title
  • from htmlpost – 什么表来查询; 在这种情况下,使用“htmlpost”打开数据表(您可以使用自己的自定义表,如果这不符合您的需要)。
  • url="..." – 表单的action URI。
  • postdata="..." – 序列化的表单数据。
  • xpath="..." – 您希望包含在响应中的节点的XPath 。 这起到了过滤机制的作用,所以如果你只想包含<p>标签,那么你可以使用xpath="//p" ; 包括所有你会使用xpath="//*"

点击“testing”执行YQL查询。 一旦您对结果满意,请务必(1)单击“JSON”将响应格式设置为JSON;(2)取消选中“诊断”,通过删除无关的诊断信息来最小化JSON负载的大小。 最重要的是位于页面底部的URL – 这是您在$.ajax()语句中使用的URL。

在这里,我将向您展示使用此示例表单通过YQL查询执行跨域表单POST的确切步骤:

 <form id="form-post" action="https://www.example.com/add/member" method="post"> <input type="text" name="firstname"> <input type="text" name="lastname"> <button type="button" onclick="doSubmit()">Add Member</button> </form> 

你的JavaScript看起来像这样:

 function doSubmit() { $.ajax({ url: '//query.yahooapis.com/v1/public/yql?q=select%20*%20from%20htmlpost%20where%0Aurl%3D%22' + encodeURIComponent($('#form-post').attr('action')) + '%22%20%0Aand%20postdata%3D%22' + encodeURIComponent($('#form-post').serialize()) + '%22%20and%20xpath%3D%22%2F%2F*%22&format=json&env=store%3A%2F%2Fdatatables.org%2Falltableswithkeys&callback=', dataType: 'json', /* Optional - jQuery autodetects this by default */ success: function(response) { console.log(response); } }); } 

urlstring是从YQL控制台复制的查询URL,除了dynamic插入表单的编码action URI和序列化input数据。

注意:请注意在通过互联网传递敏感信息时的安全隐患。 确保您提交敏感信息的页面安全( https:并使用TLS 1.x而不是SSL 3.0 。

下面是我写给大家分享的JSONP:

该页面发送请求
http://c64.tw/r20/eqDiv/fr64.html

请将下面的srec保存到.html自己
c64.tw/r20/eqDiv/src/fr64.txt
resp的页面,请将srec保存在.jsp以下
c64.tw/r20/eqDiv/src/doFr64.txt

或者将代码embedded到您的网页中:

函数callbackForJsonp(resp){

 var elemDivResp = $("#idForDivResp"); elemDivResp.empty(); try { elemDivResp.html($("#idForF1").val() + " + " + $("#idForF2").val() + "<br/>"); elemDivResp.append(" = " + resp.ans + "<br/>"); elemDivResp.append(" = " + resp.ans2 + "<br/>"); } catch (e) { alert("callbackForJsonp=" + e); } 

}

$(document).ready(function(){

 var testUrl = "http://c64.tw/r20/eqDiv/doFr64.jsp?callback=?"; $(document.body).prepend("post to " + testUrl + "<br/><br/>"); $("#idForBtnToGo").click(function() { $.ajax({ url : testUrl, type : "POST", data : { f1 : $("#idForF1").val(), f2 : $("#idForF2").val(), op : "add" }, dataType : "jsonp", crossDomain : true, //jsonpCallback : "callbackForJsonp", success : callbackForJsonp, //success : function(resp) { //console.log("Yes, you success"); //callbackForJsonp(resp); //}, error : function(XMLHttpRequest, status, err) { console.log(XMLHttpRequest.status + "\n" + err); //alert(XMLHttpRequest.status + "\n" + err); } }); }); 

});