Skip to content
由魔法生成的目录

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

总结回顾检查点

  1. HTTP 协议的基本组成部分有哪些?
  2. HTTP 请求中有哪些传参的方式?

进阶思考题

  1. 自我测试,在一次性传入较多用户名时,是否响应缓慢?若是,你能想到什么办法优化?

由三位创世大魔法使共同写成,作为世界树记忆被封存并藉由元素脉络传播至全宇宙。