Go最新AJAX请求(GET、POST、响应JSON)_ajax post json,2024年阿里Golang岗面试必问

img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Go语言开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取

        border: solid 1px #90b;
    }
</style>
点击发送请求
```

在浏览器中打开后如下,

再写一个服务端js(server.js),/server是路径

//1、引入express
const express = require('express');

//2、创建应用对象
const app = express();

//3、创建路由规则(request是对请求报文的封装,response是对响应报文的封装)
app.get('/server',(request,response)=>{
    //设置响应头,设置允许跨域
    response.setHeader('Access-Control-Allow-Origin','*');
    //设置响应体
    response.send('HELLO AJAX');
});

//4、监听端口启动服务
app.listen(8000,()=>{
    console.log("服务已启动,8000端口监听中... ...");
})

输入http://127.0.0.1:8000/server访问请求后响应得到预置的响应体。

修改html文件,拿到button元素和result结果,button绑定请求事件后响应成功设置result文本信息。

<!-- !直接出模版 -->
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>AJAX GET 请求</title>
    <style>
        #result{
            width: 200px;
            height: 100px;
            border: solid 1px #90b;
        }
    </style>
</head>
<body>
    <button>点击发送请求</button>
    <div id="result"></div>
    <script>
        //获取button元素
        const btn = document.getElementsByTagName('button')[0];
        const result = document.getElementById("result");
        //绑定事件
        btn.onclick = function(){
            //1、创建对象
            const xhr = new XMLHttpRequest();
            //2、初始化,设置请求方法和url
            xhr.open('GET','http://127.0.0.1:8000/server');
            //3、发送
            xhr.send();
            //4、事件绑定   处理服务端返回的结果    readystate是xhr对象中的属性,表示状态 
            xhr.onreadystatechange = function(){
                //判断readystate状态0——(未初始化)还没有调用send方法;1——(载入)已经调用send方法,正在发送请求;2——(载入完成)send方法执行完成,已经接收到全部响应内容;3——(交互)正在解析响应内容;4——(完成)响应内容解析完成,可以在客户端调用
                if(xhr.readyState === 4){
                    //判断响应状态码 200 404 403 401 500
                    //2xx成功
                    if(xhr.status >= 200 && xhr.status<300){
                        //处理结果  行 头 空行 体
                        // 1、响应行
                        // console.log(xhr.status);    //状态码
                        // console.log(xhr.statusText);    //状态字符串
                        // console.log(xhr.getAllResponseHeaders()); //所有响应头
                        // console.log(xhr.response);  //响应体
                        
                        // //设置result的文本
                        result.innerHTML = xhr.response;
                    }else{

                    }
                }
            }
        }
    </script>
</body>
</html>

最后得到的效果如下,如果需要在请求里加上参数使用?parameter=100这样的方式多个参数用&,

POST请求与GET请求类似,虽然GET请求更简单更快,但是下面几种情况应该使用POST请求:

  1. 无法使用缓存文件(更新服务器上的文件或数据库)。
  2. 向服务器发送大量数据(POST 没有数据量限制)。
  3. 发送包含未知字符的用户输入时,POST 比 GET 更稳定也更可靠。

下面看一下JSON的案例,按下键盘任意键触发事件响应服务器的JSON数据,

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>JSON响应</title>
    <style>
        #result{
            width: 200px;
            height: 100px;
            border: solid 1px #89b;
        }
    </style>
</head>
<body>
    <div id = 'result'></div>
    <script>
        const result = document.getElementById('result');
        //绑定键盘按下事件
        window.onkeydown = function(){
            const xhr = new XMLHttpRequest();
            //设置响应体数据的类型
            xhr.responseType = 'json';

            xhr.open('GET','http://127.0.0.1:8000/json-server');
            xhr.send();
            xhr.onreadystatechange = function(){
                if(xhr.readyState === 4){
                    if(xhr.status >= 200 && xhr.status < 300){
                        // console.log(xhr.response)
                        // result.innerHTML = xhr.response;
                        //1、手动将数据转换一下
                        // let data = JSON.parse(xhr.response);
                        // console.log(data);
                        // result.innerHTML = data.name;
                        //2、自动转换,上面设置响应数据类型
                        console.log(xhr.response);
                        result.innerHTML = xhr.response.name;
                    }
                }
            }
        }
    </script>
</body>
</html>

上面是响应JSON的Html文件,下面是server.js中的代码,响应一个数据集合

app.get('/json-server',(request,response)=>{
    //设置响应头,设置允许跨域
    response.setHeader('Access-Control-Allow-Origin','*');
    //响应一个数据
    const data = {
        name : 'my test data',
        age : 23
    };
    let str = JSON.stringify(data);
    response.send(str)
});

按下按键响应结果如下,

Nodemon

官网:https://www.npmjs.com/package/nodemon

nodemon是一种工具,可以自动检测到目录中的文件更改时通过重新启动应用程序来调试基于node.js的应用程序,毕竟上面的调试过程每次修改都需要重新重启。

按照官网安装后,可以输入nodemon server.js即可启动,如下图

后面进行修改js后,保存就会restarting。简化我们的调试。

jQuery

jQuery 是一个“写的更少,但做的更多”的轻量级 JavaScript 库。引入jQuery库可以在https://www.bootcdn.cn/中搜索该库的url进行引用,不过实际开发过程中需要考虑自己所引用的依赖是否稳定。

jQuery具体学习可以参考w3School官网上的:https://www.w3school.com.cn/jquery/jquery_animate.asp,去实现各元素实例的操作。

下面给出一个使用jQuery发送Ajax请求的例子:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>JQuery 发送 AJAX请求</title>
    <!-- html link 必须要有,告诉浏览器引入了一个样式,type="text/css"表示 类型=层次/样式-->
    <link crossorigin="anonymous" href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/5.0.1/css/bootstrap-grid.css">

    <!-- 加上crossorigin="anonymous" 跨源属性设置 匿名——向后面这个发起请求时将不会携带当前域名下的cookies -->
    <script crossorigin="anonymous" src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.0/jquery.js"></script>
</head>
<body>
    <div class="container">
        <h2 class="page-header">JQuery 发送AJAX请求</h2>
        <button class="btn btn-primary">GET</button>
        <button class="btn btn-danger">POST</button>
        <button class="btn btn-info">通用型方法AJAX</button>
    </div>
    <script>
        $('button').eq(0).click(function(){
            //第一个参数是请求URL,第二个参数是一个对象,第三个参数是一个回调函数
            $.get('http://127.0.0.1:8000/jQuery-server',{a:100,b:200}, function(data){
                console.log(data)
            },'json')   //后面加json,表明请求返回的响应体是一个json对象
        })
        $('button').eq(1).click(function(){
            $.post('http://127.0.0.1:8000/jQuery-server',{a:100,b:200}, function(data){
                console.log(data)
            })
        })
        $('button').eq(2).click(function(){
            $.ajax({
                //url,请求delay方法会因为请求超时而调用失败回调函数
                url: 'http://127.0.0.1:8000/jQuery-server',
                //参数
                data: {a:100,b:200},
                //请求类型
                type: 'GET',
                //响应体结果类型
                dataType: 'json',
                //成功的回调
                success: function(data){
                    console.log(data);
                },
                //超时时间
                timeout: 2000,
                //失败的回调
                error: function(){
                    console.log('请求出错了!')
                },
                //头信息
                headers:{
                    c:300,
                    d:400
                }
            })
        })
    </script>
</body>
</html>

Axios

Axios 是一个基于 promise 的 HTTP 库,可以用在浏览器和 node.js 中。

github项目链接:https://github.com/axios/axios/

API中文文档链接:http://www.axios-js.com/zh-cn/docs/

可以直接在页面上引用axios的cdn即可。

同源策略(Same Origin Policy)

同源策略,它是由Netscape提出的一个著名的安全策略。它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响。

同源策略的约定是域名、协议、端口都相同。即当前网页请求另一个网页资源时必须时域名、协议、端口均相同的服务器进程资源。

只有满足同源策略的地址才可以相互通过AJAX的方式请求。

跨域(Cross Origin)

浏览器默认是有同源策略的,如果想要在某一个网页请求不同域的资源则会存在跨域问题,跨域问题的解决方案有如下几种:

  1. jsonp(JSON With Padding)是json的一种“使用模式”,可以让网页从别的域名获取数据。
  2. 设置跨域资源共享CROS(Cross-Origin Resource Sharing)响应头。

之前还说过,如果在测试过程中,例如谷歌浏览器可以在浏览器中输入chrome://flags/禁用同源策略的组件。

其他

1、AJAX请求可能会有IE缓存问题,解决方案在请求url后面加上一个时间参数。

2、AJAX请求超时/网络异常可以设置一个回调函数。

3、取消——abort函数

4、如果有重复请求,可以设置一个是否有重复请求标识,当前面一个请求还没完毕时,取消前面的重复请求,创建一个新的请求,这样可以减少服务器的压力,避免多次重复请求。

5、服务端设置响应头允许跨域后,在请求服务端时会请求两次,第一次是preflight用于验证,第二次才是真正发送的请求。参考:http://www.ruanyifeng.com/blog/2016/04/cors.html

img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Go语言开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取

eng.com/blog/2016/04/cors.html>

[外链图片转存中…(img-6HbkdMYR-1715833220346)]
[外链图片转存中…(img-m5eklvfW-1715833220347)]
[外链图片转存中…(img-wnxKmK1L-1715833220347)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Go语言开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取

### 抖音 API 请求标头格式示例 对于研究抖音 API 或其请求标头,通常需要关注 HTTP 请求中的 `Headers` 部分。这些头部字段可能包括但不限于以下几类: #### 常见的请求标头字段 1. **User-Agent**: 表明客户端的身份,通常是特定版本的应用程序或浏览器。 - 示例:`User-Agent: Dalvik/2.1.0 (Linux; U; Android 9; MI 8 Build/PKQ1.181121.001)`[^4]。 2. **Content-Type**: 定义发送数据的内容类型。 - 示例:`Content-Type: application/json;charset=UTF-8`[^4]。 3. **Accept-Language**: 指定客户端的语言偏好。 - 示例:`Accept-Language: zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7`[^4]。 4. **Authorization**: 如果接口需要身份验证,则此字段用于传递认证令牌。 - 示例:`Authorization: Bearer <access_token>`[^4]。 5. **X-Requested-With**: 标识 AJAX 请求来源。 - 示例:`X-Requested-With: XMLHttpRequest`[^4]。 6. **Referer**: 记录当前页面是从哪个 URL 跳转过来的。 - 示例:`Referer: https://www.douyin.com/feed`[^4]。 7. **Host**: 目标服务器地址。 - 示例:`Host: api.amemv.com`[^4]。 8. **Connection**: 控制连接状态的行为。 - 示例:`Connection: keep-alive`[^4]。 #### 示例代码展示 以下是基于上述常见字段的一个模拟请求标头示例,适用于某些场景下的测试用途: ```http POST /api/v1/user/info HTTP/1.1 Host: api.amemv.com Content-Type: application/json;charset=UTF-8 User-Agent: Douyin/2.9.1 (iPhone; iOS 13.2; Scale/2.00) Accept-Language: en-us Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9... X-Requested-With: com.ss.android.ugc.trill Referer: https://www.douyin.com/ Connection: keep-alive ``` 需要注意的是,实际应用中可能会涉及更多动态参数(如时间戳、签名等),具体取决于目标系统的安全机制设计。 --- #### 实践建议 如果计划通过编程方式调用此类服务,可以参考 Golang 的 Gin 框架实现自定义日志记录功能来捕获和分析请求细节[^3]。例如,在处理入站流量时,可以通过中间件提取并打印完整的请求上下文信息。 ```go package main import ( "github.com/gin-gonic/gin" ) func customLogger() gin.HandlerFunc { return func(c *gin.Context) { c.Next() logMessage := c.Request.Method + " " + c.Request.URL.String() + "\n" + fmt.Sprintf("Headers: %+v", c.Request.Header) gin.DefaultWriter.Write([]byte(logMessage)) } } func main() { r := gin.New() r.Use(customLogger()) r.GET("/test", func(c *gin.Context) {}) r.Run(":8080") } ``` 以上代码片段展示了如何利用 Go 编程语言构建一个简单的 Web 应用来拦截传入请求,并将其标头部分输出到控制台以便进一步审查。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值