跨域查询接口的数据,之前在公司时有发生过,产生的原因是,本地请求的域名或IP地址不一致,解除方法,也是修改域名和IP地址。比如:

接口中的数据来自IP地址:192.168.1.23/get.php

如果本地调用这个接口中的数据,必须要修改你的请求地址也同样为 192.168.1.23/get.php

通常的做法是将接请求地址组合为一个对象和一个方法,通过调用这个方法来调用接口:

/*查询接口*/

var config = {
"protocol":"http",
"server":"oliveche.com",
"virtualDirectory":"quiz/api.php"
}; var getBaseUrl = function(){
return config.protocol + "://" + config.server + "/" + config.virtualDirectory + "/";
}

最近在做一个笔记时,因为也是调用别人的接口,而产生了跨域,即使在本地更改了请求的域名或IP地址也不能直接使用 $.ajax({})中的get或post,会直接报跨域请求失败,解决的办法是使用 :$.ajaxSetup()

首先了解一下这个方法 $.ajaxSetup(),为所有 AJAX 请求设置默认 URL 和 success 函数,它的语法是:

jQuery.ajaxSetup( settings )

什么意思呢?settings 是一个对象,其中的每个属性表示需要更改默认设置的选项,而它的属性值表示更改后的默认值:

//需要更改的属性:更改后的默认值
key : value

下面是我使用$.ajaxSetup()的使用示例方法:

$(function(){
//查询方法
searchData();
}); function searchData(){
$.ajaxSetup({
url: getBaseUrl() + "Quiz.get", // 默认URL
type: "GET" , // 默认使用GET方式
success:function(result){ //result 是查询接口中返回的数据
//你的数据逻辑方法
},
error:function(){}
});
  //这里调用$.ajax()方法时,已经被$.ajaxSetup中的属性 success 返回了正确的结果
$.ajax();
}

下面是官方文档中摘抄到的示例方法:

//设置AJAX的全局默认选项
$.ajaxSetup( {
url: "/index.html" , // 默认URL
aysnc: false , // 默认同步加载
type: "POST" , // 默认使用POST方式
headers: { // 默认添加请求头
"Author": "CodePlayer" ,
"Powered-By": "CodePlayer"
} ,
error: function(jqXHR, textStatus, errorMsg){ // 出错时默认的处理函数
// jqXHR 是经过jQuery封装的XMLHttpRequest对象
// textStatus 可能为: null、"timeout"、"error"、"abort"或"parsererror"
// errorMsg 可能为: "Not Found"、"Internal Server Error"等 // 提示形如:发送AJAX请求到"/index.html"时出错[404]:Not Found
alert( '发送AJAX请求到"' + this.url + '"时出错[' + jqXHR.status + ']:' + errorMsg );
}
} ); // 未设置任何参数,但url、async、type、headers、error等参数的默认值均已被$.ajaxSetup()更改(如上)
$.ajax( ); // 设置了url、type、success、error,就使用自己设置的参数值
// 但async、headers等参数的默认值已被$.ajaxSetup()更改
$.ajax( {
url: "myurl.php?action=list" ,
type: "GET" ,
success: function( data, textStatus, jqXHR ){
alert("返回数据:" + data);
} ,
error: function(jqXHR, textStatus, errorMsg){
alert("自己的error!");
}
}); // 上述$.ajaxSetup()的默认设置对$.get()、$.post()、load()、$.getJSON()、$.getScript()等AJAX函数也生效
// 因为这些函数也是在内部调用$.ajax()函数来实现的,只不过它们在内部都设置了一些参数 // $.get()在内部调用$.ajax()时已设置type为"GET",因此仍然使用GET方式。
// 但url、async、headers、error等参数的默认值已被$.ajaxSetup()更改
$.get( ); // $.post()在内部调用$.ajax()时已设置type为"POST",因此仍然使用POST方式。
// url也被设置为"user/action.php?method=addUser"
// 但async、headers、error等参数的默认值已被$.ajaxSetup()更改
$.post( "user/action.php?method=addUser" );

总之,我们的目的是在使用$.ajax({})时不管使用get还是post,接口中的数据是不存在跨域的就OK。

需要注意的是用$.ajaxSetup函数所设置的默认值不会应用到load()命令上。对于实用工具函数,如$.get()和$.post(),其HTTP方法不会因为使用这些默认值而被覆盖。设置GET的默认类型不会导致$.post()使用HTTP的GET方法。

<script type="text/javascript">
$().ready(function () {
  var show = $('#show');
  $('#selectNum').change(function () {
    var idValue = $(this).val();
    $.get('Server.aspx', { id: idValue }, function (data) { show.append(data+'<br/>'); });
  });   $.ajaxSetup({
    timeout: 3000,
    dataType: 'html',
    //请求成功后触发
    success: function (data) { show.append('success invoke!' + data + '<br/>'); },
    //请求失败遇到异常触发
    error: function (xhr, status, e) { show.append('error invoke! status:' + status+'<br/>'); },
    //完成请求后触发。即在success或error触发后触发
    complete: function (xhr, status) { show.append('complete invoke! status:' + status+'<br/>'); },
    //发送请求前触发
    beforeSend: function (xhr) {
    //可以设置自定义标头
    xhr.setRequestHeader('Content-Type', 'application/xml;charset=utf-8');
    show.append('beforeSend invoke!' +'<br/>');
    },
  })
})
</script>

