当前位置: 首页 > wzjs >正文

官方制作网站营销网页设计公司

官方制作网站,营销网页设计公司,做网站的准备什么,网站收录量下降Rust Web 全栈开发(二):构建 HTTP Server Rust Web 全栈开发(二):构建 HTTP Server解析 HTTP 请求HTTP 请求的构成创建成员包/库:httpserver、http构建 http 成员库httprequesthttpresponselib …

Rust Web 全栈开发(二):构建 HTTP Server

  • Rust Web 全栈开发(二):构建 HTTP Server
    • 解析 HTTP 请求
      • HTTP 请求的构成
      • 创建成员包/库:httpserver、http
      • 构建 http 成员库
        • httprequest
        • httpresponse
        • lib

Rust Web 全栈开发(二):构建 HTTP Server

参考视频:https://www.bilibili.com/video/BV1RP4y1G7KF

Web Server 的消息流动图:

在这里插入图片描述

Server:监听 TCP 字节流

Router:接收 HTTP 请求,并决定调用哪个 Handler

Handler:处理 HTTP 请求,构建 HTTP 响应

HTTP Library:

  • 解释字节流,把它转换为 HTTP 请求
  • 把 HTTP 响应转换回字节流

构建步骤:

  1. 解析 HTTP 请求消息
  2. 构建 HTTP 响应消息
  3. 路由与 Handler
  4. 测试 Web Server

解析 HTTP 请求

3 个数据结构:

名称类型描述
HttpRequeststruct表示 HTTP 请求
Methodenum指定所允许的 HTTP 方法
Versionenum指定所允许的 HTTP 版本

以上 3 个数据结构都需要实现的 3 个 trait:

名称描述
From<&str>用于把传进来的字符串切片转换为 HttpRequest
Debug打印调试信息
PartialEq用于解析和自动化测试脚本里做比较

HTTP 请求的构成

HTTP 请求报文由 3 部分组成:请求行、请求头、请求体。

在这里插入图片描述

创建成员包/库:httpserver、http

在原项目下新建成员包 httpserver、成员库 http:

cargo new httpserver
cargo new --lib http

在这里插入图片描述

在工作区内运行 cargo new 会自动将新创建的包添加到工作区内 Cargo.toml 的 [workspace] 定义中的 members 键中,如下所示:

在这里插入图片描述

此时,我们可以通过运行 cargo build 来构建工作区。项目目录下的文件应该是这样的:

├── Cargo.lock
├── Cargo.toml
├── httpserver
│   ├── Cargo.toml
│   └── src
│       └── main.rs
├── http
│   ├── Cargo.toml
│   └── src
│       └── lib.rs
├── tcpclient
│   ├── Cargo.toml
│   └── src
│       └── main.rs
├── tcpserver
│   ├── Cargo.toml
│   └── src
│       └── main.rs
└── target

构建 http 成员库

在 http 成员库的 src 目录下新建两个文件:httprequest.rs、httpresponse.rs。

httprequest

打开 http 成员库中的 httprequest.rs,编写代码:

