golang实现一个简单的HTTP server

目标:用golang实现一个简单的HTTP Server,支持指定监听端口,将收到的POST的payload中的内容打印出来

golang环境准备

Server的实现

  • 直接贴

    admin@hpc-1:~/go$ cat http_rpc_server.go
    package main

    import (
    "fmt"
    "log"
    "flag"
    "net/http"
    "encoding/json"
    )

    // 定义一个用于接收请求的结构体
    type MapPrinter struct{}

    // 定义一个用于接收请求的方法
    func (m *MapPrinter) PrintMap(w http.ResponseWriter, r *http.Request) {
    if r.Method != http.MethodPost {
    http.Error(w, "Method not allowed", http.StatusMethodNotAllowed)
    return
    }

      var payload map[string]interface{}
      err := json.NewDecoder(r.Body).Decode(&payload)
      if err != nil {
          http.Error(w, "Invalid payload", http.StatusBadRequest)
          return
      }
    
      fmt.Println("Received payload:")
      for key, value := range payload {
          fmt.Printf("%s: %v\n", key, value)
      }
    
      w.WriteHeader(http.StatusOK)
      w.Write([]byte("Map printed successfully\n"))
    

    }

    func main() {
    //获取监听端口,默认8080
    port := flag.String("p", "8080", "指定监听端口")
    // 解析命令行参数
    flag.Parse()

      //注册abc-api路由
      http.HandleFunc("/abc-api", new(MapPrinter).PrintMap)
    
      fmt.Println("Server is listening on port %s...", *port)
      log.Fatal(http.ListenAndServe(":" + *port, nil))
    

    }
    admin@hpc-1:~/go$

  • 编译

    admin@hpc-1:~/go$ go build -o http_rpc_server http_rpc_server.go
    admin@hpc-1:~/go$

  • 终端1上,运行server监听8090端口

    admin@hpc-1:~/go$ ./http_rpc_server -p 8090
    Server is listening on port 8090...

验证

  • 使用curl在终端2上发送POST Request,payload带着map(字典)

    admin@hpc-1:~$ curl -vX POST -H "Content-Type: application/json" -d '{"key1":"value1", "key2":"value2"}' http://localhost:8090/abc-api
    Note: Unnecessary use of -X or --request, POST is already inferred.

    • Trying 127.0.0.1:8090...
    • TCP_NODELAY set
    • Connected to localhost (127.0.0.1) port 8090 (#0)

    POST /abc-api HTTP/1.1
    Host: localhost:8090
    User-Agent: curl/7.68.0
    Accept: /
    Content-Type: application/json
    Content-Length: 34

    • upload completely sent off: 34 out of 34 bytes
    • Mark bundle as not supporting multiuse
      < HTTP/1.1 200 OK
      < Date: Sun, 28 Jan 2024 00:51:25 GMT
      < Content-Length: 25
      < Content-Type: text/plain; charset=utf-8
      <
      Map printed successfully
    • Connection #0 to host localhost left intact
      admin@hpc-1:~$
  • 回看终端1,已经将map解析并打印出来

    admin@hpc-1:~/go$ ./http_rpc_server -p 8090
    Server is listening on port %s... 8090
    Received payload:
    key1: value1
    key2: value2

相关推荐
ZSYP-S19 分钟前
Day 15:Spring 框架基础
java·开发语言·数据结构·后端·spring
yuanbenshidiaos22 分钟前
c++------------------函数
开发语言·c++
程序员_三木34 分钟前
Three.js入门-Raycaster鼠标拾取详解与应用
开发语言·javascript·计算机外设·webgl·three.js
是小崔啊44 分钟前
开源轮子 - EasyExcel01(核心api)
java·开发语言·开源·excel·阿里巴巴
tianmu_sama1 小时前
[Effective C++]条款38-39 复合和private继承
开发语言·c++
黄公子学安全1 小时前
Java的基础概念(一)
java·开发语言·python
liwulin05061 小时前
【JAVA】Tesseract-OCR截图屏幕指定区域识别0.4.2
java·开发语言·ocr
jackiendsc1 小时前
Java的垃圾回收机制介绍、工作原理、算法及分析调优
java·开发语言·算法
Oneforlove_twoforjob1 小时前
【Java基础面试题027】Java的StringBuilder是怎么实现的?
java·开发语言
羚羊角uou1 小时前
【C++】优先级队列以及仿函数
开发语言·c++