Ajax&JSON 3|学习笔记

本文涉及的产品
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云解析 DNS,旗舰版 1个月
简介: 快速学习Ajax&JSON 3

开发者学堂课程【高校精品课-上海交通大学 -互联网应用开发技术Ajax&JSON 3】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址:https://developer.aliyun.com/learning/course/76/detail/15764


Ajax&JSON 3


内容介绍:

一·举例

二·跨域

三·FetchAPI

四·Body

五·JSON


一、举例

Ajax回顾一下,增加按钮Get Books,点击后会从后台通过Ajax的方式把数据在前台呈现

图片35.png 

起初没有数据,呈现后看到类似这种法文ér和中文字符可以正常显示

图片36.png

为了实现这样的功能一些设置,后台数据本身是从后台的数据库里有一个OR映射的book

图片37.png

它在映射BOOK张表前台发请求后Servlet在后专门做这件事情--把数据组装后返回。

Servlet要做的事情是从数据库

图片38.png

在这里写reponse. set ContentType时写charset=UTF-8‘,含义要显示字符是0~255之间也就一个字节能表示的所有字符)。

实际上中文不是这样,在0~255仔看,0~127时能看到的东西,128~255看到的像乱码的东西。

汉字是约定由两个128到255之间的字符构成的,如果你不设UTF-8‘的话,那它出来就会码;如果你把它设成UTF-8‘,会把两个字符解释成一个汉字,你才能看到

除了汉字像刚才看到的法文里带有像音标符号一样的东西,它也需要这种大于0~127的字符才能正常显示,所以是用UTF-8‘。

在举,前台和后台是两个工程,http:// localhost:3000来自前端,后端是在http// localhost8080端口上因为端口号不一样所以会被认为是两个不同的圆

这种跨域访问是不允许的,在response.setHeader里Access-Control-Allow-Origin”来允许跨域访问。含义是前面字段允许跨域访问,后面允许从哪个域来的东西能访问当前的工程前端是在http:// localhost:3000端口上,允许来自这里的请求访问当前的应用

这是在解决两个问题,其他没有什么差异数据库里找出所有的book,把它组装成JSON的字符串返回。这里用的是前面导入的fast JSON库里的API

JSON库有很多种,如果选择不是这种可能不同。最终JSON是一个重文本,无论如何通过response的writer写出一个重文本是表示一个JSON对象字符串,这样前端就能拿到这个数据。

图片39.png

看到第一个说是JSON的API,第二个是说要解决乱码问题,重设置字符集写一下浏览器兼容字符串写在做序列化时要保证是以浏览器兼容方式写出的。这样,无论是哪个浏览器都可以正常看到值,像法文里中国拼音里的二声相同的符号,不能正确解释

做完这些事后能看到正确的页面。如何去改造之前大家看到的react

先来看同源的问题不是Java或者前面看到react的框架实际上,同源问题是HTTP协议规定认为跨域的资源共享是要受限的,不是直接能访问


二、跨域

域是由域名加协议或者端口号合起来定义的

图片40.png

尽管刚才两个都在本地,看起来主机名一致一个是3000端口,一个是8080端口算两个不同的域

简单来说,跨域资源共享意味着当一个网站

比如https://domain-a.com网站,通过XML.HttpRequest。去要求获取一个来自于https://domain-b.com/data.json的一个资源时,就不允许会受限,使用FetchAPI就可以解决这个问题

但它不是唯一的解决途径,比如用Axios也可以因为这种东西比较类似,用Fetch就要解决所谓的对资源共享同源策略的控制

图片41.png

如果网站本身来自domain-a.com,里面图片来自domain-a.com属于同一个源可以访问。在加载页面时,页里嵌的图片能访问有一张图片来自于domain-b.com,这时会发现来自于domain-a.com的请求,要求去取domain-b.com的资源,domain-b.com这一端就会对你的请求认为是跨域请求,会做控制

