请求处理程序开发方法

最近更新时间:2022-08-31 20:45:05

查看PDF

本文介绍在云函数KCF中使用Golang语言开发请求处理程序的相关概念和方法。

请求处理程序分为事件请求处理程序(Event Handler)和HTTP请求处理程序(HTTP Handler);其中事件请求由各种事件源触发生成,HTTP请求则由HTTP触发器触发生成。

请求处理程序的具体配置示例如下:

事件请求处理程序(Event Handler)

介绍Go事件请求处理程序的结构和特点。

使用示例

在Go语言的代码中,使用go mod引入cloudevents官方的SDK库 :

go get github.com/cloudevents/sdk-go/[email protected]

在开发代码中导入cloudevents包依赖

import cloudevents "github.com/cloudevents/sdk-go/v2"
cloudevents + Gorilla框架 代码示例
package main

import (
	"context"
	"fmt"
	cloudevents "github.com/cloudevents/sdk-go/v2"
	"github.com/google/uuid"
	"github.com/gorilla/mux"
	"io/ioutil"
	"log"
	"net/http"
)
  
func main() {
	ctx := context.Background()
	p, err := cloudevents.NewHTTP()
	if err != nil {
		log.Fatalf("failed to create protocol: %s", err.Error())
	}

	eventReceiverHandler, err := cloudevents.NewHTTPReceiveHandler(ctx, p, eventHandler)
	if err != nil {
		log.Fatalf("failed to create handler: %s", err.Error())
	}
	router := mux.NewRouter()

	//healthCheck api
	router.HandleFunc("/health", healthHandler).Methods("GET")
	//event api
	router.Handle("/event-invoke", eventReceiverHandler).Methods("POST")

	log.Printf("will listen on :8080\n")
	if err := http.ListenAndServe(":8080", router); err != nil {
		log.Fatalf("unable to start http server, %s", err)
	}
}

// example API handler
func healthHandler(w http.ResponseWriter, r *http.Request) {
	log.Printf("receive health check message")
	w.WriteHeader(http.StatusOK)
	w.Write([]byte("health up"))
}

// example API handler with CloudEvents
func eventHandler(event cloudevents.Event) (*cloudevents.Event, error) {
	// do something with event.
	fmt.Printf("%s", event)
	return nil, nil
}

示例解析如下:

  • package main: 在Go语言中,Go应用程序都包含一个名为main的包。
  • func main():运行函数代码的入口点,Go程序必须包含main函数。
  • import:需要引用的依赖包,主要包括以下包:
    • github.com/cloudevents/sdk-go/v2: cloudevents的核心库。
    • github.com/gorilla/mux Web开发工具包中的路由管理库。
    • net/http:Go web服务器。
  • 处理事件请求的方法(即Event Handler),参数含义如下:
    • event cloudevents.Event:事件请求时传入的cloudevent格式数据。
cloudevents + gin框架 代码示例
package main

import (
	cloudevents "github.com/cloudevents/sdk-go/v2"
	"github.com/gin-gonic/gin"
	"io/ioutil"
	"log"
)

func main() {
	r := gin.Default()
	r.GET("/health", func(c *gin.Context) {
		c.JSON(200, gin.H{
			"message": "health up",
		})
	})
	r.POST("/event-invoke", eventHandlerDirect)
	r.NoRoute(func(c *gin.Context) {
		c.JSON(404, gin.H{
			"message": "not found",
		})
	})
	log.Printf("will listen on :8080\n")
	if err := r.Run(":8080"); err != nil {
		log.Fatalf("unable to start http server, %s", err)
	}
}

func eventHandlerDirect(c *gin.Context) {
	log.Printf("receive cloudevent")
	// Unmarshal JSON To cloudevents
	event := cloudevents.NewEvent()
	bytes, _ := ioutil.ReadAll(c.Request.Body)
	err := event.UnmarshalJSON(bytes)
	//err := c.Bind(&event)
	if err != nil {
		log.Printf("Unmarshal cloutevent error: %s", err.Error())
		c.JSON(400, gin.H{
			"message": err.Error(),
		})
		return
	}
	// decode body data
	data := &Sample{}
	if err := event.DataAs(data); err != nil {
		log.Printf("failed to get playload data: %s", err)
		c.JSON(400, gin.H{
			"message": "bad data",
		})
		return
	}
	log.Printf("get playload data: %s\n", data)
	log.Printf("----------------------------\n")
	c.JSON(200, gin.H{
		"message": "receive cloudevent success",
	})
}

