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

相关推荐
WJ.Polar11 小时前
Java封装、继承、多态
java·开发语言
96245611 小时前
Go EVM 链上数据平台实践:从 RPC Demo 到可演进架构
rpc·架构·golang
摇滚侠11 小时前
Java 中如何表示负数,有符号和无符号的区别,补码的计算规则,char byte short int long 的范围
java·开发语言
weixin_3077791311 小时前
C++代码实现MATLAB中的fitrtree函数功能
开发语言·c++·算法·matlab
爱读书的小胖12 小时前
Codewars:Rot13(C)解题分析
c语言·开发语言
鸽鸽程序猿12 小时前
【项目】【在线判题系统】b端题目增删改
开发语言·python
Lhappy嘻嘻12 小时前
读懂 JVM:内存模型、类加载机制、分代回收
java·开发语言·jvm
weixin_3077791313 小时前
C++代码实现MATLAB中的spectralcluster函数功能
开发语言·c++·算法·matlab
鸽鸽程序猿13 小时前
【项目】【在线判题系统】c端:竞赛报名
c语言·开发语言