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

HTTP 服务器(基于go实现)

编写一个 HTTP 服务器,接收客户端 request,并将 request 中带的 header 写入 response header

解析HTTP请求头

import ("fmt""net/http"
)func headers(w http.ResponseWriter, r *http.Request) {// 将request中的信息写入到 w中, w为response 并打印输出 for key := range r.Header {fmt.Fprintf(w, "%s: %s\n", key, r.Header[key])}// 通过两种方式去打印requset中的 "Accept-Encoding" 第一种输出是slice第二种是string。fmt.Fprintf(w, "--------------\n")fmt.Fprintf(w, "the key: %s\n", r.Header["Accept-Encoding"])fmt.Fprintf(w, "the key: %s\n", r.Header.Get("Accept-Encoding"))
}
func main() {server := http.Server{Addr: "0.0.0.0:8080",}http.HandleFunc("/headers", headers)server.ListenAndServe()
}

解析请求头,并记录访问日志

编写一个 HTTP 服务器, 接收客户端 request,并将 request 中带的 header 写入 response header ,读取当前系统的环境变量中的 VERSION 配置,并写入 response header Server 端记录访问日志包括客户端 IP,HTTP 返回码,输出到 server 端的标准输出 当访问 localhost/时,应返回 200

package mainimport ("fmt""log""net/http""os"
)func main() {http.HandleFunc("/", handler)err := http.ListenAndServe(":8080", nil)if err != nil {log.Fatal(err)}
}func handler(w http.ResponseWriter, r *http.Request) {// 将请求中的header写入响应headerfor name, values := range r.Header {for _, value := range values {// 该方法是向reponse返回请求中的header中添加键值对w.Header().Add(name, value)// 该方法是向reponse返回请求中的content中添加内容fmt.Fprintf(w, "%s: %s\n", name, r.Header[name])}}version := os.Getenv("VERSION")// 记录访问日志ip := r.RemoteAddrstatusCode := http.StatusOKlog.Printf("IP: %s, Status Code: %d\n", ip, statusCode)// 设置响应状态码w.WriteHeader(statusCode)w.Header().Set("Server", version)// 输出到server端的标准输出fmt.Println("Received request:", r.URL.Path)
}

打包镜像

FROM golang:1.18 AS build
WORKDIR /httpserver/
COPY . .
ENV CGO_ENABLED=0
ENV GO111MODULE=on
ENV GOPROXY=https://goproxy.cn,direct
RUN GOOS=linux go build -installsuffix cgo -o httpserver httpServer.goFROM busybox
COPY --from=build /httpserver/httpserver /httpserver/httpserver
EXPOSE 8080
WORKDIR /httpserver/
ENTRYPOINT ["./httpserver"]`
http://www.lryc.cn/news/139765.html

相关文章:

  • 【整数二分】
  • 开发一款AR导览导航小程序多少钱?ar地图微信小程序 ar导航 源码
  • Shell 编程快速入门 之 函数基础知识
  • Flink流批一体计算(18):PyFlink DataStream API之计算和Sink
  • 03.sqlite3学习——数据类型
  • LLM-chatgpt训练过程
  • 【学习笔记】[ABC274Ex] XOR Sum of Arrays
  • 抖音web频道爬虫
  • sql中的替换函数replace()总结
  • vue3 vite使用 monaco-editor 报错
  • 微信小程序获取蓝牙权限
  • GE 8920-PS-DC安全模块
  • UG\NX二次开发 使用BlockUI设计对话框时,如何设置默认的开发语言?
  • W5500-EVB-PICO进行UDP组播数据回环测试(九)
  • 24 WEB漏洞-文件上传之WAF绕过及安全修复
  • Python科研绘图--Task03
  • ssm端游游戏账号销售管理系统源码和论文
  • ssm+vue农家乐信息平台源码和论文
  • 安装启动yolo5教程
  • 封装redis 分布式锁 RedisCallback
  • 代码随想录算法训练营第17期第32天 | 122. 买卖股票的最佳时机 II、455.分发饼干、376. 摆动序列、53. 最大子序和
  • iOS HealthKit 介绍
  • Windows平台Unity下播放RTSP或RTMP如何开启硬解码?
  • 模板方法模式在JDBCTemplate中的应用
  • 如何在Debian中同步系统时间?Debian 系统时间配置(NTP服务)
  • 模板方法模式(十六)
  • 机器学习笔记之优化算法(十九)牛顿法与正则化
  • Java面试之单例模式的六种实现方式
  • re正则入门
  • C++ Day5