对于在React中如何发送AJAX请求呢?感兴趣的读者,本文将会是一篇不错的选择,我们将详细介绍react怎么发请求,并为您提供关于ajax-如何发送ajax请求、ajax–为什么Reactfetch
对于在 React 中如何发送 AJAX 请求呢?感兴趣的读者,本文将会是一篇不错的选择,我们将详细介绍react怎么发请求,并为您提供关于ajax - 如何发送 ajax 请求、ajax – 为什么React fetch()向服务器发送2个请求?、AJAX:如何编写一个关于AJAX的Hello World?(ajax发送异步请求(四步操作))、ajax对象。同步与异步及ajax发送请求的有用信息。
本文目录一览:- 在 React 中如何发送 AJAX 请求呢?(react怎么发请求)
- ajax - 如何发送 ajax 请求
- ajax – 为什么React fetch()向服务器发送2个请求?
- AJAX:如何编写一个关于AJAX的Hello World?(ajax发送异步请求(四步操作))
- ajax对象。同步与异步及ajax发送请求
在 React 中如何发送 AJAX 请求呢?(react怎么发请求)
ajax - 如何发送 ajax 请求
什么是 ajax?
Asynchronous JavaScript and XML
也就是异步的 JavaScript 和 XML
ajax 的使用场景
前台获取数据
表单失焦验证
我们需要了解 post 和 get 区别
get 参数是在地址栏中,大小 2000 个字符左右
post 参数是在请求体中,网速良好,理论上是无限大的
如何构建一个完整的 ajax 请求
注意:一般情况下只能在有服务的环境下发送请求
ajax 是局部刷新
1. 创建 ajax 对象
var xhr = new XMLHttpRequest (); 新版本的浏览器
var xhr = new ActiveXObject ("Microsoft.XMLHTTP"); 老版本的 IE
兼容写法:
var xhr;
if(window.XMLHttpRequest){ //常规,如果有,直接使用
xhr = new XMLHttpRequest();
}else{ //如果没有,老版本IE
xhr = new ActiveXObject("Microsoft.XMLHTTP");
}
这里我们需要先了解状态码和回应码
xhr.status 可获取响应码
xhr.readyState 可获取状态码
xhr.responseText 可以获取响应文本
状态码:
・0: 请求未初始化
・1: 服务器连接已建立
・2: 请求已接收
・3: 请求处理中
・4: 请求已完成,且响应已就绪
响应码:
1xx 信息类
2xx 成功 200
3xx 重定向 304
4xx 客户端错误 404
5xx 服务端错误
2. 绑定监听函数
xhr.onreadystatechange = function(){
当 xhr.readyState == 4 || xhr.status == 200 时
可以获取 xhr.responseText 响应文本
然后通过响应文本来执行要求
}
3. 创建请求的消息,连接服务器 此时状态码由 0 变成了 1
xhr.open ('' 提交方式:get 或 post'','' 链接地址 '',bool 值);
boll 为 true 异步;false 同步
4. 发送请求
xhr.send(null);
如果是 post 请求,就放 post 参数,如果是 get 请求,发送 null 就行了
这样就是一个完整的 ajax 请求了
实例:
使用 ajax 发送 get 请求
html 结构如下
用户名:<input type="text" id="username">
<span id="ts"></span>
<br>
密码:<input type="text">
<button id="btn">验证用户名</button>
<script>
var username = document.getElementById("username");
var btn = document.getElementById("btn");
var ts= document.getElementById("ts");
// 点击btn发送ajax请求
btn.onclick = function(){
// 1.创建xhr
var xhr;
if(window.XMLHttpRequest){ //常规,如果有,直接使用
xhr = new XMLHttpRequest();
}else{ //如果没有,老版本IE
xhr = new ActiveXObject("Microsoft.XMLHTTP");
}
// 2.绑定监听函数
xhr.onreadystatechange = function(){
if(xhr.readyState == 4){
if(xhr.status == 200){
console.log(xhr.responseText)
if(xhr.responseText == 1){
ts.innerHTML = "该用户名已经被注册"
}else if(xhr.responseText == 0){
ts.innerHTML = "该用户名可以使用"
}
}
}
}
// 3.建立连接
xhr.open("GET","08.php?uname=" + username.value,true);
// 正则验证
// 4.发送请求
xhr.send(null)
}
</script>
然后用 PHP 模拟一个数据库
<?php
$db = [''jack'',''mack'',''mary'']; //模拟数据库
$username = $_GET[''uname'']; //表示从前台传递过来的参数
$flag = false;
foreach($db as $n){
if($n === $username){
$flag = true;
break;
}
}
if($flag){
echo "1";
}else{
echo "0";
}
?>
使用 ajax 发送 post 请求
html 代码:
学生姓名:<input type="text" id="uname"><br>
学生成绩:<input type="text" id="score"><br>
<button id="btn">注册</button>
<p id="p01"></p>
<script>
function get_id(id){
return document.getElementById(id);
}
var uname = get_id("uname");
var score = get_id("score");
var btn = get_id("btn");
var p01 = get_id("p01");
btn.onclick = function(){// 1.
var xhr;
if(window.XMLHttpRequest){ //常规,如果有,直接使用
xhr = new XMLHttpRequest();
}else{ //如果没有,老版本IE
xhr = new ActiveXObject("Microsoft.XMLHTTP");
}
// 2.
xhr.onreadystatechange = function(){
if(xhr.readyState == 4){
if (xhr.status == 200) {
p01.innerHTML = xhr.responseText;
}
}
// 3.
xhr.open(''POST'',''http://localhost:8888/0220ajax/09.php'',true);
// 3.5 在发送post请求的时候,你得告诉服务器你发送的是一个什么
xhr.setRequestHeader("Content-type","application/x-www-form-urlencoded");
// 4.发送
xhr.send(''strName='' + uname.value + ''&strScore='' + score.value);
}
}
</script>
php 代码:
<?php
$uName = $_POST[''strName''];
$uScore = $_POST[''strScore''];
//此时,php已经拿到了学生的名字和分数
// 存到数据库
$output = $uName.''-''.$uScore.''-''.uniqid();
echo $output;
?>
ajax – 为什么React fetch()向服务器发送2个请求?
fetch('/api/addUserObject',{ method: 'POST',headers: { 'Accept': 'application/json','Content-Type': 'application/json' },body: JSON.stringify({...this.state,token: this.props.userData.token,profile: this.props.currentProfile }),}).then(response => response.json()) .then(data => { console.log(data); });
当我在Chrome中打开网络日志时,我看到如下内容:
那么为什么有2个请求而不是1个?它们都在服务器端被接受.
此请求由onClick事件处理:
<div className="btn" onClick={this.handleSubmit} /></div>
问题是,这是一个POST请求,我需要在此获取数据,因此一个请求(如果它发送标头以检查交叉原点),则在服务器上启动错误.
组件代码很大,所以我将它表示为:
<StyledDiv> <FormControl>...</FormControl> <FormControl>...</FormControl> <FormControl>...</FormControl> <FormControl>...</FormControl> <div className="btn" onClick={this.handleSubmit} /></div> </StyiledDiv>
解决方法
出于安全原因,我抬头看了一下,发现了大约preflighted requests.
fetch将首先检查Web API以查看使用OPTION动词发送是否安全,当它正常时,它会使用您指定的动词POST再次发送请求.
所以这个问题似乎特定于fetch如何处理CORS.
AJAX:如何编写一个关于AJAX的Hello World?(ajax发送异步请求(四步操作))
用到的一个Servlet类:
package cn.edu.web.servlet; import java.io.IOException; import javax.servlet.servletexception; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @WebServlet("/AServlet") public class AServlet extends HttpServlet { private static final long serialVersionUID = 1L; protected void doGet(HttpServletRequest request,HttpServletResponse response) throws servletexception,IOException { //设置编码 response.setContentType("text/html;charset=utf-8"); //在控制台输出Hello AJAX System.out.println("Hello AJAX"); //在浏览器里面点击按钮局部刷新后输出 response.getWriter().print("Hello AJAX<br />"+"服务器响应了页面的局部刷新,这就是AJAX"); } }
ajax的jsp代码:
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <Meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <title>AJAX的Hello World</title> <script type="text/javascript"> //创建异步对象的函数 function createXMLHttpRequest(){ try { return new XMLHttpRequest();//大多数浏览器 } catch (e) { try { return ActiveXObject("Msxml2.XMLHTTP");//IE6.0 } catch (e) { try { return ActiveXObject("Micrsoft.XMLHTTP");//IE5.5 } catch (e) { alert("哥们儿,你用的是什么浏览器啊?");//太古老了 throw e; } } } } window.onload = function(){//文档加载完毕后执行 var btn = document.getElementById("btn"); btn.onclick = function(){//给按钮的点击事件注册监听器 /* AJAX四步操作,得到服务器的响应 把响应结果显示到h1元素中 */ //1.得到异步对象 var xmlHttp = createXMLHttpRequest();//调用创建XMLhttp的函数 /* 2.打开与服务器的连接 *指定请求方式 *指定请求的URL *指定是否为异步请求 //注意:到客户端时已经没有了jsp,jstl等标签,服务器处理为了html */ //服务器吧jsp变成了html发送过来了 xmlHttp.open("GET","<c:url value='/AServlet' />",true); //3.发送请求 xmlHttp.send(null);//GET请求没有请求体,但也要给出null,不然FireFox可能不能发送 //4.给异步对象的onreadystatechange事件注册监听器 xmlHttp.onreadystatechange = function(){//当xmlHttp的状态发生变化时执行 //双重判断:xmlHttp的状态为4(服务器响应结束),以及服务器状态码为200(服务器响应成功) if(xmlHttp.readyState==4&&xmlHttp.status==200){ //获取服务器响应内容 var text = xmlHttp.responseText; //获取h1元素 var h1 = document.getElementById("h1"); h1.innerHTML = text; } } } } </script> </head> <body> <button id="btn">点击这里</button> <h1 id="h1"></h1> </body> </html>
浏览器的效果如下(点击这里之后)
ajax发送异步请求(四步操作) 1. 第一步(得到XMLHttpRequest) * ajax其实只需要学习一个对象:XMLHttpRequest,如果掌握了它,就掌握了ajax!!! * 得到XMLHttpRequest > 大多数浏览器都支持:var xmlHttp = new XMLHttpRequest(); > IE6.0:var xmlHttp = new ActiveXObject("Msxml2.XMLHTTP"); > IE5.5以更早版本的IE:var xmlHttp = new ActiveXObject("Microsoft.XMLHTTP"); * 编写创建XMLHttpRequest对象的函数 function createXMLHttpRequest() { try { return new XMLHttpRequest(); } catch(e) { try { return new ActiveXObject("Msxml2.XMLHTTP"); } catch(e) { try { return new ActiveXObject("Microsoft.XMLHTTP"); } catch(e) { alert("哥们儿,你用的是什么浏览器啊?"); throw e; } } } } 2. 第二步(打开与服务器的连接) * xmlHttp.open():用来打开与服务器的连接,它需要三个参数: > 请求方式:可以是GET或POST > 请求的URL:指定服务器端资源,例如;/day23_1/AServlet > 请求是否为异步:如果为true表示发送异步请求,否则同步请求! * xmlHttp.open("GET","/day23_1/AServlet",true); 3. 第三步(发送请求) * xmlHttp.send(null):如果不给可能会造成部份浏览器无法发送! > 参数:就是请求体内容!如果是GET请求,必须给出null。 4. 第四步() * 在xmlHttp对象的一个事件上注册监听器:onreadystatechange * xmlHttp对象一共有5个状态: > 0状态:刚创建,还没有调用open()方法; > 1状态:请求开始:调用了open()方法,但还没有调用send()方法 > 2状态:调用完了send()方法了; > 3状态:服务器已经开始响应,但不表示响应结束了! > 4状态:服务器响应结束!(通常我们只关心这个状态!!!) * 得到xmlHttp对象的状态: > var state = xmlHttp.readyState;//可能是0、1、2、3、4 * 得到服务器响应的状态码 > var status = xmlHttp.status;//例如为200、404、500 * 得到服务器响应的内容1 > var content = xmlHttp.responseText;//得到服务器的响应的文本格式的内容 > var content = xmlHttp.responseXML;//得到服务器的响应的xml响应的内容,它是Document对象了! xmlHttp.onreadystatechange = function() {//xmlHttp的5种状态都会调用本方法 if(xmlHttp.readyState == 4 && xmlHttp.status == 200) {//双重判断:判断是否为4状态,而且还要判断是否为200 // 获取服务器的响应内容 var text = xmlHttp.responseText; } };
ajax对象。同步与异步及ajax发送请求
ajax对象的属性、方法
属性
-
readyState: Ajax状态码 * 0:表示对象已建立,但未初始化,只是 new 成功获取了对象,但是未调用open方法 1:表示对象已初始化,但未发送,调用了open方法,但是未调用send方法 2:已调用send方法进行请求 3:正在接收数据(接收到一部分),客户端已经接收到了一部分返回的数据 4:接收完成,客户端已经接收到了所有数据 *
-
status :http响应状态码 200代表成功获取服务器端数据 404未找到页面等等……
-
statusText :http响应状态文本
-
responseText:如果服务器端返回字符串,使用responseText进行接收
-
responseXML :如果服务器端返回XML数据,使用responseXML进行接收
-
onreadystatechange:当 readyState 状态码发生改变时所触发的回调函数
方法
-
open(method,url,[aycs]):初始化Ajax对象 (打开) method:http请求方式,get/post url:请求的服务器地址 aycs:同步与异步
-
setRequestHeader(header,value):设置请求头信息 header :请求头名称 value :请求头的值
-
xhr.getAllResponseHeaders() 获取全部响应头信息
-
xhr.getResponseHeader(''key'') 获取指定头信息
-
send([content]) :发送Ajax请求 content : 如果是get请求时,此参数为null;
如果是post请求时,此参数就是要传递的数据
同步与异步
举个例子:
小明去餐馆排队点餐,前台服务员将小明的菜单告诉厨师进行制作,此时小明后面排队的人就一直等着, 直到厨师制作完成,把饭菜送到小明手里后离开,后面的人才能继续点餐;这就是同步处理;
但是,如果前台服务员将小明的菜单告诉厨师后,服务员发给小明一个号牌去旁边等待,后面的人继续点餐, 厨师将小明的饭菜做好后,随时呼唤小明就餐;这就是异步处理。
ajax发送请求默认情况下就是异步处理过程,每执行一步的时候不会考虑上一步是否执行完,上一步只要开始执行了,即服务器接收到了信息,name下一步就是开始执行,不过可以通过设置open()方法的第三个参数来设置是同步还是异步;
ajax发送请求
根据输入框中输入的内容,判断输入的内容是否可用(admin不可用,其他可用)
html文件:
服务器js文件:
通过http://127.0.0.1:8888/访问html 页面,当输入框失去焦点时,触发事件,向服务器发送请求,判断内容是否可用。
关于在 React 中如何发送 AJAX 请求呢?和react怎么发请求的介绍现已完结,谢谢您的耐心阅读,如果想了解更多关于ajax - 如何发送 ajax 请求、ajax – 为什么React fetch()向服务器发送2个请求?、AJAX:如何编写一个关于AJAX的Hello World?(ajax发送异步请求(四步操作))、ajax对象。同步与异步及ajax发送请求的相关知识,请在本站寻找。
本文标签: