M2.1
任务描述
你的命令行爬虫愈发完善了,但命令行运行模式使它通常只适用于本机脚本。bLue 想让这个程序在网络上提供便捷的查询服务,即它可以通过 HTTP 协议,以 IP + 端口的形式被其他用户调用。现在,你需要让你的程序变成可对外提供 HTTP 服务的程序。
任务要求
你需要实现一个后端程序,语言不限。其在 http://127.0.0.1:2333
上提供服务(可借助任何 HTTP 库或框架)。
同时,你的新查询服务需要支持多用户查询。输入的用户名是以逗号分隔的多个 handle 的查询字符串(位于 URL Query)。而返回结果变成数组,每一项均按顺序对应输入的 handle。
你的 HTTP 响应状态码应始终为 200,以 JSON 字符串形式作为响应体,且包含响应头 Content-Type: application/json
。
数据结构
情况 1:此项 handle 可以查询到
对于有 rating 的用户,响应对象的结构定义为:
typescript
{
success: true;
result: {
handle: string;
rating: number;
rank: string;
}
}
对于无 rating 的用户,响应对象的结构定义为:
typescript
{
success: true;
result: {
handle: string;
}
}
情况 2:此项 handle 无法找到
响应对象的结构定义为:
typescript
{
success: false;
type: 1;
message: 'no such handle';
}
情况 3:在查询此项时遭遇异常 HTTP 响应
响应对象的结构定义为:
typescript
{
success: false;
type: 2;
message: string;
details: {
status: number;
}
}
情况 4:在查询此项时未收到有效 HTTP 响应
响应对象的结构定义为:
typescript
{
success: false;
type: 3;
message: string;
}
情况 5:在查询此项时程序发生运行时异常
响应对象的结构定义为:
typescript
{
success: false;
type: 4;
message: 'Internal Server Error';
}
请求示例
请求 URL(GET):
txt
http://127.0.0.1:2333/?handles=jiangly,zxw,aaabbbccc0,ahz,nnnnnn123
响应体:
json
[
{
"success": true,
"result": {
"handle": "jiangly",
"rating": 3666,
"rank": "legendary grandmaster"
}
},
{
"success": true,
"result": {
"handle": "zxw"
}
},
{
"success": false,
"type": 1,
"message": "no such handle"
},
{
"success": false,
"type": 2,
"message": "HTTP response with code 503",
"details": {
"status": 503
}
},
{
"success": false,
"type": 3,
"message": "Request timeout"
}
]
建议完成用时
1-2 天。
自学参考资料关键词
- HTTP
- JSON
总结回顾检查点
- HTTP 协议的基本组成部分有哪些?
- HTTP 请求中有哪些传参的方式?
进阶思考题
- 自我测试,在一次性传入较多用户名时,是否响应缓慢?若是,你能想到什么办法优化?