Ajax请求,跨域小坑
今天在上班的时候,被坐在旁边项目经理叫过去问了一个Ajax请求跨域的问题,一开始没理解清楚也还有对这个没有理解的透,后面被打击的要死。
当时的需求是需要测试一个已发布的api接口,需要在本地写测试程序去测试接口。
当时的看到代码大概是这个样子
$(document).ready(function () { var args = { method: "Post", url: "Test", data: ({ "id": "FB850EE4-48EE-4502-BFE2-736B02899224" }) // url: "http://xxxxxx/xxxx/api/agency/GetOne", }; $.ajax(args).done(function (data) { }); });
当时我犯的第一个错误,没有理解跨域JSONP的概念
JSONP使用只能在GET方式下才能生效,dataType修改成post在Jquery也会转成GET方式,然而这个接口不支持GET方式请求。
var args = { method: "POST", // url: "Test", dataType: 'JSONP', data: ({ "id": "FB850EE4-48EE-4502-BFE2-736B02899224" }), url: "http://xxxxxxx/xxxx/api/agency/GetOne", }; $.ajax(args).done(function (data) { });
所以就在后面看到了类似于这样的代码,修改成用WebClient服务器发送POST请求跨域请求的问题。
1 2 3 4 5 6 7 8 9 10 | public ActionResult Test( string id) { var url = "http://xxxxxxx/xxxx/api/agency/GetOne" ; System.Net.WebClient wCient = new System.Net.WebClient(); wCient.Headers.Add( "Content-Type" , "application/x-www-form-urlencoded" ); byte [] postData = System.Text.Encoding.ASCII.GetBytes( "id=" + id); byte [] responseData = wCient.UploadData(url, "POST" , postData); string returnStr = System.Text.Encoding.UTF8.GetString(responseData); //返回接受的数据 return Json( new { rows = returnStr }, JsonRequestBehavior.AllowGet); } |
关于AJAX相关的例子已经很多了,在这里附上一个简单封装过得例子
base类
var base = { /** * 遮罩层加载 * @returns {} */ ajaxLoading: function() { $("<div class=\"datagrid-mask\"></div>").css({ display: "block", width: "100%", height: $(window).height() }).appendTo("body"); $("<div class=\"datagrid-mask-msg\"></div>").html("正在处理,请稍候...").appendTo("body").css({ display: "block", left: ($(document.body).outerWidth(true) - 190) / 2, top: ($(window).height() - 45) / 2 }); }, /** * 遮罩层关闭 * @returns {} */ ajaxLoadEnd: function() { $(".datagrid-mask").remove(); $(".datagrid-mask-msg").remove(); }, /** * * @param {} args ajax参数 * @param {} callback 回调函数 * @param {} isShowLoading 是否需要加载动态图片 * @returns {} */ ajax: function(args, callback, isShowLoading) { //采用jquery easyui loading css效果 if (isShowLoading) { base.ajaxLoading(); } args.url = args.url; args = $.extend({}, { type: "POST", dataType: "json" }, args); $.ajax(args).done(function(data) { if (isShowLoading) { base.ajaxLoadEnd(); } if (callback) { callback(data); } }) .fail(function() { if (isShowLoading) { base.ajaxLoadEnd(); } else { window.top.topeveryMessage.alert("提示", "操作失败"); } }); } }
css
.datagrid-mask { position: absolute; left: 0; top: 0; width: 100%; height: 100%; opacity: 0.3; filter: alpha(opacity=30); display: none; } .datagrid-mask-msg { position: absolute; top: 50%; margin-top: -20px; padding: 10px 5px 10px 30px; width: auto; height: 40px; border-width: 2px; border-style: solid; display: none; } .datagrid-mask-msg { background: #ffffff url('../Img/loading.gif') no-repeat scroll 5px center; } .datagrid-mask { background: #ccc; } .datagrid-mask-msg { border-color: #D4D4D4; }
方法调用
base.ajax({ type: "POST", url: "",//url contentType: "application/json", data: JSON.stringify({}) }, function(row) {
});
总结:沉下心来,不要太浮躁,每天进步一点点是成功的开始!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· 展开说说关于C#中ORM框架的用法!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?