淘先锋技术网

首页 1 2 3 4 5 6 7

编写一个 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"]`