如果没有任何的特别控制,不做设置的话,它直接不允许如果在响应里加信息允许跨域控制,并且指明是domain-a.com,这时domain-a.com就可以拿到domain-b.com的补贴,这是跨域

同一个圆的前提是协议相同,端口相同,主经营相同。

所以协议http://localhost或者IPlocalhost后面要加端口,因为端口必须要相同,所以3000和8080算两个域,如果不加特殊处理直接就拿到了。

图片42.png这里例,什么算不同的

相对于http://store.company.com/dir/page.html:这里有个端口(81)是不同的,它告诉你直接拿是failure你看前面这部分是不的,所以它也failure

再看这是用S它要加保护所以这个也failure)。上面两个为什么可以?协议都http://store.company.com端口相同。

比如80没有指令,这两个可以被认为来自于同源,这三个不是同源会受到跨域控制跨域是通过Ajax的请求或把Ajax包装API来访问时会进行控制,不允许跨域共享如果你不加特别特殊的约定

在response里设置hide,通过这种方式可以加载些什么,比如用到的字体WebGL的一些文理在浏览器里想展示一些像open gl一样3D效果用别人写好的一些文理或图片video或CSS,这些来自于另外域,想把它嵌到网页里来等于是对这些东西有一个跨域的访问,看到提供资源的那端允许做这样的事情

图片43.png

做设置,让每个网站允许你做这样的事情能拿到它,对AjaxFetch控制是害怕中间有安全的漏洞,经常使用fetch来取数据,

可以用原生的X mail http request大家的X请求,也可以用框架比如iqvery。

图片44.png

fetch是把它包装好,不用去写东西这是一个比较好的方案fetch的请求到后台有相应的跨域控制可以拿到数据

 

三、FetchAPI

注意不是fetch跨域是你在后台做允许跨域,然后拿fetch才在fetch在数据时可以设置无论请求还是响应具体参数当做请求或响应发出一个请求得到响应,这就是fetchAPI

图片45.png

最简单的形式是在代码里只需要指定url是什么,对什么资源在进行访问,请求发出后,后台就会有相应的东西处理如果允许跨域,结果返回后就在response里,注意response实际上是有headr有body的东西

通过命名函数,让它返回JSON值是data拿着它就可以做你想要的事情代码加了get books,的fetch在后端发请求项目运行起来后面server监听url。

对这发请求后返回东西在后台把它组装成JSON。它的含义是要从返回的内容里把JSON拿出来作为匿名函数的返回值,得到 data的值拿出后就已经是JSON

通过set state当前的页面的state属性就变成datadata从执行画绘制Excel时作为initial data属性传进当前文件的data在最开始例是前排版数据写死的现在是空开始绘制时当然是空当点增加按钮get books后。

点击时调用get books通过fetch获取后台的数据并更新状态被绘制出来,页面就看到加载的所有数据,这是fetch最简单形式。

在fetch里除了指定url,像要到哪一个位置去访问外可以参数在大括号里第一个打星号表示默认值,没做任何的设置,没有任何参数,它默认get。第二个mode要跨域第三个是返还的结果要不要缓存,还有个默认值detauit是看你乱写也可以强制不缓存或强制缓存中

去访问时,要用户名和密码证书,默认是同源的证书是个比较复杂的问题,可以忽略。

Headers是发请内容默认),返回来的响应里才会认为这里一定有一个JSON。方法能把在response里JSON的对象取出来,下面重定向

比如用户没登录过,如果需要就可以设置,那这Fetch函数,是API的完整的一个写法,Fetch完后会返回一个值follow通过定义函数把刚才那些东西都包含在内

函数有一个参数值url会传递给Fetch,data一开始是空,data会是你发送的结果里的body,把它转成JSON以后的内容,发送response JSON。

Uploading JSON data

const data = { username: 'example' };

0

fetch('https://example.com/profile',{ method: 'POST',// or'PUT’ headers:{

'Content-Type': 'application/json'},

body: JSON.stringify(data),})

then((response)=> response.json()).then((data) => {

console.log('Success:',data)})

