西安做网站建设哪家好,萧山网站优化,wordpress网站主题插件,wordpress主题修改ftp最近的项目需要频繁在前后端之间传输数据#xff0c;本篇主要介绍HTTP协议以及数据传输方法。 1 HTTP协议
1.1 http协议简介 HTTP(Hypertext Transfer Protocol)是一种用于传输超文本数据的应用层协议。它是万维网上数据交换的基础#xff0c;定义了客户端和服务器之间进行通… 最近的项目需要频繁在前后端之间传输数据本篇主要介绍HTTP协议以及数据传输方法。 1 HTTP协议
1.1 http协议简介 HTTP(Hypertext Transfer Protocol)是一种用于传输超文本数据的应用层协议。它是万维网上数据交换的基础定义了客户端和服务器之间进行通信的规则。这里需要注意以下几点
超文本数据指的是在网络上通过HTTP协议传输的HTML文档或其他超文本数据可以包含文本、图片、链接、多媒体等元素用于构建网页内容。客户端发送HTTP请求想向服务端请求特定的资源或执行特定的资源通常是指浏览器、移动应用、命令行工具(如curl)或其他通过HTTP发送请求的程序。服务端接收并处理HTTP请求根据请求的内容执行相应的操作最后将结果封装在HTTP响应中返回给客户端。
1.2 http请求 http请求是由客户端程序自动设置的而不需要用户手动设置。一个完整的http请求主要包含以下信息
请求行(Request Line)包括请求方法、请求的资源路径和HTTP协议版本。例如GET /index.html HTTP/1.1。目前常用的http请求方法包括GET、POST、PUT、DELETE、HEAD、OPTIONS、PATCH、TRACE(已被禁用)、CONNECT。后文会详细介绍前7种方法。请求头部(Request Headers)主要包括请求元信息如Host、User-Agent、Content-Type等。空行请求头部与请求体之间必须有一个空行来表示头部的结束。请求体(Request Body)在某些请求中可能包含请求体用于传输请求的数据如 POST、PUT 请求。请求体的内容取决于具体的请求类型和应用需求。
http请求样例如下
POST /api/login HTTP/1.1
Host: www.example.com
Content-Type: application/json
Content-Length: 36{username: user123, password: pass456}1.3 http响应
HTTP 响应通常包含了服务端对客户端请求的回应信息其中包括状态行、响应头部和响应体等组成部分。
状态行主要包含http协议版本、状态码和状态信息(与状态码相关的可读性描述)。常用的http响应的状态码及状态信息主要有200 OK(请求成功)、301 Moved Permanently(永久重定向)、302 Found(临时重定向)、400 Bad Request(错误请求)、401 Unauthorized(未授权)、403 Forbidden(禁止访问)、404 Not Found(未找到)、500 Internal Server Error(内部服务器错误)和503 Service Unavailable(服务不可用)。响应头部包含了多个响应头字段例如 Date、Content-Type 和 Content-Length 等。空行用于分隔响应头部和响应体。响应体HTTP 响应体主要包含了服务器返回给客户端的实际数据或资源其内容取决于具体的请求和服务器处理结果。
一个http响应样例如下(这里的响应体是一段html格式)
HTTP/1.1 200 OK
Date: Wed, 18 May 2024 12:00:00 GMT
Content-Type: text/html; charsetutf-8
Content-Length: 127!DOCTYPE html
html
headtitleExample Page/title
/head
bodyh1Hello, World!/h1
/body
/htmlTips: http请求和响应的头部信息中都可以添加用户自定义的设置。
1.4 请求体/响应体 HTTP协议的请求体和响应体的数据类型并不完全一致但相差不大请求头和响应头中的Content-Type通常用来设定数据类习惯。常见的数据类型主要包括以下几种
表单数据该类型通常采用application/x-www-form-urlencoded或multipart/form-data 编码。这种类型通常使用键值对的形式提交数据常用于提交表单数据。举例如下(只展示必要信息, 下同)
Content-Type: application/x-www-form-urlencodedusernameuser123passwordpass456JSON数据该类型常用于 Web API通常使用application/json编码。举例如下
Content-Type: application/json{username: user123, password: pass456}XML数据该类型常用于传输结构化数据常采用application/xml或text/xml编码。举例如下
Content-Type: application/xmluserusernameuser123/usernamepasswordpass456/password
/user纯文本数据。举例如下
Content-Type: text/plain
Content-Length: 23This is a text message.二进制数据: 任意格式的二进制数据如图片、音频、视频等。举例如下
Content-Type: multipart/form-data; boundaryboundary123--boundary123
Content-Disposition: form-data; nameimage; filenameexample.jpg
Content-Type: image/jpeg[这里是二进制数据表示图片文件的内容]
--boundary123--2 HTTP请求方法
2.1 GET GET请求通过URL传递参数并且参数会显示在URL的查询字符串中因此适用于传输较少的数据比如请求页面、查询数据等。其URL(资源请求路径即客户端请求的资源在服务端上的位置或标识。)举例如下
http://example.com/api/user?id123在这个URL中http://example.com/api/user是请求的资源在服务端上的地址id123是GET请求所要传递给服务端的参数服务端收到GET请求后解析URL中的参数根据参数执行相应的操作。 GET请求通常用于查询数据并且因为为URL长度有限所以不适合传输大量数据。
2.2 POST POST方法是一种用于向服务器提交数据的请求方法。相比GET请求POST请求通常使用请求体向服务器端传输更多、更复杂的数据比如表单提交、文件上传等。其常用的URL结构如下
http://example.com/api/register与GET请求相比POST请求不是幂等的即多次发送相同的POST请求可能会导致服务器状态的变化比如重复提交表单会创建多条数据。
2.3 PUT/PATCH PUT和PATCH方法都可以实现对服务器资源的更新PUT可以实现全局更新而PATCH可以实现局部更新。PATCH请求使用与PUT请求相同的URL结构用于指定要更新的资源。其URL举例如下
http://example.com/api/user/123在这个URL案例中123是要更新的用户的唯一标识符。而要更新的数据可以放在请求体中。资源的唯一标识符通常由请求的 URL 来定义。
2.4 DELETE DELETE请求可以删除指定资源。它允许客户端从服务器上删除指定的资源。
2.5 HEAD HEAD请求是一种类似于GET请求的请求方法但是服务器在响应中只返回头信息不返回实体主体。HEAD请求通常用于获取目标资源的元数据而不需要获取资源的实际内容。而服务器收到HEAD请求后依然会执行相应的处理逻辑。但服务端不会返回实体主体只返回头信息这样可以节省带宽和处理时间。
2.6 OPTIONS OPTIONS 方法是一种用于询问服务器支持的请求方法和其他资源相关信息的请求方法之一。当客户端发送 OPTIONS 请求时服务器会返回一个描述了资源的通用信息的响应。
2.7 Python实现 虽然 HTTP 协议是一种通用的协议但不同的编程语言都有自己的库和工具集来处理网络通信和HTTP请求。这里仅以Python为例说明 server.py
from flask import Flask, request, make_response
app Flask(__name__)userlist[[1,admin,12345678]]
app.route(/login, methods[GET,HEAD])
def login():username request.args.get(username)password request.args.get(password)responsemake_response()response.headers[Content-Type] text/plainfor user in userlist:if user[1] username and user[2] password:response.status_code200response.data登陆成功breakelse:response.status_code400response.data登陆失败return responseapp.route(/register, methods[POST])
def register():username request.form.get(username)password request.form.get(password)len_1len(userlist)responsemake_response()response.headers[Content-Type] text/plaintry:userlist.append([str(len_11),username,password])response.status_code200response.data注册成功except:response.status_code400response.data注册失败return responseapp.route(/updatepassword/user_id, methods[PUT,PATCH])
def updatepassword(user_id): responsemake_response()response.headers[Content-Type] text/plainpasswordrequest.args.get(password)for user in userlist:if user[0] user_id:user[2]passwordresponse.status_code200response.data修改成功breakelse:response.status_code400response.data修改失败return responseif __name__ __main__:app.run(port5000, debugTrue)print(userlist)client.py
from flask import Flask, request, make_response
app Flask(__name__)userlist[[1,admin,12345678]]
app.route(/login, methods[GET,HEAD])
def login():username request.args.get(username)password request.args.get(password)responsemake_response()response.headers[Content-Type] text/plainfor user in userlist:if user[1] username and user[2] password:response.status_code200response.data登陆成功breakelse:response.status_code400response.data登陆失败return responseapp.route(/register, methods[POST])
def register():username request.form.get(username)password request.form.get(password)len_1len(userlist)responsemake_response()response.headers[Content-Type] text/plaintry:userlist.append([str(len_11),username,password])response.status_code200response.data注册成功except:response.status_code400response.data注册失败return responseapp.route(/updatepassword/user_id, methods[PUT,PATCH])
def updatepassword(user_id): responsemake_response()response.headers[Content-Type] text/plainpasswordrequest.args.get(password)for user in userlist:if user[0] user_id:user[2]passwordresponse.status_code200response.data修改成功breakelse:response.status_code400response.data修改失败return responseif __name__ __main__:app.run(port5000, debugTrue)print(userlist) 结果
登陆失败
注册成功
{Server: Werkzeug/2.2.3 Python/3.11.5, Date: Mon, 13 May 2024 13:02:22 GMT, Content-Type: text/plain, Content-Length: 12, Connection: close}
修改成功
修改成功