当前位置: 首页 > article >正文

写给Pythoner的前端进阶指南(六):网络编程

前端开发中,网络编程是至关重要的技能。无论是与外部 API 通信,还是与后端服务器交互,JavaScript 提供了多种方式来进行网络请求和实时通信。作为一名 Python 开发者,你已经习惯了通过 requestssocket 库来进行网络编程。本文将介绍如何在 JavaScript 中发送 HTTP 请求、实现异步请求、以及使用 WebSockets 来进行实时通信,并与 Python 的网络编程做对比。

一、HTTP 请求

1.1 使用 fetch API 发送 HTTP 请求

在 JavaScript 中,fetch API 是最常用的发送 HTTP 请求的方式,它基于 Promise 提供了一个简单的接口来处理 HTTP 请求。fetch 支持 GET、POST、PUT、DELETE 等请求方法,并且可以轻松处理响应数据。

使用 fetch 发送 GET 请求:
fetch('https://api.example.com/data')
    .then(response => {
        if (!response.ok) {
            throw new Error('Network response was not ok');
        }
        return response.json();  // 解析 JSON 响应
    })
    .then(data => {
        console.log(data);  // 处理数据
    })
    .catch(error => {
        console.error('There was a problem with the fetch operation:', error);
    });

在这个示例中,fetch 返回一个 Promise,当请求成功时,我们使用 .json() 方法解析 JSON 响应。如果请求失败,我们通过 .catch() 捕获错误。

发送 POST 请求:
fetch('https://api.example.com/submit', {
    method: 'POST',  // 请求方法
    headers: {
        'Content-Type': 'application/json'
    },
    body: JSON.stringify({
        name: 'John Doe',
        email: 'john.doe@example.com'
    })
})
    .then(response => response.json())
    .then(data => {
        console.log('Success:', data);
    })
    .catch(error => {
        console.error('Error:', error);
    });

在 POST 请求中,我们通过 body 发送 JSON 格式的数据,并设置 Content-Typeapplication/json,告诉服务器我们发送的是 JSON 数据。

1.2 处理响应

fetch API 提供了许多方法来处理响应数据,除了 .json() 之外,还可以使用 .text()(处理纯文本响应)和 .blob()(处理二进制数据)。

示例:处理文本响应
fetch('https://example.com')
    .then(response => response.text())  // 获取文本响应
    .then(text => {
        console.log(text);  // 输出文本内容
    })
    .catch(error => {
        console.error('Error:', error);
    });

二、AJAX 与 JSON

2.1 什么是 AJAX?

AJAX(Asynchronous JavaScript and XML)是一种在不重新加载整个页面的情况下与服务器交换数据并更新部分网页的技术。虽然“XML”在名称中,但 AJAX 现在通常使用 JSON 格式进行数据交换。AJAX 在前端开发中被广泛用于实现动态内容加载和无刷新更新。

2.2 使用 fetch 实现 AJAX 请求

现代 JavaScript 中,fetch API 已经取代了传统的 XMLHttpRequest 来实现 AJAX 请求。以下是一个使用 fetch 实现的 AJAX 示例:

// 向服务器请求数据并使用 JSON 格式进行处理
fetch('https://api.example.com/data')
    .then(response => response.json())
    .then(data => {
        console.log(data);  // 处理服务器返回的 JSON 数据
    })
    .catch(error => {
        console.error('Error:', error);
    });

与 Python 中常用的 requests 库类似,fetch 允许你发送 GET 或 POST 请求,并处理响应数据。

2.3 处理 JSON 数据

JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,广泛应用于 Web 开发中。使用 fetch 获取的响应通常是 JSON 格式,因此你可以使用 .json() 方法将其解析为 JavaScript 对象。

示例:解析 JSON 响应并显示数据
fetch('https://api.example.com/data')
    .then(response => response.json())
    .then(data => {
        data.forEach(item => {
            console.log(item.name);
        });
    })
    .catch(error => {
        console.error('Error:', error);
    });

在这个例子中,响应被解析为一个 JavaScript 数组,然后遍历每个元素并输出其 name 属性。

三、WebSockets

3.1 什么是 WebSockets?

WebSockets 是一种在客户端和服务器之间建立持久连接的协议。与传统的 HTTP 请求不同,WebSockets 允许在客户端和服务器之间进行双向通信。这使得 WebSockets 特别适用于实时应用,如即时聊天、在线游戏和股票行情等。

3.2 使用 WebSockets 进行双向通信

在 JavaScript 中,你可以使用 WebSocket API 来建立 WebSocket 连接。以下是一个简单的 WebSocket 示例:

客户端代码(JavaScript):
// 创建 WebSocket 连接
const socket = new WebSocket('ws://example.com/socket');

// 连接成功时的回调函数
socket.onopen = function(event) {
    console.log('WebSocket is open now.');
    socket.send('Hello Server!');  // 向服务器发送消息
};

// 处理服务器发送的消息
socket.onmessage = function(event) {
    console.log('Message from server: ', event.data);
};

