✿✿✿JavaScript --- Ajax异步请求与JSONP 跨域请求

news2024/12/24 8:11:31

目    录

一、原生的Ajax请求

1.异步和同步

2.Ajax介绍

3.实现方式

(1)原生的JS实现方式(了解)

(2)原生AJax发送Post请求,并携带请求参数

二、JQuery封装后的Ajax

1.JQeury实现方式

2. $.get():发送get请求

3.$.post():发送post请求

4.直接请求JSON数据,post,get请求都可以 $.getJSON( url,[data], [callback] ) 

三、 JSONP 跨域请求

1.什么是跨域?

2.JS原生方式的JSONP跨域

2.JQuery 封装过后的JSONP请求

3.$.getJSON() 方法简化 jsonp 请求

四、 CORS 跨域

获取不到数据的原因:

五、Java中JSON字符串和Java对象的互相转换

2.Java对象转换JSON

(1)使用步骤

(2)转换方法:writeValue(参数1,obj)   或    writeValueAsString(obj):将对象转为json字符串

(3)注解

3. JSON转为Java对象

(2)转换方法:readValue(json字符串数据,Class)


一、原生的Ajax请求

1.异步和同步

异步和同步都是发生在客户端和服务器端相互通信的基础上。

  • 同步:客户端必须等待服务器端的响应。在等待的期间客户端不能做其他操作。
  • 异步:客户端不需要等待服务器端的响应。在服务器处理请求的过程中,客户端可以进行其他的操作。

2.Ajax介绍

        Ajax(ASynchronous JavaScript And XML)是异步的JavaScript 和 XML的意思。Ajax 是一种在无需重新加载整个网页的情况下,能够更新部分网页的技术。通过在后台与服务器进行少量数据交换,Ajax 可以使网页实现异步更新。这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新。传统的网页(不使用 Ajax)如果需要更新内容,必须重载整个网页页面。

3.实现方式

(1)原生的JS实现方式(了解)

                //1.创建核心对象
	            var xmlhttp;
	                xmlhttp=new XMLHttpRequest();
	          
	            //2. 建立连接
	            /*
	                参数:
	                    1. 请求方式:GET、POST
	                        * get方式,请求参数在URL后边拼接。send方法为空参
	                        * post方式,请求参数在send方法中定义
	                    2. 请求的URL:
	                    3. 同步或异步请求:true(异步)或 false(同步)
	             */
	            xmlhttp.open("GET","ajaxServlet?username=tom",true);

	            //3.发送请求
	            xmlhttp.send();

	            //4.接受并处理来自服务器的响应结果
	            //获取方式 :xmlhttp.responseText
	            //什么时候获取?当服务器响应成功后再获取
	            //当xmlhttp对象的就绪状态改变时,触发事件onreadystatechange。
	            xmlhttp.onreadystatechange=function()
	            {
	                //判断readyState就绪状态是否为4,判断status响应状态码是否为200
	                if (xmlhttp.readyState==4 && xmlhttp.status==200)
	                {
	                   //获取服务器的响应结果
	                    var responseText = xmlhttp.responseText;
	                    alert(responseText);
	                }
	            }

(2)原生AJax发送Post请求,并携带请求参数

设置请求头
xmlHttp.setRequestHeader("Content-type","application/x-www-form-urlencodee");
发送是使用send()方法,把请求参数放到send方法中
xmlHttp.send('name=value&age=12');             //请求体body,用&分隔

<script>
    function inser(){
        var uname = document.getElementById("uname").value;
        var contents = document.getElementById("contents").value;
        //创建Ajax对象
        var ajax = new XMLHttpRequest();
        //连接服务器
        ajax.open('post','inser.php',true);
        //设置请求头信息
        ajax.setRequestHeader('content-type','application/x-www-form-uslencoded');
        //发送请求
        ajax.send('name='+uname+"&content="+contents);
        //监听事件:onreadystatechange去监听ajax.readyState什么时候等于4
        ajax.oneadystatechange = function(){
            if(ajax.readyState == 4 && ajax.status == 200){
                var c=ajax.responseText;
                    if(c == '1'){
                    alert("添加成功");
                    }else{
                    alert("添加失败");
                    }
            }
       }

}
</script>

二、JQuery封装后的Ajax

1.JQeury实现方式

$.ajax()  --->  语法:$.ajax({键值对});

$.ajax({
    url:"ajaxServlet1111",                //请求路径
    type:"POST",                          //请求方式
    data:{"username":"jack","age":23},    //请求参数
    success:function(data){
        alert(data);                      //响应成功后的回调函数
    },
    error:function(data){
        alert("出错啦...");                //表示如果请求响应出现错误,会执行的回调函数         
    },
    dataType:"json"                       //设置接受到的响应数据的格式
});

