在Rust中使用标准库创建 http server并通过response响应返回图片

11 篇文章 0 订阅

其实只要按照 https://kaisery.github.io/trpl-zh-cn/ch20-00-final-project-a-web-server.html 中的教程一步步完成就可以处理基本的http请求,前提是你要对前端以及全栈开发有一定基本的了解,比如我已经自学前端以及全栈开发三年多了,从大二开始,所以我基本可以很轻松的读完这三个章节。

但是遇到了一些难点,原文中讲了如何根据请求的路径返回对应的html文档,这个其实很简单,因为html是可以当做字符串读入的,但是对于一些二进制文件,比如视频、音频、图片等,是无法通过教程中的方法由response返回的,这里我也是查了十几分钟资料,才琢磨出来。

先看一下传统的html文档的处理:

传统的html文档的处理

很简单,使用readtostring函数读成字符串,然后构造相应字符串,再把整个相应转成字节,因为TCP是基于字节流的,这个也是一个知识点,你要是不知道这个你就只能死记硬背。写入流中,最后返回。

let filename = "index.html";
let contents = fs::read_to_string(filename).unwrap();
let response = format!("{}\r\nContent-Length: {}\r\n\r\n{}", status_line, contents.len(), contents);
stream.write(response.as_bytes()).unwrap();
stream.flush().unwrap();

图片格式的相应处理

其实是因为多少有一点强迫症,每次浏览器请求 favicon.ico 的时候,总是返回错误,因此这里特别想搞定这个,但是在下手写的时候发现,好像和基础的html文档的不太一样,折腾了半天没整出来,这里不卖关子了,直接上代码。

let contents = fs::read("favicon.ico").unwrap();
let response = format!("HTTP/1.1 200 OK\r\nContent-Length: {}\r\nContent-Type:image/x-icon\r\n\r\n", contents.len());
stream.write(response.as_bytes()).unwrap();
stream.write_all(&contents[..]).unwrap();
stream.flush().unwrap();

这里一开始我也想复杂了,包括Stack Overflow上一个代码里说要打开一个 file stream,然后不断读字节 chunk ,并且encode 这个 chunk 并写入 stream,最后构建成 &[u8] 这个类型。

后来我试着查了一下 如何从 Vec[u8] 转换成 &[u8],说直接这样用切片就可以了,我试了一下最后居然成功了。

总结

我一开始就说了,我学习这个Rust的原因就是能够接触一些偏底层的内容,这样可以丰富编程的核心,今天做完这个项目,感觉又学到了更多,这是要比你用 Python、Node去实现一个简易web服务器可以体验更多的过程。

如果有可能的话,尝试使用C语言、C++去实现,会学到更多。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值