catch((error) => {

console.error('Error:', error);});

所有的破损方法可以按方式来写,只要传一个url、data,发送一个参数up等于42打包body里,有数据后拿到这边发Fetch出去拿到response后把包的JSON返回,直接在函数调用完后继续就得到包含JSON,直接取出来在data,后面就是你自己的逻辑。

这里比较简单,在前排的浏览器操作直接挡log把图写,如果你要做更复杂的,比如你想去解析JSON的内容,写代码Fetch的PPI,对着它有很多操作,fetch是有两个语言,大家去参考一下

Fetch API

https://developer.mozilla.org/en-US/docs/Web/API/Fetch-APl

https://www.w3cschool.cn/fetch- api/

fetch完全不是一些功能,另外刚才讲的跨域的方案前后端都要配合看,fetch刚只发一个post请求出去,当然默认get也可以,例是get。

前端要发JSON对象到后端首先请求是一个post,在body里就要把想发出的JSON放进去,data会转成JSON字符串放到body里,通过post去对着这发请求时把内容类型设成JSON,对着url发出请求,并且把JSON对象作为请求体的发夹

服务器端拿到请求后对body进行解析,能知道JSON是什么发完请求后会得到个响应认为也是个JSON),所以取出JSON对象,对JSON对象的数据去查看。能得到它console里打log

过程中任何一个地方发生问题,可能会捕获异常,发一个JSON对象给后台uplo时,去创建一个新文件发到分析端。可以用put或者post都可以,原理是改写用put,新创建post

对着avatar用put方法去发,设置一个body,关键是body里是

