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

相关推荐
\光辉岁月/36 分钟前
5.java-数组
java·开发语言
Java后端的Ai之路37 分钟前
Python进阶探索29_eval内置函数
开发语言·python·探索·eval·内置函数
谢亮_vipxieliang1 小时前
Spring 事务失效的常见场景
java·开发语言·数据库·spring boot
时间的拾荒人1 小时前
Qt 多线程详解:从 QThread 到实战
开发语言·qt·面试
郑州光合科技余经理1 小时前
海外版外卖加盟:总站与分站配送规则怎么分开管
java·开发语言·前端·后端·uni-app·php·ai编程
2601_962071571 小时前
类变量和全局变量的生命周期有什么区别?
java·开发语言·jvm
91刘仁德1 小时前
HTTP协议详解:从URL到HTTP服务器的完整实战
服务器·网络·笔记·网络协议·http
Wang's Blog2 小时前
Java 项目实战: 外卖平台优化-前后端分离开发模式与工程拆分
java·开发语言
Dovis(誓平步青云)2 小时前
浇水提醒刚弹出又消失,植物状态别只存一个百分比
开发语言·前端·javascript·pdf·ecmascript·电脑
sunshine22 girl3 小时前
Java学习六 Java常见API-2--String-3-字符串的截取替换和其他方法
java·开发语言·学习