2. $.get():发送get请求

  • 语法:$.get( url, [data],[callback], [type] )
  • 参数:url--->请求路径 / data--->请求参数 / callback--->回调函数 / type--->响应结果的类型。

3.$.post():发送post请求

  • 语法:$.post( url,[data],[callback], [type] )
  • 参数:url--->请求路径 / data--->请求参数 / callback--->回调函数 / type--->响应结果的类型。 

4.直接请求JSON数据,post,get请求都可以 $.getJSON( url,[data], [callback] ) 

参数:url--->请求路径 / data--->请求参数 / callback--->回调函数

$.getJSON("test.js", { name: "John", time: "2pm" }, function(json){
  					alert("JSON Data: " + json.users[3].name);
		});		

三、 JSONP 跨域请求

1.什么是跨域?

        现代浏览器为了安全,做了一个同源限制。跨域指的是A网站内部向B网站发送一个AJAX请求。由于浏览器有同源策略的限制,默认情况下,是不允许 A网站向 B 网站请求数据资源的。具体来说,凡是发送请求中,协议、主机名、端口号有一个不同,即为跨域请求。为了能利用访问其他网站的资源,就可以利用jsonp以及CORS来跨域。

2.JS原生方式的JSONP跨域

JSONP 跨域的原理,就是利用某些标签,跨域请求时,不受同源策略的限制 比如 script、img等。JSONP 跨域跟XMLHttpRequest 异步请求对象没关系并且JSONP只支持GET请求 。

<script type="text/javascript">
			//获取后台响应数据的回调函数名
			function getJsonData(res){
				alert(res.catName);
			}
	</script>
		<script src="https://tcc.taobao.com/cc/json/mobile_tel_segment.htm?tel=13259141515&callback=getJsonData"></script>
//注意:回调函数的script标签定义在 请求接口的script标签的前面						
/* 
		说明:
		callback=getJsonData  告诉服务器,前台的一个接受后台响应数据时的一个回调函数名
		
		{"username":"zhangsan","password":"******"}
		响应: "getJsData({"username":"zhangsan","password":"******"})"
		后台JSON方式响应的数据 把JSON数据塞入回调函数中 统一返回
		getJsonData({
		    mts:'1325914',
		    province:'陕西',
		    catName:'中国联通',
		    telString:'13259141515',
			areaVid:'30503',
			ispVid:'137815084',
			carrier:'陕西联通'
		})
*/

2.JQuery 封装过后的JSONP请求

$ajax({
    type:"GET",
    url:"https://tcc.taobao.com/cc/json/mobile_tel_segment.html",
    data:{tel:"13259141515"},
    jsonp:"callback",                //jsonp请求,回调函数名Jquery会自动生成
    success:function(res){
        alert(res.catName);
    },
    dataType:"json"
});

3.$.getJSON() 方法简化 jsonp 请求

$.getJSON("https://tcc.taobao.com/cc/json/mobile_tel_segment.htm?tel=13259141515&callback=?",function(res){
				alert(res.catName);
			});
  • Jquery还有简化的JSONP请求
  • getJSON() 他可以判断你是跨域请求,还是非跨域请求,都能处理
  • callback=? 回调函数名给个? 让Jquery随机生成一个回调函数名    

四、 CORS 跨域

浏览器在检测到你发送的 ajax 请求不是同源请求时,会自动在 http 的头部添加一个 origin 字段.请求头:Origin:http://localhost:8080

获取不到数据的原因:

  • 这是一次跨域请求.
  • 请求确实发送到服务器了.
  • 服务器也把数据返回到了浏览器.
  • 但是服务器返回的响应头里,没有告诉浏览器哪个域名可以访问这些数据(也就是没有设置 Access-Control-Allow-Origin)
  • 于是浏览器就把这个数据丢弃了.我们也就无法获取到这个数据.

这个时候,只需要后台在相应头里加上一个 Access-Control-Allow-Origin:* 即可完成跨域数据获取。

//后台Java代码
response.setHeader("Access-Control-Allow-Origin", "*");

五、Java中JSON字符串和Java对象的互相转换

1.常见的JSON解析器有:Jsonlib,Gson,fastjson,jackson

2.Java对象转换JSON

(1)使用步骤

  • 导入jackson的相关jar包
  • 创建Jackson核心对象 ObjectMapper
  • 调用ObjectMapper的相关方法进行转换

(2)转换方法:writeValue(参数1,obj)   或    writeValueAsString(obj):将对象转为json字符串

参数1:

  • File:将obj对象转换为JSON字符串,并保存到指定的文件中
  • Writer:将obj对象转换为JSON字符串,并将json数据填充到字符输出流中
  • OutputStream:将obj对象转换为JSON字符串,并将json数据填充到字节输出流中

