怎样借助Spring boot快速实现一个简单的http服务器

kotlin 专栏收录该内容
10 篇文章 0 订阅

借助强大的spring boot框架来实现一个简易的http服务器,十分的简单,只需要短短的几十行代码就可以解决。

先让我们看看最终的效果:

这里写图片描述

这个http服务器的实现思路可以概括成一下几步:

  1. 解析资源路径
  2. 在站点目录下获取相对应的文件
  3. 根据请求的资源文件的后缀名判断其媒体类型
  4. 构造响应体并返回给浏览器端

第一步:解析资源路径

@RestController
class HttpController{
    @Autowired
    lateinit var httpSerivce:HttpService

    @GetMapping("/**")
    fun httpRequest(@RequestHeader("Host")host:String, request: HttpServletRequest)=
            httpSerivce.response(PathUtil.getPath(request.requestURL.toString(),host))

}

说明:使用 /** 来匹配任何可能的路径,函数参数中,通过RequestHeader注解获取主机信息,通过HttpServletRequest获取完整的url路径。使用PathUtil来解析出资源路径。其中PageUtil的代码时这样的:

object PathUtil {
     fun getPath(fullUrl:String,host:String):String{
          return fullUrl.removePrefix("http://").removePrefix("https://").removePrefix(host)
     }
}

第二步:在站点目录下获取相对应的文件

@Service
class HttpService {

    @Value("\${html.resource.path}")
    lateinit var resPath:String
html:
  resource:
    path: /Users/feint/Server
server:
  port: 8080

说明:在配置文件application.yml中配置站点的根目录。在这里为了方便、快速的看到结果,没有对一些可能出现的错误或异常进行相应的处理(比如文件不存在)。这里有一点要注意的,由于美元符在kotlin的字符串中是一个特殊符号,所以在使用Value注解进行取值的时候需要使用反斜杠进行转义。

第三步:根据请求的资源文件的后缀名判断其媒体类型

object MediaUtil{
    val APPLICATION_JAVASCRIPT=MediaType.valueOf("application/javascript")
    val TEXT_CSS=MediaType.valueOf("text/css")

    val mediaMap:Map<String,MediaType> = mapOf(Pair("html",MediaType.TEXT_HTML),
            Pair("js",APPLICATION_JAVASCRIPT),
            Pair("css", TEXT_CSS),
            Pair("png",MediaType.IMAGE_PNG),
            Pair("gif",MediaType.IMAGE_GIF),
            Pair("jpeg",MediaType.IMAGE_JPEG),
            Pair("jpg", MediaType.IMAGE_JPEG))

    fun getMedia(type:String)= mediaMap[type]
}

说明:为了避免大量的判断语句,我将文件后缀和媒体类型的对应关系使用一个Map进行维护。springframework自带的MediaType的类型并不十分完全,这里还需要自行添加一些需要的媒体类型:css、javascript等。

第四步:构造响应体并返回给浏览器端

return ResponseEntity.ok()
                .contentLength(file.length())
                .contentType(MediaUtil.getMedia(file.extension))
                .body(InputStreamResource(file.inputStream()))

说明:设置几个必要的信息:内容长度(响应体的长度)、媒体类型(浏览器会更具不同的媒体类型对响应体进行不同的处理)、响应体

结尾

源码地址(Github):https://github.com/feintKotlin/fkhttp

注:这将是一个长期更新的项目,欢迎持续关注咱的Github 以及官网

  • 0
    点赞
  • 1
    评论
  • 1
    收藏
  • 打赏
    打赏
  • 扫一扫,分享海报

评论 1 您还未登录,请先 登录 后发表或查看评论
©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页

打赏作者

feintkotlin

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值