// 处理 WebSocket 错误
socket.onerror = function(error) {
    console.log('WebSocket Error: ' + error);
};

// 连接关闭时的回调函数
socket.onclose = function(event) {
    console.log('WebSocket is closed now.');
};
服务器端代码(Node.js 示例):
const WebSocket = require('ws');
const wss = new WebSocket.Server({ port: 8080 });

wss.on('connection', ws => {
    ws.on('message', message => {
        console.log('received: %s', message);
    });
    
    ws.send('Hello Client!');  // 向客户端发送消息
});

在这个示例中,客户端与服务器通过 WebSocket 协议进行双向通信。客户端通过 socket.send() 向服务器发送消息,服务器通过 ws.send() 向客户端发送消息。

3.3 WebSockets 与 HTTP 请求的区别

  • HTTP 请求:基于请求/响应模型,客户端发起请求,服务器返回响应。每次请求都需要重新建立连接。
  • WebSockets:基于持久连接,客户端和服务器可以随时双向通信,适合实时数据交换。

四、与 Python 的网络编程对比

4.1 Python 中的 requests

在 Python 中,发送 HTTP 请求最常用的库是 requests。它使得发送 GET、POST 等请求变得非常简便。以下是一个 requests 的简单示例:

import requests

# 发送 GET 请求
response = requests.get('https://api.example.com/data')

# 处理 JSON 响应
data = response.json()
print(data)

requests 库的用法与 JavaScript 的 fetch 非常相似,提供了简单易用的接口来发送 HTTP 请求,并处理响应。

4.2 Python 中的 socket 编程

对于低层次的网络编程,Python 提供了 socket 库,它允许你实现客户端和服务器之间的网络通信。以下是一个简单的 Python socket 示例:

Python 客户端代码:
import socket

# 创建一个 TCP/IP 套接字
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_socket.connect(('localhost', 8080))

# 发送数据
client_socket.sendall(b'Hello, server!')

# 接收数据
data = client_socket.recv(1024)
print('Received:', data.decode())

client_socket.close()
Python 服务器端代码:
import socket

# 创建一个 TCP/IP 套接字
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind(('localhost', 8080))
server_socket.listen(1)

print('Waiting for a connection...')
connection, client_address = server_socket.accept()
print('Connection established with', client_address)

# 接收数据
data = connection.recv(1024)
print('Received:', data.decode())

# 发送数据
connection.sendall(b'Hello, client!')

connection.close()

Python 的 socket 库提供了比 requests 更底层的控制,可以用于创建自定义协议和实时通信。

4.3 Python 与 JavaScript 的对比

  • HTTP 请求

:Python 中的 requests 库与 JavaScript 中的 fetch API 功能相似,都提供了简单易用的接口来发送和处理 HTTP 请求。

  • 实时通信:Python 中使用 socket 库进行实时通信,而 JavaScript 使用 WebSocket API 来实现客户端与服务器之间的持久连接和双向通信。

结语

JavaScript 提供了强大的网络编程能力,通过 fetch 发送 HTTP 请求、使用 AJAX 处理异步数据、通过 WebSockets 实现实时通信等,帮助开发者实现高效的网络交互。与 Python 的网络编程相比,JavaScript 在 Web 环境中的网络编程更加注重浏览器与服务器的交互,而 Python 的 requestssocket 库则在更多类型的应用场景中提供支持。

如果你对网络编程有更多问题,欢迎在评论区讨论!


http://www.kler.cn/a/446967.html

相关文章:

  • 中国新能源汽车公共充电桩数据合集(2002-2023年)
  • 通过阿里云 Milvus 与 PAI 搭建高效的检索增强对话系统
  • SQL语句整理五-StarRocks
  • 源码分析之Openlayers中OverviewMap鹰眼控件
  • 如何设计一个秒杀系统
  • 用Java编写简单的文字游戏
  • 华为OD --- 敏感字段加密
  • C++ 面向对象编程:友元、
  • JMeter HTTP Cookie管理器(HTTP Cookie Manager)
  • D100【python 接口自动化学习】- pytest进阶之fixture用法
  • Java开发经验——数据库开发经验
  • clickhouse优化记录
  • 华为DHCP高级配置学习笔记
  • 数据结构_赫夫曼树(基于例题)
  • 【杂谈】虚拟机与EasyConnect运行巧设:Reqable助力指定应用流量专属化
  • 软件需求分析常见误区(三),瀑布模型中需求分析遇到的问题
  • ScottPlot学习的常用笔记-02
  • 《SIFT 算法及原理详解》
  • Verilog中initial的用法
  • 使用C语言编写UDP循环接收并打印消息的程序
  • 云手机:超越常规认知的多功能利器
  • Vue3之路由(Router)介绍
  • [论文阅读]Universal and transferable adversarial attacks on aligned language models
  • MapReduce的shuffle过程详解
  • 【论文阅读】Deep Neural Network Pruning Using Persistent Homology
  • iClient3D for Cesium 实现限高分析