编写一个 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 main
import (
"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写入响应header
for 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.RemoteAddr
statusCode := http.StatusOK
log.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.go
FROM busybox
COPY --from=build /httpserver/httpserver /httpserver/httpserver
EXPOSE 8080
WORKDIR /httpserver/
ENTRYPOINT ["./httpserver"]`