示例解析如下:

  • package main: 在Go语言中,Go应用程序都包含一个名为main的包。
  • func main():运行函数代码的入口点,Go程序必须包含main函数。
  • import:需要引用的依赖包,主要包括以下包:
    • github.com/cloudevents/sdk-go/v2: cloudevents的核心库。
    • github.com/gin-gonic/gin Go Web服务器。
  • 处理事件请求的方法(即Event Handler),参数含义如下:
    • context:云函数Go语言的Context对象。

cloudevents详细介绍:

HTTP请求处理程序(HTTP Handler)

介绍Go Http请求处理程序的结构和特点

使用示例

代码示例

package main

import (
	"fmt"
	"github.com/gorilla/mux"
	"io/ioutil"
	"log"
	"net/http"
)

func main() {
	router := mux.NewRouter()
	//healthCheck api
	router.HandleFunc("/health", healthHandler).Methods("GET")
	//http api
	router.HandleFunc("/http-invoke", postHandler).Methods("POST")
	router.HandleFunc("/http-invoke", getHandler).Methods("GET")
	router.HandleFunc("/http-invoke", patchHandler).Methods("PATCH")
	router.HandleFunc("/http-invoke", deleteHandler).Methods("DELETE")
	router.HandleFunc("/http-invoke", putHandler).Methods("PUT")

	log.Printf("will listen on :8080\n")
	if err := http.ListenAndServe(":8080", router); err != nil {
		log.Fatalf("unable to start http server, %s", err)
	}
}

// example API handler
func healthHandler(w http.ResponseWriter, r *http.Request) {
	log.Printf("receive health check message")
	w.WriteHeader(http.StatusOK)
	w.Write([]byte("health up"))
}

func postHandler(w http.ResponseWriter, r *http.Request) {
	log.Printf("receive http post message")
	// do something with api request
	s, _ := ioutil.ReadAll(r.Body) //读取body内容
	// return
	fmt.Fprintf(w, "%s", s)
}

func getHandler(w http.ResponseWriter, r *http.Request) {
	log.Printf("receive http get message")
	// do something with api request
	uri := r.RequestURI
	log.Printf("uri: %v", uri)
	// return
	fmt.Fprintf(w, "%s", "ok")
}

func putHandler(w http.ResponseWriter, r *http.Request) {
	log.Printf("receive http put message")
	// do something with api request
	w.WriteHeader(http.StatusOK)
}

func patchHandler(w http.ResponseWriter, r *http.Request) {
	log.Printf("receive http patch message")
	// do something with api request
	w.WriteHeader(http.StatusOK)
}

func deleteHandler(w http.ResponseWriter, r *http.Request) {
	log.Printf("receive http delete message")
	// do something with api request
	w.WriteHeader(http.StatusOK)
}

示例解析如下:

  • package main: 在Go语言中,Go应用程序都包含一个名为main的包。
  • func main():运行函数代码的入口点,Go程序必须包含main函数。
  • import:需要引用云函数依赖的包,主要包括以下包:
    • github.com/gorilla/mux Web开发工具包中的路由管理库。
    • net/http:Go web服务器。
  • 处理HTTP请求的方法(即HTTP Handler),参数含义如下:
    • w http.ResponseWriter:HTTP Handler的响应接口,可以设置状态行、消息头和响应正文。
    • r *http.Request:HTTP Handler的请求接口,包含请求行、请求头和请求正文
    • w.WriteHeader(http.StatusOK):填入响应的HTTP状态码。
    • w.Write([]byte(“health up”)):填入响应的消息体。

文档内容是否对您有帮助?

根本没帮助
文档较差
文档一般
文档不错
文档很好

在文档使用中是否遇到以下问题

内容不全,不深入
内容更新不及时
描述不清晰,比较混乱
系统或功能太复杂,缺乏足够的引导
内容冗长

更多建议

0/200

评价建议不能为空

提交成功!

非常感谢您的反馈,我们会继续努力做到更好!

问题反馈