ajax调用webservice 跨域问题

时间:2021-05-08 02:24:23

用js或者jquery跨域调用接口时

对方的接口需要做jsonp处理,你的ajax jsonp调用才可以

egg 接口中已经做了jsonp处理,所以可以跨域调用

//$.ajax({
// url: "http://api.k780.com:88/?app=weather.today&weaid=1&appkey=10003&sign=b59bc3ef6191eb9f747dd4e83c99f2a4&format=json&jsoncallback=?",
// dataType: "jsonp",
// type: "Post",
// jsonpCallback: "jsonpCallback",
// success: function (data) {
// var $ul = $("<ul></ul>");
// $.each(data, function (i, v) {
// alert(i);
// //if (i=="success") {

// //} else {
// // $("#dvWeather").html("weaid:" + v.weaid + "<br/>" + "days:" + v.days + "<br/>" + "week:" + v.week + "<br/>" + "cityno:" + v.cityno + "<br/>" + "citynm:" + v.citynm + "<br/>" + "cityid:" + v.cityid + "<br/>" + "temperature:" + v.temperature + "<br/>" + "humidity:" + v.humidity + "<br/>" + "weather:" + "<br/>" + "weather_icon:" + "<img src='" + v.weather_icon + "'></img>" + "<br/>" + "weather_icon1:" + "<img src='" + v.weather_icon1 + "'></img><br/>" + "wind:" + v.wind + "<br/>" + "winp:" + v.winp + "<br/>" + "temp_high:" + v.temp_high + "<br/>temp_low:" + v.temp_low + "<br/>humi_high:" + v.humi_high + "<br/>humi_low:" + v.humi_low + "<br/>weatid:" + v.weatid + "<br/>weatid1" + v.weatid1 + "<br/>windid:" + v.windid + "<br/>winpid:" + v.winpid);
// //}

// });
// },
// error: function (responseText, textStatus, XMLHttpRequest) {
// alert(textStatus);
// }
//});
});

跨域调用webservice的例子

//$.ajax({
// url: "http://localhost:9836/Serviceajax.svc/aaa?jsoncallback=?",
// type: "get",
// dataType: "jsonp",
// success: function (data) {
// alert(data);
// }
//});

ajax调用webservice 跨域问题

配置文件中

ajax调用webservice 跨域问题

ajax调用webservice 跨域问题

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$.ajax({
 
        type: "POST",
        url: "http://localhost:9767/WebService1.asmx/HelloWorld?jsoncallback=?",
 
        data: "{}",
        dataType: "jsonp",
        success: function (data) {
             
            alert(data.result);
        }
 
 
 
    });

webservice 的代码

1
2
3
4
5
6
7
8
public void HelloWorld()
      {
 
          string callbackMethodName = HttpContext.Current.Request.Params["jsoncallback"] ?? "";
          HttpContext.Current.Response.Write(callbackMethodName + "({result:'Hello World'})");
          HttpContext.Current.Response.End();
         
      }

 这样会得到

ajax调用webservice 跨域问题

OK,JSONP的实现方式和相关验证基本上就爱完成了,现在也知道了JSONP的实现原理和实现方式,但是上面这种实现方式有点麻烦,既要自己添加script标签,同时还要自己定义一个回调函数,感觉略显麻烦,其实jQuery中已经直接提供类似的JSONP请求方式,我们只需要按照其定义好调用方式即可进行Http的跨域请求。现在我将remoteBtnClick()实现方式修改为如下,远程服务端代码不修改:

  1. //请求
  2. function remoteBtnClick() {
  3. $.ajax({
  4. url: 'http://localhost:8085/Remote/JSONPServlet',
  5. dataType: "jsonp",
  6. jsonp: "callback",
  7. jsonpCallback: "callbackHandler",
  8. success: function (data) {
  9. console.log(data);
  10. console.log("success");
  11. }
  12. });
  13. }
  14. //客户端回调
  15. function callbackHandler(json) {
  16. console.log(json);
  17. console.log("callbackHandler");
  18. }

