ZetCode

Dart HttpStatus

最后修改于 2025 年 4 月 4 日

Dart 中的 HttpStatus 类提供了 HTTP 状态码的常量。它是 dart:io 库的一部分,对于 Web 开发和 HTTP 通信至关重要。

HttpStatus 包含所有标准 HTTP 状态码的数字常量。这些代码指示 HTTP 响应中的成功、失败或其他条件。

基本定义

HttpStatus 是一个包含静态整数常量的实用工具类。每个常量都用描述性名称表示一个标准的 HTTP 状态码。

该类涵盖了从信息性 (1xx) 到服务器错误 (5xx) 的所有状态码。使用这些常量可以提高代码的可读性和可维护性。

检查成功状态

此示例演示了如何检查 HTTP 响应是否表示成功。

main.dart
import 'dart:io';

void main() {
  int statusCode = 200;
  
  if (statusCode >= HttpStatus.ok && 
      statusCode < HttpStatus.multipleChoices) {
    print('Request succeeded');
  } else {
    print('Request failed');
  }
  
  print('OK status code: ${HttpStatus.ok}');
}

我们检查状态码是否在成功范围 (200-299) 内。HttpStatus.ok 常量表示 200,这是标准的成功代码。

$ dart main.dart
Request succeeded
OK status code: 200

处理重定向

此示例展示了如何识别不同类型的重定向响应。

main.dart
import 'dart:io';

void handleRedirect(int statusCode) {
  switch (statusCode) {
    case HttpStatus.movedPermanently:
      print('301 - Moved Permanently');
      break;
    case HttpStatus.found:
      print('302 - Found');
      break;
    case HttpStatus.seeOther:
      print('303 - See Other');
      break;
    case HttpStatus.temporaryRedirect:
      print('307 - Temporary Redirect');
      break;
    case HttpStatus.permanentRedirect:
      print('308 - Permanent Redirect');
      break;
    default:
      print('Not a redirect');
  }
}

void main() {
  handleRedirect(HttpStatus.movedPermanently);
  handleRedirect(HttpStatus.temporaryRedirect);
}

我们使用 HttpStatus 常量来标识特定的重定向类型。每次重定向对客户端如何处理它都有不同的影响。

$ dart main.dart
301 - Moved Permanently
307 - Temporary Redirect

错误处理

此示例演示了如何处理不同的 HTTP 错误状态。

main.dart
import 'dart:io';

String getErrorMessage(int statusCode) {
  if (statusCode == HttpStatus.badRequest) {
    return '400 - Bad Request';
  } else if (statusCode == HttpStatus.unauthorized) {
    return '401 - Unauthorized';
  } else if (statusCode == HttpStatus.forbidden) {
    return '403 - Forbidden';
  } else if (statusCode == HttpStatus.notFound) {
    return '404 - Not Found';
  } else if (statusCode >= HttpStatus.internalServerError) {
    return '5xx - Server Error';
  } else {
    return 'Unknown error';
  }
}

void main() {
  print(getErrorMessage(HttpStatus.notFound));
  print(getErrorMessage(HttpStatus.internalServerError));
}

我们使用 HttpStatus 常量来标识特定的客户端和服务器错误。该函数根据状态码返回适当的错误消息。

$ dart main.dart
404 - Not Found
5xx - Server Error

创建 HTTP 响应

此示例展示了在创建 HTTP 服务器响应时如何使用 HttpStatus。

main.dart
import 'dart:io';

void handleRequest(HttpRequest request) {
  try {
    // Process request
    request.response.statusCode = HttpStatus.ok;
    request.response.write('Success');
  } catch (e) {
    request.response.statusCode = HttpStatus.internalServerError;
    request.response.write('Error: $e');
  } finally {
    request.response.close();
  }
}

void main() async {
  var server = await HttpServer.bind('localhost', 8080);
  print('Server running on port 8080');
  
  await for (var request in server) {
    handleRequest(request);
  }
}

我们使用 HttpStatus 常量在 HTTP 响应中设置适当的状态码。这确保了标准的合规性以及客户端对响应的更好处理。

$ dart main.dart
Server running on port 8080

验证状态码

此示例演示了如何验证 HTTP 状态码范围。

main.dart
import 'dart:io';

String getStatusCategory(int statusCode) {
  if (statusCode < HttpStatus.continue_ || statusCode > 599) {
    return 'Invalid status code';
  } else if (statusCode < HttpStatus.ok) {
    return 'Informational';
  } else if (statusCode < HttpStatus.multipleChoices) {
    return 'Success';
  } else if (statusCode < HttpStatus.badRequest) {
    return 'Redirection';
  } else if (statusCode < HttpStatus.internalServerError) {
    return 'Client Error';
  } else {
    return 'Server Error';
  }
}

void main() {
  print('200: ${getStatusCategory(200)}');
  print('404: ${getStatusCategory(404)}');
  print('500: ${getStatusCategory(500)}');
}

我们使用 HttpStatus 常量将状态码分类到标准的 HTTP 范围内。该函数有助于理解任何有效状态码的总体含义。

$ dart main.dart
200: Success
404: Client Error
500: Server Error

最佳实践

来源

Dart HttpStatus 文档

本教程介绍了 Dart 的 HttpStatus 类,并提供了实际示例,展示了状态码处理、验证和 HTTP 服务器响应创建。

作者

我的名字是 Jan Bodnar,我是一名热情的程序员,拥有丰富的编程经验。我自 2007 年以来一直在撰写编程文章。迄今为止,我已撰写了 1,400 多篇文章和 8 本电子书。我在教学编程方面拥有十多年的经验。

列出 所有 Dart 教程