JSON跨域调用Python的完整实现与jQuery JSONP详解
本文详细解析了通过JSON跨域调用Python服务端的实现方法,重点介绍了jQuery中JSONP的配置参数与使用细节。针对AJAX跨域时POST转GET、回调函数执行机制及success失效等常见问题提供了具体代码示例与排查思路,并附带实用的JSON处理工具推荐。
本文详细介绍JSON跨域调用Python的具体实现方法,旨在为开发者提供清晰的参考方案。
客户端代码示例如下:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>jQuery-跨域请求</title>
<script src="http://code.jquery.com/jquery-1.10.1.min.js"></script>
<script src="http://code.jquery.com/jquery-migrate-1.2.1.min.js"></script>
</head>
<script type="text/javascript">
jQuery(document).ready(function(){
$.ajax({
type : "GET",
url : "http://10.13.38.43:1234/?id=10&callback=?",
dataType : "jsonp",
jsonp: 'callback',
success : function(json){
alert(json.account);
//$('#msg_box').html(json);
//return true;
}
});
});
</script>
<body>
<div id="msg_box"></div>
</body>
</html>
服务端Python代码实现:
import web
urls=('/','Index',)
class Index:
def GET(self):
inputdata=web.input()
mycallbackfun=inputdata.callback
#return 'hello' +inputdata.id
return mycallbackfun+'({"account":"XX","passed":"true","error":"null"})'
app = web.application(urls, globals())
if __name__=='__main__':
app.run()
补充说明:jQuery跨域请求的核心机制简介
本节重点介绍jQuery中跨域请求的配置方法,并提供基础示例代码供参考。
在项目开发中,使用AJAX进行JSONP调用时曾遇到特定问题:虽然能成功获取请求结果,但success回调函数并未执行。经过调试已解决该问题,现将关键经验记录如下。
function TestAjax()
{
$.ajax({
type : "get",
async : false,
url : "ajaxHandler.ashx", //实际上访问时产生的地址为: ajax.ashx?callbackfun=jsonpCallback&id=10
data : {id : 10},
cache : false, //默认值true
dataType : "jsonp",
jsonp: "callbackfun",//传递给请求处理程序或页面的,用以获得jsonp回调函数名的参数名(默认为:callback)
jsonpCallback:"jsonpCallback",
//自定义的jsonp回调函数名称,默认为jQuery自动生成的随机函数名
//如果这里自定了jsonp的回调函数,则success函数则不起作用;否则success将起作用
success : function(json){
alert(json.message);
},
error:function(){
alert("erroe");
}
});
}
function jsonpCallback(data) //回调函数
{
alert(data.message); //
}
public class ajaxHandler : IHttpHandler
{
public void ProcessRequest (HttpContext context) {
context.Response.ContentType = "text/plain";
string callbackfun = context.Request["callbackfun"];
context.Response.Write(callbackfun + "({name:\"John\", message:\"hello John\"})");
context.Response.End();
}
public bool IsReusable {get {return false;}
}
AJAX请求的关键参数说明:
dataType(字符串类型):指定服务器返回的数据类型。若未明确指定,jQuery会根据HTTP响应头中的MIME信息自动判断,例如识别为XML类型。
该参数支持以下可用值:
"xml":返回XML文档,可由jQuery进行解析处理。 "html":返回纯文本HTML内容;其中包含的script标签在插入DOM时会立即执行。 "script":返回纯文本JavaScript代码。除非设置了"cache"参数,否则不会自动缓存结果。
注意:在进行跨域请求(即不同域名下)时,所有POST请求都会被jQuery自动转换为GET请求。这是因为底层使用了DOM中的script标签来加载资源。
"json":返回JSON格式的数据。 "text":返回纯文本字符串。 "jsonp":指定使用JSONP格式。当以JSONP形式调用函数时,访问URL会自动在末尾追加类似"callback=callbackFunName"的参数,以便执行指定的回调函数(callbackFunName)。
jsonp(字符串类型)
用于重写JSONP请求中回调函数的名称。该值替代了"callback=?"这种GET或POST请求中URL参数里的"callback"部分。例如,设置jsonp:'callbackfun',则服务器将收到"callbackfun=?"的参数。
jsonpCallback(字符串类型)
此参数用于为JSONP请求指定一个具体的回调函数名。该值将取代jQuery默认生成的随机函数名,即对应上述"callback=?"中的问号部分。
设置此参数主要目的是让jQuery生成更独特的函数名,从而简化请求过程,并便于提供特定的回调函数和错误处理逻辑。
此外,在希望浏览器缓存GET请求时,也可以通过指定此回调函数名来实现。
AJAX JSONP与普通AJAX请求的主要区别在于对响应结果的处理方式。如上述代码所示,其响应结果格式如下:
jsonpCallback({ name:"world",message:"hello world"});
实际上,这是调用了JSONP回调函数jsonpCallback,并将要响应的字符串或JSON数据传入该方法。关于自定义JSONP回调函数的情况,当自定义了回调函数时,success函数将不起作用。这大概是因为底层实现机制所致(当然,如果使用默认回调函数,则不会执行success方法)。
function default_jsonpCallback(data)
{
success(data); //在默认的回调方法中执行
}
PS:关于JSON操作,这里再为大家推荐几款比较实用的JSON在线工具供大家参考使用:
在线JSON代码检验、检验、美化、格式化工具: http://tools.jb51.net/code/json
JSON在线格式化工具: http://tools.jb51.net/code/jsonformat
在线XML/JSON互相转换工具: http://tools.jb51.net/code/xmljson
JSON代码在线格式化/美化/压缩/编辑/转换工具: http://tools.jb51.net/code/jsoncodeformat
在线JSON压缩/转义工具: http://tools.jb51.net/code/json_yasuo_trans
C语言风格/HTML/CSS/JSON代码格式化美化工具: http://tools.jb51.net/code/ccode_html_css_json
更多Python相关内容感兴趣的读者可查看本站专题:《Python操作json技巧总结》、《Python编码操作技巧总结》、《Python图片操作技巧总结》、《Python数据结构与算法教程》、《Python Socket编程技巧总结》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》、《Python入门与进阶经典教程》及《Python文件与目录操作技巧汇总》
希望本文所述对大家Python程序设计有所帮助。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