then((response) => responsejson()).then((result) => {

console.log('Success:', result);

.catch((error) => {

console.error('Error:', error);

拿到返回的值后,这不一定非用data,传承关系会返回一个response返回对象,付给response去执行箭头函数,把response对象上调JSON函数返回的结果作为返回值,给它返回值后就赋给dataresult,会把返回的JSON对象赋给result。

Uploading multiple files

- Files can be uploaded using an HTML<input type="file"multiple/>

input elementFormDataO and fetchO.

const formData=new FormData();

const photos =document.querySelector('input[type="file"][multiple]');

formData.append('title', 'My Vegas Vacation'); for (leti =0;i< photos.files.length;i++){

formData.append(photosphotos.files[i]);

fetch('https://example.com/posts',{

method: 'POST' body: formData})

then((response)=> responsejson())

then((result) => { console.log('Success:', result); }).catch((error) => {console.error('Error:', error);});

代码跟刚才没区别,关键上面是个body,很显然,一个文件的内容发到后台去,多个文在后面再加一个model,要在body的对象里做循环,把所有对象给它追加进来,其他的文件是一样的

比如Fetch它可以跨域,也可以是同源,如果当前工程在 localhost3000端口,其实是想去这样一张图片回来,完后知道结果会放到response,如果不是说明错误,,抛个error;如果是OK,直接返回它里面第一个二进制的对象ban banary)。

图片的内容return后附给blob获取source属于你自己的控制了解上面关键response回来后实际上是有状态的,可以去检查它是不是OK的状态

在header里放一个定义的对象请求放一些自己定义的东西,等于你定制一个镜头对象,request是未来在Fetch时当参数传给就去,request就相当于你前面写的内容(Url等等这些内容都在)。这对圆括号里所有东西。

定义好一个request后,直接在fetch里就传request调用完后返回直接拿内容做处理看到response对象,第一个是不是OK,这表示得到它的结果是不是OK,实际上是它的状态包含两部分一部分就是数字表示HP的返回码404505都属于这一类第二个是状态表示的含义,去取你的内容会得到OK在进行处理时可以针对状态去处理。

 

四、Body

body在请求里在body放东西可以是JSON,也可以是别的,比如定义表格数据,form是你在url页面里定义一个form。Form里可能有一些input内容,给它打包后变成一个formbody

因为要下订单肯定要post过去,信息过去很阻碍这两个位置例注意统一在后台解决跨域的问题,如果把这句话注销掉,你运行举例在前台页面里打开浏览器的控制台,就会发错误信息出去。

图片46.png

Fetch要受到跨域的控制,但在后台又没有任何的跨域允许操作前台就得到异常,这是后台的程序,两个工程的结构解决跨域问题

一个工程两个工程有什么问题,跨域问题肯定是存在的写对方的一个表,把这一段定义成一个常量后不断的去引用它,但是不管怎样要写绝对地址

还有一种做法是一个工程是个外部的应用,不存在跨域问题,在前端的页面里像在访问时都用相对中心,表示整个应用的根部之或是要访问的应用相对不进来

前后端分离合在一起有优点有缺点。分离的好处是接下会看到微信react nativecorolova开发移动端的应用框架)、hutter等等,用这些或用原生的androidJava去开发前端,用的后台都是同一个后端用前端后端前端后端分离可以写成这样。

当然还包括reat/uue写的页面端或没有写的页面端,前后端分离后,后端是在复用,然后放到一起不存在话语,但总是会扩充话语,不可能把所有东西打到一个工程一个优选做前后端分离来实现刚才说的一些逻辑

 

五、JSON

JSON is a text-based data exchange format derived from

JavaScript that is used in web services and other connected applications.

JSON defines only two data structures: objects and arrays

- An object is a set of name-value pairsand an array is a list of values.

-JSON defines six data types: string,number,object,array true,false and null

四种编程中,在Javajavascript里涉及到如何组装一个锥子怎么解析锥子。JSON的库非常多尤其在后台Java这端,代码也可能出现至少有两种一种是fastJSON一种是其他的

看到例,用这些库的API微有差异,前端也是一样

涉及对JSON的组装和解析,组装是有Java对象或是一组Java数据把它从Java的语言变成一个纯文本的JSON对象反过来你从JSON对象里知道描述的一些信息Java是一对,这是解析过程

对javascript也是一样,之所以这么复杂,因为JSON是文本,html 、CSS、JSON、xml是纯文本讲究格式不同。大家都说中文,你说古文,我说现代文;他说诗歌,我说元曲。

JSONJavascript定义纯文本的数据描述方式,JSON里有两种数据结构一种JSON对象是earthquake的对象标记法motation。比如Javascript对象标记法notation是用just read描述对象的方法,首先定义一种主语结构是对象第二类东西叫数组定义数组的目的只是为了让这种定义变成嵌套

A数组有个属性叫a是一种对象,对象里又是B包含bccb数据以此产生复杂的对象,层次性的像递归一样的嵌套方式定义出复杂的定义对象

对象是一组间值对其中值本身又是一组对象,构成一个数组纯文本表达的能力比较有限,值是字符串、数字不存在区别,三个一个字符区别不能再区分整数、浮点数的概念

对象是文本,定义比如大括号开始表达真假有一个特殊的空,这就是它的六种数据类型它的含义是拿文字符来描述所有的东西,一种对象在大括号里是一些名

The following example shows JSON data for a sample object

that contains name-value pairs.

{

"firstName": "Duke",

"lastName": "Java",

"age": 18;

"streetAddress": "100 Internet Dr",

"city": "JavaTown",

"state": "JA",

"postalCode": "12345",

"phoneNumbers": [

{ "Mobile":"111-111-1111" }{ "Home":"222-222-2222"}

}

名字一般来说是字符串,双引号影响值引起字符串也可以是数字,数字就没有影响。冒号是名字对的间隔,每个名字对间逗号隔开

唯一的phonenumbers是数组用方括号来描述的。

数组概念是本身是一组键值对,电话号码是一个数组包括手机和家庭电话

是一个完整的JSON对象,是JSON的描述方式。Ajax时X的含义是XML

XML HTTP Request出去,想象一下,如果用XML方式描述数据有一个叫做person的标签在最外,里面有first name简单一点,First nameduke ,lastname,Java,lastname,以此类推,phone number会有mobile、homenumber。

比较XML和JSON的描述方式可以看到,首先XML和JSON都是层次的一个结构,告诉你这些字在第一层Phone number是数据在里缩进第二层

和这道理相似,在person里其他东西都在一层里,phone numbermobile和home都在缩进去的一层,可以描述层次的一个结构通过阶段的person或大括号是完整的单一对象最大差异是XML在描述数据的冗余比较多。

比如开始标签和结束标签,但在JSON里只是name描述,按照XML格式的数据量一定比看到JSON的描述量要多,有差异

它描述相同的概念描述相同的数据,这边数据少为什么不用这边?Ajax的x是指XML。理论上在最前面画的Ajax(Ajax最初出现时的图)。

在服务器端和客户端间传递的X、JSON是原因,JSON的数据压缩到极致表示数据的语义不能再压缩,再压缩要借助一个工具,比如摩根士塔利的数据交换有一个叫fix协是拍照感

比如有交所和上交所间的交换数据交换用一种代码举例,比如用600102表示某个股票,价格是12.03,然后600510,它的价格是多少?看到它更简单,需要辅助工具是600102表示五粮液,是3/12下来后要再处理下

但用这种方式描述时看到在网络上传递的数据量已经极简,这种大规模交易的系统强调网络上传递的数据效率较好。JSON和SML的差异是传输数据量少

图片47.png

使用JSON处理看结构,首先对象放在大括号里,然后每个键值位的后面都用逗号隔开最后一个可以不写,键值对的键值号隔开,名字是字符串六种数据类型一种

如果值是一个数组,用方括号表示数组的定义比如C++或Java,数组有点差异C+++Y是同类型,至少都有一个公共的负类它们可以都转型成负类类型看待能放弃

两个名词对应间没有必然联系,可以放它的数据类型的字串数字和number)都可以

结构像SML是数形的结构,定义对象数组后的好处是对象里包含其他的对象或数组

JSON对象里from numbers包含另外一个两个JSON对象本身也是完整的对象

这是它基本语法使用它时,请求要在这使用它在request或response里设置一下request或response的内容是JSON类型,剩下是怎么去组装或生成以及解析JSON。

相关文章
|
8月前
|
JSON 前端开发 JavaScript
|
8月前
|
JSON 前端开发 JavaScript
AJAX 课程学习笔记三
AJAX 课程学习笔记三
|
3月前
|
XML JSON 数据可视化
数据集学习笔记(二): 转换不同类型的数据集用于模型训练(XML、VOC、YOLO、COCO、JSON、PNG)
本文详细介绍了不同数据集格式之间的转换方法,包括YOLO、VOC、COCO、JSON、TXT和PNG等格式,以及如何可视化验证数据集。
523 1
数据集学习笔记(二): 转换不同类型的数据集用于模型训练(XML、VOC、YOLO、COCO、JSON、PNG)
|
4月前
|
JSON 前端开发 JavaScript
JavaWeb基础8——Filter,Listener,Ajax,Axios,JSON
Filter过滤器、Listener监听器、AJAX、 同步、异步优点和使用场景、Axios异步框架、JSON、js和JSON转换、案例,Axios + JSON 品牌列表查询和添加
JavaWeb基础8——Filter,Listener,Ajax,Axios,JSON
|
5月前
|
XML JSON 前端开发
JSON与AJAX:网页交互的利器
JSON与AJAX:网页交互的利器
44 0
|
7月前
|
XML JSON 前端开发
第十一篇JavaScript JSON与AJAX
第十一篇JavaScript JSON与AJAX
39 0
|
8月前
|
XML JSON 前端开发
Ajax – JSON入门指南
Ajax – JSON入门指南
69 1
|
8月前
|
JSON 前端开发 JavaScript
jQuery ajax读取本地json文件 三级联动下拉框
jQuery ajax读取本地json文件 三级联动下拉框
|
8月前
|
XML JSON 前端开发
|
8月前
|
XML JSON 前端开发