跨域调用接口的方法之一:$.ajaxSetup()的更多相关文章

  1. 配置nginx反向代理服务器,解决浏览器跨域调用接口的限制问题

    配置nginx反向代理服务器,解决浏览器跨域调用接口的限制问题 - 大venn的博客 - CSDN博客https://blog.csdn.net/u011135260/article/details/ ...

  2. 调用ajax 跨域调用接口

    //ajax 跨域请求数据 function ajaxType (){ $.ajax({ url: "http://127.0.0.1:9090/spring_mvc/HttpClient/ ...

  3. 搭建nginx代理,为前端页面跨域调用接口

    前端同学因开发需要,本地搭建的服务需要调用其它域名的接口,在帮助正确配置后,已能正常使用. 这里写一篇博客,记录一下. 前端页面地址为127.0.0.1:9813/a.html 接口地址http:// ...

  4. 跨域调用接口——WebClient通过get和post请求api

    AJAX不可以实现跨域请求,经过特殊处理才行.一般后台可以通过WebClient实现跨域请求~ //get 请求        string url = string.Format("htt ...

  5. Thinkphp5.1允许uni-app的H5跨域请求接口解决方法

    情景: uni-app使用vue框架开发混合APP,虽然APP或者小程序没有跨域,但希望就是写完这个既有H5,又有APP,小程序等,所以能通过后端解决跨域最好.但是不知道是vue的原因还是什么,在PH ...

  6. iframe 跨域调用父级方法的方案

    一.如果高层域名相同的话,可以通过document.domain来实现跨域访问 例如: 父级域名:localhost:8080 子级域名:localhost:9090 那么可以设置document.d ...

  7. jquery Ajax跨域调用WebServices方法

    由于公司需要开发一个手机页面,想提供给同事直接在手机上可以查询SAP资料.数据需要使用js调用webserver来获取. 因为初次使用Jquery调用Webserver,所以期间并不顺利.测试调用We ...

  8. jquery中的jsonp跨域调用(接口)

                                                                           jquery jsonp跨域调用接口

  9. ajax——CORS跨域调用REST API 的常见问题以及前后端的设置

    RESTful架构是目前比较流行的一种互联网软件架构,在此架构之下的浏览器前端和手机端能共用后端接口. 但是涉及到js跨域调用接口总是很头疼,下边就跟着chrome的报错信息一起来解决一下. 假设:前 ...

随机推荐

  1. (转)Apache从2.2换至2.4httpd.conf的调整笔记(windows环境)

    原文:https://www.cnblogs.com/tjws/articles/3469075.html#top 整理一下Windows环境Apache 2.2 改成 Apache 2.4.1后 h ...

  2. 图片base64上传时可能遇到的问题

    base64上传图片时服务器接到的值可能会丢失字符串 解决方法如下:(分为单个上传和多个上传) <?php $BASE_DIR = "../"; //文件上传 $img = ...

  3. php安装xunserch

    xunserch的安装步骤 注意:xunserch只能在linux下使用 1.安装依赖工具 yum install make gcc g++ gcc-c++ libtool autoconf auto ...

  4. Android切换横竖屏不销毁前台Activity,也不影响后台Activity

    在切换屏幕方向的时候,Activity默认会走销毁->重建的生命周期,而有时候我们不希望如此,就需要做些额外的设置了: 1.在AndroidMainifest.xml中对应的Activity标签 ...

  5. 项目ITP(六) spring4.0 整合 Quartz 实现动态任务调度

    前言 系列文章:[传送门] 项目需求: http://www.cnblogs.com/Alandre/p/3733249.html 上一博客写的是基本调度,后来这只能用于,像每天定个时间 进行数据库备 ...

  6. 绑定Github上的个人博客到Godaddy域名

    大家好,这里是「 从零开始学 Web 系列教程 」,并在下列地址同步更新...... github:https://github.com/Daotin/Web 微信公众号:Web前端之巅 博客园:ht ...

  7. 《用OpenResty搭建高性能服务端》笔记

    概要 <用OpenResty搭建高性能服务端>是OpenResty系列课程中的入门课程,主讲人:温铭老师.课程分为10个章节,侧重于OpenResty的基本概念和主要特点的介绍,包括它的指 ...

  8. 【Python】正则表达式简单教程

    说明:本文主要是根据廖雪峰网站的正则表达式教程学习,并根据需要做了少许修改,此处记录下来以备后续查看. <Python正则表达式纯代码极简教程>链接:https://www.cnblogs ...

  9. Bootstrap-table使用总结(整合版)

    一.什么是Bootstrap-table? 在业务系统开发中,对表格记录的查询.分页.排序等处理是非常常见的,在Web开发中,可以采用很多功能强大的插件来满足要求,且能极大的提高开发效率,本随笔介绍这 ...

  10. 工作中常用Windows快捷键整理(1)-快速关闭网页

    打开桌面 win+D,显示桌面快捷键,不会关闭浏览器页面,是显示桌面. 关闭当前打开的所有标签页 Alt+F4,关闭当前打开的所有浏览器标签页. 关闭当前打开的标签页 Ctrl+W,关闭当前打开的标签 ...