请求结果如下:

ajax调用webservice 跨域问题

可以看到,现在直接通过ajax请求远程站点服务也成功实现了跨域请求,这个是jQuery自己已经帮我们封装好的功能。对于ajax请求中的几个参数我简单说描述下作用:
1.
dataType:’jsonp’,这个是代表当前Http请求为jsonp的请求方式;
2.
jsonp:’callback’,这个代表的是远程服务端接收客户端回调函数名的参数名,即:String
callback =
request.getParameter("callback")
 这个参数,ajax请求中jsonp参数的默认值就是callback,这个也可以自己随便更换;
3.
jsonpCallback:’callbackHandler’,这个代表远程服务调用结束后的本地回调函数名,比如上面的代码中的那个客户端回调函数名,这个jsonpCallback的参数值也是可以自己随便定义的,也可以不给这个jsonpCallback参数,其实jQuery会自动为我们生成一个函数和函数名,从上面的结果图中我们可以看到,远程服务调用成功后,既执行了SUCCESS这个回调函数,也执行我们自己定义的callbackHandler这个回调函数,所以我们完全可以使用jQuery给我们生成的回调函数,在调用结束后在SUCCESS回调中做相应的处理即可,如下是不加该参数的调用方式:

  1. $.ajax({
  2. url: 'http://localhost:8085/Remote/JSONPServlet',
  3. dataType: "jsonp",
  4. jsonp: "callback",
  5. success: function (data) {
  6. console.log(data);
  7. }
  8. });
ajax调用webservice 跨域问题

上面结果图中的圈中部分就是jQuery为我们自动生成的回调函数名。

OK,JSONP的实现方式及实现原理基本上介绍演示完了,至于jQuery中对于JSONP的实现封装方式等我有时间研究下了再继续吧~~~~~~~~~~

//ajax封装
var majax = {
//跨域ajax请求,返回结果格式:json
//url:请求地址
//type:请求方式POST,GET
//dataMap:请求参数 GET时可为null
//cache:cache参数
//async:async参数
//fn:请求成功处理函数
cross: function (url, type, dataMap, cache, async, fn) {
$.ajax({
type: type,
datatype: 'jsonp',
data: dataMap,
jsonp: "callbackparam",//传递给请求处理程序或页面的,用以获得jsonp回调函数名的参数名(默认为:callback)
jsonpCallback: "success_jsonpCallback",//自定义的jsonp回调函数名称,默认为jQuery自动生成的随机函数名
cache: cache,
async: async,
url: url,
success: fn
});
},
//非跨域ajax请求,返回结果格式:json
//url:请求地址
//type:请求方式POST,GET
//dataMap:请求参数 GET时可为null
//cache:cache参数
//async:async参数
//fn:请求成功处理函数
mormal: function (url, type, dataMap, cache, async, fn) {
$.ajax({
type: type,
datatype: 'json',
data: dataMap,
cache: cache,
async: async,
url: url,
success: fn
});
}
}

ajax调用webservice 跨域问题的更多相关文章

  1. ajax 调用webservice 跨域问题

    注意两点 1. 在webservice的config中加入这段位置 (注意不是调用webservice的webconfig中加入) <system.webServer>     <! ...

  2. JS-JQuery&lpar;JSONP&rpar;调用WebService跨域若干技术点

    1.JSONP:JSON With Padding,让网页从别的网域获取信息,也就是跨域获取信息,可以当做是一种“工具”,大多数架构Jquery.EXTjs等都支持. 由于同源策略,一般来说位于 se ...

  3. ajax访问WebService跨域问题

    1.先看一个网站介绍,了解跨域问题    HTTP访问控制(CORS) 2.像谷歌.火狐浏览器对一些非简单请求会触发预检请求,首先使用 OPTIONS   方法发起一个预检请求到服务器,然而IE浏览器 ...

  4. Ajax请求WebService跨域问题 &lbrack;转载&rsqb;

    1.背景 用Jquery中Ajax方式在asp.net开发环境中WebService接口的调用 2.出现的问题 原因分析:浏览器同源策略的影响(即JavaScript或Cookie只能访问同域下的内容 ...

  5. Ajax请求WebService跨域问题

    1.背景 用Jquery中Ajax方式在asp.net开发环境中WebService接口的调用 2.出现的问题 原因分析:浏览器同源策略的影响(即JavaScript或Cookie只能访问同域下的内容 ...

  6. Sliverlight调用WebService跨域问题解决

    在SilverlightApplication正常添加webservice(承载网站中建webservice,这样就不存在跨域问题了,即域名一样如:localhost:4676) http://loc ...

  7. silverlight调用webservice跨域

    下载下面的任何文件放在webservice的根目录下 http://files.cnblogs.com/files/jichunhu/crossdomain.xml http://files.cnbl ...

  8. 20191204-使用nginx解决ajax测试调用接口跨域问题

    问题描述 之前要测试一个http的接口,在postman中测试成功,但使用ajax调用却跨域.于是通过使用ngin反向代理的方式来解决ajax调用跨域问题 测试页面的内容 <html> & ...

  9. ASP&period;NET实现二维码 ASP&period;Net上传文件 SQL基础语法 C&num; 动态创建数据库三(MySQL) Net Core 实现谷歌翻译ApI 免费版 C&num;发布和调试WebService ajax调用WebService实现数据库操作 C&num; 实体类转json数据过滤掉字段为null的字段

    ASP.NET实现二维码 using System;using System.Collections.Generic;using System.Drawing;using System.Linq;us ...

随机推荐

  1. 项目源码--Android新闻财经类商用要求源码

    技术要点: 1. 商用要求源码框架 2. 登录与注册用户系统模块 3. Android的Http通信以及多线程处理模块 4. Andorid的网络数据处理模块 5. Andorid的版本检测与升级模块 ...

  2. CSS3 Flexbox布局那些事

    相信研究过CSS3的同学对Flexbox布局一定不会陌生(作为一个未来主流的布局方式,至少有所耳闻).最近完成了两个项目:一个是移动端H5项目,一个是嵌入HTML页面的mac客户端项目.为了庆祝这两个 ...

  3. JAVA网络爬虫WebCollector深度解析——爬虫内核

    WebCollector爬虫官网:https://github.com/CrawlScript/WebCollector 技术讨论群:250108697 怎样将爬虫内核导入自己的项目? 1.进入爬虫官 ...

  4. memcache研究

    memcache研究 最近开发了一个数据库,该数据库是利用共享内存做的,测试了下增删改查的性能,想与memcached数据库做个对比,故研究下memcached. 那什么是memcached? mem ...

  5. java web几种开发模式(转)

    Java Web开发方案有多种可供选择,这里列举一些经典的开发模式进行横向比较,为Java Web的开发模式选择提供参考.除此之外还有好多方案(如Tapestry和Wicket)并不了解,这里就不列举 ...

  6. 微信小程序:首页设置方法(开发模式,使用模式)与其他相关设置

    小程序开发并不愉快,许多必建的文件不会自动生成,页面之间的跳转没有快捷键,开发者工具显示区域受限……如果谁有对应的解决办法求告知…… 开始的时候每次保存代码,页面都会刷洗重新渲染一次,而且自动跳回首页 ...

  7. nginx cookie 丢失问题

  8. 页面Vue

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  9. CentOS6&period;x下,tomcat - web项目部署

    1. 安装tomcat tomcat安装方法:http://www.cnblogs.com/vurtne-lu/p/6478440.html 2. 配置tomcat 修改server.xml文件 &l ...

  10. Python科学计算技巧积累四——双y轴图像绘制

    双y轴图像具有单y轴图像没有的对比效果,在MATLAB中有plotyy函数可以实现,Python的实现方式没有MATLAB那样方便,不过实现效果却也不见得差. 以往我常用的绘图命令是import ma ...