(3)注解

  • @JsonIgnore:排除某个属性不要转换成JSON,给类的属性上加上这个注解。
  • @JsonFormat:属性值得格式化日期字符串,取的是默认时区的时间
  • @JsonFormat(pattern = "yyyy-MM-dd")
    private Date birthday;
    						   
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")//给默认时区加上8个小时
  • @JsonProperty("username")  :指定转换json字符串是的别名
  • @JsonProperty("username")
    private String name;
  •  @JsonInclude(JsonInclude.Include.NON_NULL) :如果该字段的值是null,就不会转换成JSON
  • @JsonInclude(JsonInclude.Include.NON_NULL) 
    private Long num; //null
  • @JsonInclude(JsonInclude.Include.NON_EMPTY):该集合长度为0或为null,就不会转换成JSON
  • @JsonInclude(JsonInclude.Include.NON_EMPTY) 
    private List<String> list;

3. JSON转为Java对象

(1)使用步骤

  • 导入jackson的相关jar包
  • 创建Jackson核心对象 ObjectMapper
  • 调用ObjectMapper的相关方法进行转换

(2)转换方法:readValue(json字符串数据,Class)


(小编也在努力学习更多哟!以后再慢慢分享的啦!) 

希望对友友们有所帮助!!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/148551.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

存储随笔2022年度最受欢迎文章榜单TOP15

回首2022感谢各位粉丝朋友的一路支持与陪伴存储随笔为您献上2022年度最受欢迎文章榜单TOP152023&#xff0c;一起向未来&#xff01;TOP1&#xff1a;固态硬盘SSD入门级白皮书主要从固态硬盘的原理/接口形态/寿命/使用场景/等不同角度&#xff0c;来对比不同的人群需要什么样的…

[linux]vim编辑器

&#x1f4df;作者主页&#xff1a;慢热的陕西人 &#x1f334;专栏链接&#xff1a;Linux &#x1f4e3;欢迎各位大佬&#x1f44d;点赞&#x1f525;关注&#x1f693;收藏&#xff0c;&#x1f349;留言 本博客主要讲解vim的使用和一些vim的常用操作&#xff0c;以及如何解决…

Flow 转 LiveData 后数据丢了,肿么回事?

翻译自&#xff1a; https://arkadiuszchmura.com/posts/be-careful-when-converting-flow-to-livedata/ 前言 最近我在负责一段代码库&#xff0c;需要在使用 Flow 的 Data 层和仍然依赖 LiveData 暴露 State 数据的 UI 层之间实现桥接。好在 androidx.lifecycle 框架已经提供…

C语言-指针进阶-函数指针数组应用-计算器(9.2)

目录 1. 函数指针 2. 函数指针数组 2.1函数指针数组的定义 2.2函数指针数组应用 3. 指向函数指针数组的指针 思维导图&#xff1a; 1. 函数指针 直接上代码&#xff1a; #include <stdio.h>void test() {printf("hehe\n"); }int main() {printf("%…

【Java】数组的复制、反转、查找、排序

数组的复制、反转、查找、排序 复制 其中最关键的一点是搞清楚为什么数组复制和基本数据类型复制不同&#xff0c;是什么导致了这样的不同&#xff1f; 先来看例子 package com.atguigu.java;public class ArrayTest3 {public static void main(String[] args) {//新建arr数…

【Java数据结构与算法】Day2-高级排序(希尔、归并、快速、计数)

✅作者简介&#xff1a;热爱Java后端开发的一名学习者&#xff0c;大家可以跟我一起讨论各种问题喔。 &#x1f34e;个人主页&#xff1a;Hhzzy99 &#x1f34a;个人信条&#xff1a;坚持就是胜利&#xff01; &#x1f49e;当前专栏&#xff1a;【Java数据结构与算法】 &#…

实验七:555定时器及其应用

答疑解惑用555定时器组成的单稳态电路中&#xff0c;若触发脉冲宽度大于单稳态持续时间&#xff0c;电路能否正常工作&#xff1f;如果不能&#xff0c;则电路应做如何修改&#xff1f;答:若触发脉冲宽度大于单稳态持续时间后&#xff0c;输出脉冲宽度将等于触发脉冲的低电平持…

【精】EditorConfig 小老鼠 跨编辑器 | IDE 保持一致的编码风格

【精】EditorConfig 小老鼠 跨编辑器 | IDE 保持一致的编码风格 &#x1f345;因发布平台差异导致阅读体验不同&#xff0c;将本文原编写地址贴出&#x1f339;&#xff1a;《【精】EditorConfig 小老鼠 跨编辑器 | IDE 保持一致的编码风格》 文章目录【精】EditorConfig 小老鼠…

实时数仓方案

