请求:每个请求由三部分组成:请求行、请求头和请求体。
1.请求行:包括请求方法(如 GET、POST 等)、请求的 URL 路径、HTTP 版本。
请求行通俗来讲就是规定:在链接中干什么。
格式如下:
方法 路径 HTTP版本
2.请求头:包含元数据信息,例如主机名、User-Agent 等,描述请求的特性。
请求头通俗来说就是:提供一些额外信息来告诉服务器具体我想要什么。
常见请求头:
- Host:指定请求的目标主机名和端口。 示例:
Host: www.example.com
,用于告诉服务器请求的目标主机。 - User-Agent:标识客户端应用程序的类型(如浏览器)。 示例:
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64)
,用于让服务器识别客户端设备类型。 - Accept:告知服务器客户端可处理的内容类型。 示例:
Accept: application/json
,表示客户端希望接收 JSON 格式的数据。 - Content-Type:描述请求体的格式。 示例:
Content-Type: application/json
,用于告诉服务器请求体的数据类型是 JSON。 - Authorization:提供认证信息,例如访问受保护资源所需的令牌。 示例:
Authorization: Bearer <token>
,用于在请求中提供身份认证信息,例如API key。
3.请求体:包含需要传递给服务器的数据实际内容。
比如常见的用户在某个网页填写的登录信息,就会被浏览器会放入请求体中,发送到服务器处理。
请求体的格式: 请求体的数据格式取决于请求头中的Content-Type
字段。
常见的格式包括:
application/x-www-form-urlencoded
:类似于我们在浏览器填写登录信息时的链接后的一串信息
name=JohnDoe&age=25&city=NewYork
application/json
:就是json的格式
{
"name": "John Doe",
"age": 25,
"city": "New York"
}
text/plain
:简单的文本内容。
Hello, this is plain text.
响应:同样是三部分,包括状态行,响应头,响应体
1.状态行:包括 HTTP 版本、状态码和状态文本。
HTTP版本:服务器支持的HTTP协议版本(如HTTP/1.1
或HTTP/2
)。
状态码(Status Code):表示请求请求处理的结果状态,是否成功,是什么问题。状态码是一个三位数字,根据不同的状态用不同的数字段表示,例如经常见到的404 NOT Found的404。
状态码比较多详情可以查看https://www.runoob.com/http/http-status-codes.html,分为5类:
- 1xx 信息响应:指示请求已被接收且处理中。
- 2xx 成功响应:表明请求成功。
- 3xx 重定向响应:表明请求需要客户端进一步处理。
- 4xx 客户端错误:客户端请求出错,服务器无法处理。
- 5xx 服务器错误:服务器在处理请求时发生了错误。
状态描述(Reason Phrase):对状态码的简短描述。
格式为:
HTTP版本 状态码 状态描述
HTTP/1.1 200 OK
2.响应头:包含元数据,如内容类型、日期等,描述响应的特性。
常见响应头:
Content-Type:告知客户端响应体的媒体类型。
示例:Content-Type: application/json
,表示响应体的数据是 JSON 格式。
Date:服务器返回响应的日期和时间。
示例:Date: Tue, 08 Oct 2024 14:00:00 GMT
,用于告知客户端响应的生成时间。
Set-Cookie:在客户端设置cookie,用于后续请求保持会话状态。 示例:Set-Cookie: sessionid=abc123; Expires=Wed, 09 Oct 2024 12:45:00 GMT
Cache-Control:指示客户端如何缓存响应数据。
示例:Cache-Control: no-cache
,表示不要缓存该响应。
3.响应体:包含服务器返回的资源数据,例如 HTML 页面、JSON 数据等。
响应体的数据格式取决于响应头中的 Content-Type
字段。
常见格式:
text/html
:HTML 文档,用于呈现网页内容。
application/json
:JSON 格式的数据,通常用于 API 响应。
text/plain
:简单的文本内容。
总结(以调用通义千问的api为例):
请求:HTTP请求是客户端向服务器发送的消息,包含获取资源或执行操作的请求信息,如请求行、请求头和请求体。
POST /compatible-mode/v1/chat/completions HTTP/1.1 // 请求行:方法 路径 HTTP版本
Host: dashscope.aliyuncs.com // 请求头:目标主机名
Authorization: Bearer sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx // 请求头:Authorization提供API密钥认证信息
Content-Type: application/json // 请求头:Content-Type表示请求体的格式
Content-Length: 220 // 请求头:请求体的长度
{
"model": "qwen-plus", // 模型名称
"messages": [
{
"role": "system", // 系统消息角色
"content": "You are a helpful assistant." // 系统设定内容
},
{
"role": "user", // 用户消息角色
"content": "你是谁?" // 用户输入内容
}
],
"max_tokens": 100, // 最大token
"temperature": 0.7 // 控制生成内容的随机性
}
一般我们通过代码来,这里不使用它的客户端而是使用使用requests
库的直接HTTP调用,便于理解:
import requests
import json
# API端点URL
url = "<https://dashscope.aliyuncs.com/compatible-mode/v1/chat/completions>"
# 设置请求头
headers = {
"Authorization": "Bearer your_dashscope_api_key", # 将your_dashscope_api_key替换为你的实际API密钥
"Content-Type": "application/json"
}
# 设置请求体数据
data = {
"model": "qwen-plus",
"messages": [
{
"role": "system",
"content": "You are a helpful assistant."
},
{
"role": "user",
"content": "你是谁?"
}
]
}
# 发送POST请求
response = requests.post(url, headers=headers, data=json.dumps(data))
# 打印响应内容
if response.status_code == 200:
print("Response:", response.json())
else:
print(f"Error: {response.status_code}")
print(response.text)
响应:HTTP响应是服务器返回给客户端的消息,包含请求结果的状态码、响应头以及所需的资源或数据。
HTTP/1.1 200 OK // 响应行:表示请求成功
Content-Type: application/json // 响应头:返回的内容格式为JSON
Content-Length: 348 // 响应头:响应体的长度
{
"id": "completion-5yMTnLlE2eWL9kDbd4K9tT",
"object": "chat.completion", // 响应体:表示这是一个聊天补全的结果
"created": 1689000000, // 响应体:请求生成时间的时间戳
"model": "qwen-plus", // 响应体:使用的模型
"choices": [
{
"message": {
"role": "assistant", // 角色是助手
"content": "我是通义千问,一个由阿里云提供的智能助手。" // 助手生成的响应内容
},
"finish_reason": "stop", // 结束原因:生成完成
"index": 0 // 响应结果的索引,多个响应时用
}
],
"usage": {
"prompt_tokens": 12, // 使用的提示词的token数
"completion_tokens": 15, // 生成的文本的token数
"total_tokens": 27 // 总共消耗的token数
}
}