use std::collections::HashMap;#[derive(Debug, PartialEq)]
pub enum Method {Get,Post,Uninitialized,
}
impl From<&str> for Method {fn from(s: &str) -> Method {match s {"GET" => Method::Get,"POST" => Method::Post,_ => Method::Uninitialized,}}
}#[derive(Debug, PartialEq)]
pub enum Version {V1_1,V2_0,Uninitialized,
}impl From<&str> for Version {fn from(s: &str) -> Version {match s {"HTTP/1.1" => Version::V1_1,_ => Version::Uninitialized,}}
}#[derive(Debug, PartialEq)]
pub enum Resource {Path(String),
}#[derive(Debug)]
pub struct HttpRequest {pub method: Method,pub resource: Resource,pub version: Version,pub headers: HashMap<String, String>,pub body: String,
}impl From<String> for HttpRequest {fn from(request: String) -> HttpRequest {let mut parsed_method = Method::Uninitialized;let mut parsed_resource = Resource::Path("".to_string());let mut parsed_version =  Version::V1_1;let mut parsed_headers = HashMap::new();let mut parsed_body = "";for line in request.lines() {if line.contains("HTTP") {let (method, resource, version) = process_request_line(line);parsed_method = method;parsed_resource = resource;parsed_version = version;} else if line.contains(":") {let (key, value) = process_header_line(line);parsed_headers.insert(key, value);} else if line.len() == 0 {} else {parsed_body = line;}}HttpRequest {method: parsed_method,resource: parsed_resource,version: parsed_version,headers: parsed_headers,body: parsed_body.to_string(),}}
}fn process_header_line(s: &str) -> (String, String) {let mut header_items = s.split(":");let mut key = String::from("");let mut value = String::from("");if  let Some(k) = header_items.next() {key = k.to_string();}if let Some(v) = header_items.next() {value = v.to_string();}(key, value)
}fn process_request_line(s: &str) -> (Method, Resource, Version) {let mut words = s.split_whitespace();let method = words.next().unwrap();let resource = words.next().unwrap();let version = words.next().unwrap();(method.into(),Resource::Path(resource.to_string()),version.into())
}#[cfg(test)]
mod test {use super::*;#[test]fn test_method_into() {let method: Method = "GET".into();assert_eq!(method, Method::Get);}#[test]fn test_version_into() {let version: Version = "HTTP/1.1".into();assert_eq!(version, Version::V1_1);}#[test]fn test_read_http() {let s = String::from("GET /greeting HTTP/1.1\r\nHost: localhost:3000\r\nUser-Agent: curl/7.71.1\r\nAccept: */*\r\n\r\n");let mut headers_excepted = HashMap::new();headers_excepted.insert("Host".into(), " localhost".into());headers_excepted.insert("Accept".into(), " */*".into());headers_excepted.insert("User-Agent".into(), " curl/7.71.1".into());let request: HttpRequest = s.into();assert_eq!(request.method, Method::Get);assert_eq!(request.resource, Resource::Path("/greeting".to_string()));assert_eq!(request.version, Version::V1_1);assert_eq!(request.headers, headers_excepted);}
}

运行命令 cargo test -p http,测试 http 成员库。

3 个测试都通过了:

在这里插入图片描述

httpresponse

打开 http 成员库中的 httpresponse.rs,编写代码:

在这里插入代码片
lib

打开 http 成员库中的 lib.rs,编写代码:

pub mod httprequest;
pub mod httpresponse;
http://www.dtcms.com/wzjs/195263.html

相关文章:

  • 使用java做直播网站互动营销是什么意思
  • 网站开发 python搜索引擎优化的办法有哪些
  • 怎样学习网站建设天津seo实战培训
  • 网站开发者都是英文怎样开发呢武汉搜索排名提升
  • 网站开发的目的和意义品牌宣传活动策划方案
  • 床品图案设计网站新区seo整站优化公司
  • 中山做网站价格百度指数需求图谱
  • 互联网 网站建设网站建设报价方案
  • 手机网站是什么武汉seo托管公司
  • 上海企业建站提供商免费公司网址怎么注册
  • 东莞网站优化建设团队超级外链自动发布工具
  • 郑州建网站的公司网络营销外包
  • 电商网站如何做多语言架构宁波正规站内优化seo
  • 市局网站建设建议网站推广计划方案
  • 怀柔成都网站建设如何做百度竞价推广
  • 中英繁网站源码外贸网站免费建站
  • 做一个简单的网站北京seo招聘
  • 淘宝佣金推广网站建设代发软文
  • 沈阳网站开发今天时政新闻热点是什么
  • 怎样做网站信箱如何进行市场推广
  • 做网站工作的怎么填职务seo千享科技
  • 建设电影网站的关键网络营销策划方案ppt
  • 湖北省两学一做网站廊坊关键词优化平台
  • 可以做动画的网站都有哪些软件下载深圳网络推广推荐
  • 长沙做产检玛丽亚m网站精准数据营销方案
  • php手机网站开发教程关键词你们懂的
  • 如何免费自学网站建设线上网络平台推广
  • 做旅游网站的需求分析推广方案是什么
  • 做校招的网站有哪些站长之家域名查询官网
  • 广州专业的网站建设公司哪家好seo文章排名优化