2、实时数仓方案 2.1、为何需要实时数仓架构 随着数据量的增大&#xff0c;传统数据的方案在时效性上和数据维护上变得越来越困难。实时数仓架构应运而生。 具体方案落地上实时数仓有很多方案可以选择&#xff0c;不同的业务和应用场景到底应该选择哪种技术方案&#xff1f;…

React18新特性

React 团队在 2022 年 3 月 29 日正式发布了 React 的第 18 个版本。 在这篇文章里简单介绍 React 18 的新特性&#xff0c;React Concurrent Mode&#xff08;并发模式&#xff09;的实现&#xff0c;以及简要的升级指南。 New Features Automatic Batching 早在 React 18 之…

011-Ensp-实验-配置ACL

实验要求 1.通过ACL 使PC1无法访问PC3 实验结构 实验步骤 基础环境配置: PC间互通 1. PC1 2 3 配置IP网关 2. LSW2 创建三个vlan &#xff0c;g0/0/2 g0/0/3 g/0/04 类型配置为Access 分别加入三个vlan g0/0/1 配置为trunk 并允许所有vlan通过 3. LSW1 g0/0/1 配置trunk …

vector底层实现及深层次拷贝问题

目录 大框架 接口实现 深层次拷贝问题&#xff08;两次深拷贝&#xff09; 大框架 为了与库里实现的更接近一些&#xff0c;先来看一下STL中是如何实现vector的&#xff08;这里不是PJ版&#xff0c;PJ版稍微晦涩一点不容易理解&#xff0c;这里采用Linux下g的版本&#xf…

VectorNet: Encoding HD Maps and Agent Dynamics from Vectorized Representation

Paper name VectorNet: Encoding HD Maps and Agent Dynamics from Vectorized Representation Paper Reading Note URL: https://arxiv.org/pdf/2005.04259.pdf TL;DR waymo 出品的 CVPR2020 论文 &#xff0c;关注在自动驾驶场景&#xff08;复杂多智能体系统&#xff0…

【算法自由之路】快慢指针在链表中的妙用(下篇)

【算法自由之路】快慢指针在链表中的妙用&#xff08;下篇&#xff09; 继上篇之后&#xff0c;链表这块还有两个相对较难的问题我们继续举例。 问题 1 给定具有 random 指针的 next 方向无环单链表&#xff0c;复制该链表 单听这个问题可能有点懵&#xff0c;这个链表结构我…

PCB封装创建(CHIP类)

PCB封装要有以下内容 PCB焊盘管脚序号丝印阻焊1脚标识目录 CHIP类&#xff08;电阻 电容 电感 三极管&#xff09; 0805C 0805R 0805L SOT-23 1.CHIP类&#xff08;电阻 电容 电感 三极管&#xff09; 1.新建一个PCB元件库 打开PCB Library 以下以0805为例。 创建080…

“CAcModuleResourceOverride”: 未声明的标识符

本文迁移自本人网易博客&#xff0c;写于2011年10月8日首先是运行时提示&#xff1a;试图执行系统不支持的操作。添加CAcModuleResourceOverride resourceOverride; 后&#xff0c;编译出现如下错误&#xff1a;error C2065: “CAcModuleResourceOverride”: 未声明的标识符 添…

scikit-learn 普通最小二乘法

scikit-learn 普通最小二乘法什么是普通最小二乘法&#xff1f;参考文献什么是普通最小二乘法&#xff1f; 线性回归模型的数学表达式如下&#xff1a; y^(w,x)w0w1x1…wpx1\hat{y}(w, x)w_{0}w_{1} x_{1}\ldotsw_{p} x_{1}y^​(w,x)w0​w1​x1​…wp​x1​ 其中 w0,w1,...,w…

Java--集合

1、集合框架 集合框架被设计成要满足以下几个目标。 该框架必须是高性能的。基本集合&#xff08;动态数组&#xff0c;链表&#xff0c;树&#xff0c;哈希表&#xff09;的实现也必须是高效的。 该框架允许不同类型的集合&#xff0c;以类似的方式工作&#xff0c;具有高度的…

【自用】高频电子线路复习(更新中)

疫情原因 没有考试就放假回家了 返校后将先进行死亡考试周 七天考完九门 回校再进行极限复习只能说可以通过 而不利于绩点的提升 所以要从现在开始抽取一些时间进行学习 第七章 频率变换方法与电路分析 7.1 非线性电路包括 发送端的高频振荡器、倍频器、谐振功率放大器和调…

【ROS自定义文件】自定义头文件及源文件的调用

本文记录ROS中的自定义文件的调用&#xff0c;主要包括自定义头文件和源文件的使用。 1 自定义C头文件的调用 注意这个文件目录的结构&#xff0c;尤其是 hello.h 这个自定义的头文件在 include/plumbing_head 文件夹之下&#xff0c;这个会直接影响后续头文件的引用。 hello.…