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只能访问同域下的 ...
随机推荐
- zTree的核心处理逻辑
zTree 是一个前端树形结构的插件. 使用起来很简单,我们重点关注一下插件的核心代码. 首先,zTree需要如下的数据结构: let areaData = [ { "id": & ...
- C++创建People类--练习
题目描述 /*设计一个用于人事管理的People(人员)类.*/ /* 考虑到通用性,这里只抽象所有类型人员都具有的属性: number(编号).sex(性别).birthday(出生日期).id(身 ...
- Java Iterator ListIterator 理解
一. Iterator 常用操作 next hasNext remove 先上源码:JDK8 简化版本,用于说明问题 private class Itr implements Iterator< ...
- Python基础——字典和有序字典
字典 说明: 在 Python 中, 字典 是一系列 键 — 值对 .每个键都与一个值相关联,你可以使用键来访问与之相关联的值.与键相关联的值可以是数字.字符串.列表乃至字典.事实上,可将任何 Pyt ...
- js根据年份获取某月份有几天
function getNum(year, month) { var temp; month = parseInt(month, 10); temp = new Date(year, month, 0 ...
- Git----将本地代码推送到远程仓库
1.初始化本地 git init 2.添加文件 -A等于 -. 和-a的集合 git add -A 3.提交 git commit -m 'add' 4.关联到远程库 git remote add o ...
- php 无限参数方法
在很多项目开发中经常会用到共用方法但是参数不固定,每个参数都创建一遍阅读性不好,后期维护也麻烦,PHP有获取传入参数的方法,记录参考一下.这里有两个方法 <?php 方法一: #不指定参数个数方 ...
- python中一些内置函数实例
lambda表达式 简单函数可用lambda表达式 1. def f1() return(123) r1=f1() print() 2. f2=lambda:123 r2=f2() print() 以 ...
- 什么是高防服务器?如何搭建DDOS流量攻击防护系统
关于高防服务器的使用以及需求,从以往的联众棋牌到目前发展迅猛的手机APP棋牌,越来越多的游戏行业都在使用高防服务器系统,从2018年1月到11月,国内棋牌运营公司发展到了几百家. 棋牌的玩法模式从之前 ...
- 对bluebird的理解
前言 Promise:把原来的回调写法分离出来,在异步操作执行完后,用链式调用的方式执行回调函数. 在公众号的开发里面用的const Promise = require('bluebird');con ...