GVKun编程网logo

在 React 中如何发送 AJAX 请求呢?(react怎么发请求)

11

对于在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怎么发请求)

在 React 中如何发送 AJAX 请求呢?(react怎么发请求)

ajax - 如何发送 ajax 请求

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个请求?

ajax – 为什么React fetch()向服务器发送2个请求?

我试图通过fetch()向服务器发送一个 AJAX请求:

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再次发送请求.

enter image description here

所以这个问题似乎特定于fetch如何处理CORS.

AJAX:如何编写一个关于AJAX的Hello World?(ajax发送异步请求(四步操作))

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对象。同步与异步及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发送请求的相关知识,请在本站寻找。

本文标签: