Jquery 跨域请求JSON数据问题
制作网站时,我们有时候为了方便快捷会调用别人写好的API接口,或者是调用一些免费的API接口获得JSON数据。比如天气,农历,网站备案信息查询等。
但是,这些API接口都是别人自己服务器上的,我们要调用就得涉及到一个跨越问题。在我们请求的时候会出现错误。
下面是我AJAX请求获得的数据错误信息:"Uncaught SyntaxError: Unexpected token :"
这个是数据也请求到了,但是还是报错,那是因为
请求到数据是一个纯Json格式的话,是不能用Jsonp方式调用的,
支持Jsonp方式的url返回的一定是js脚本,一般是一句函数调用,
请注意第二种方法中报的错是callback=,=号后面的就是你得到的,
callback是客户端页面定义的函数名,JSONP方式会在返回的
Javascript代码里面调用这个函数,JSON数据是当做参数传入方法的
而不是直接返回一个json。
这个地址不支持jsonp,请求来的数据是json,浏览器要把当做Javascript
来解析,遇到 ":" 就报错了。
如果这个地址支持JSONP,应该返回Javascript代码,在代码里面调用
callback函数才对。
下面以获取API接口的服务器时间为例:
<html>
<head>
<title>获取API接口中的时间跨域获得</title>
<meta charset="UTF-8">
<!--跨域访问json数据在URL参数中加入&jsoncallback=?
type:请求类型,GET 或 POST,默认为 GET,
async:true(异步)或 false(同步),默认情况下为true,同步请求将锁住浏览器,用户其它操作必须等待请求完成才可以执行;
url:发送请求的地址(跨域请求时应为绝对地址);
dataType:指定服务器返回的数据类型;
jsonpCallback:自定义JSONP回调函数名称;
success:请求成功后回调函数;
error:请求失败时调用此方法.
-->
<script src="http://apps.bdimg.com/libs/jquery/1.7.2/jquery.min.js"></script>
<script type="text/javascript">
$.ajax({url:"http://api.k780.com:88/?app=life.time&appkey=10003&sign=b59bc3ef6191eb9f747dd4e83c99f2a4&format=json&jsoncallback=?",
tpye:"post",
async:false,
dataType:"jsonp", // 返回的数据类型,设置为JSONP方式
jsonp:"successCallback", //指定一个查询参数名称来覆盖默认的 jsonp 回调参数名 callback
jsonpCallback:"message",//自定义的jsonp回调函数名称,默认为jQuery自动生成的随机函数名,也可以写"?",jQuery会自动为你处理数据
success: function(status){
console.log(status.result.datetime_1);
$("#registerTime").text(status.result.datetime_2);
}
});
function message(date){console.log(date.result.datetime_2)}
</script>
</head>
<body>
<div id="registerTime"></div>
</body>
</html>
我请求JSON遇到的据错误信息:"Uncaught SyntaxError: Unexpected token :"
解决方案是在URL请求地址中加入一个参数&jsoncallback=?,这样就不会出现请求的数据不是JSON报错了。
自定义的jsonp回调函数jsonpCallback:"message",message函数和 success 函数都能取得到数据,就看你想用哪个方法了。
Jquery 跨域请求JSON数据问题的更多相关文章
- jquery跨域请求json数据
//服务端生成json数据json.php <?php $json=array("Volvo","BMW","SAAB"); $cb ...
- AJAX跨域请求json数据的实现方法
这篇文章介绍了AJAX跨域请求json数据的实现方法,有需要的朋友可以参考一下 我们都知道,AJAX的一大限制是不允许跨域请求. 不过通过使用JSONP来实现.JSONP是一种通过脚本标记注入的方式, ...
- Jquery跨域请求php数据(jsonp)
Jquery跨域请求php数据 我们一般用到ajax的时候是在同服务器下,一般情况下不会跨域,但有时候需要调用其他域名或ip下的数据的时候,遇到跨域请求数据的时候. 今天在工作中碰到javascrip ...
- 用 jQuery.getJSON() 跨域请求 JSON 数据
$.getJSON()可以理解为特殊形式的$.ajax(),手册里的说明好复杂,这里只记录一下用到的跨域请求. 先说在同一域名下,js发送数据到php,php返回JSON数据: $.getJSON(' ...
- 跨域请求json数据
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- jquery跨域请求数据
jquery跨域请求数据 jquery跨越请求数据.实际开发中经常会碰到两个网站数据交互问题,当向另一个站点请求数据该如何做? 实际上非常容易,请按照下面的步骤做: 第一:编写js,通过get获取远程 ...
- jquery 跨域请求数据问题
昨天参加了一个前端的面试,被问到一个跨域请求数据问题,我们之前一直用的是apicloud的api进行请求的,跨域是被apicloud封装起来的,也就没有注意跨域请求数据的问题.当被问到用jquery跨 ...
- 使用JSONP,jQuery的ajax跨域获取json数据
网上找了很多资料,写的不错,推荐下: 1.深入浅出JSONP--解决ajax跨域问题 (http://www.cnblogs.com/chopper/archive/2012/03/24/240394 ...
- jQuery使用ajax跨域请求获取数据
jQuery使用ajax跨域请求获取数据 跨域是我在日常面试中经常会问到的问题,这词在前端界出现的频率不低,主要原因还是由于安全限制(同源策略, 即JavaScript或Cookie只能访问同域下的 ...
随机推荐
- 核心动画(UIView封装动画)-转
一.UIView动画(首尾) 1.简单说明 UIKit直接将动画集成到UIView类中,当内部的一些属性发生改变时,UIView将为这些改变提供动画支持. 执行动画所需要的工作由UIView类自动完成 ...
- vue+nodejs+express+mysql 建立一个在线网盘程序
vue+nodejs+express+mysql 建立一个在线网盘程序 目录 vue+nodejs+express+mysql 建立一个在线网盘程序 第一章 开发环境准备 1.1 开发所用工具简介 1 ...
- C#提取html中的汉字
using System.Text.RegularExpressions; private string StripHT(string strHtml) //从html中提取纯文本 { Regex r ...
- swap, 不用临时变量如何做到交换a与b
固定思维通常是需要一个临时变量temp,如果没有这个临时变量呢,其实也不复杂,:) inline void swap(int &a, int &b) /*C用指针吧*/ { a = a ...
- maven-坐标与依赖
1.坐标-找到项目依赖的重要依据 <groupId>cmbc.com.cn</groupId> <artifactId>myapp</artifactId&g ...
- SpringBoot学习(1)
springboot的自动配置功能,主要流程如下: 1 启动的时候加载我们的主配置类,也就是我们的入口类:从而开启我们的自动配置配置功能,这个是通过@EnableAutoConfiguration注解 ...
- 用状态机表示SFC中的并行分支
过去一直认为,状态机表示SFC会不会是任务复杂化,这次简单实验了一下,感觉还可以.请看下面的控制. 在SFC中,A和B是一对并行分支,汇合后转移到C分支中,怎么了用状态机表示呢?这里我们在状态机里分别 ...
- sorted() ,filter() ,map()的用法
sorted() 排序函数. 语法: sorted(Iterable, key=None, reverse=False) Iterable: 可迭代对象 key: 排序规则(排序函数), 在sorte ...
- is和==,编码补充
一,is和==的区别: 1, 通过一个ID()可以查看到一个变量表示的值在内存中的地址. s = 'alex' print(id(s)) # 4326667072 s = "alex& ...
- 关于在各种int类型选择时的考虑
整数类型int在不同版本的c标准中不断丰富. 最初的K&R标准给出了int作为整数的基本类型,给出long.short.unsigned作为int的变式.在c90中又加入了signed. 在c ...