Web 应用
若要使用自定义处理程序,则需要创作 Web 应用程序。 编写并编译应用程序后,需要配置 Azure Functions 主机,以便其知道如何使用该应用程序。 稍后我们将浏览更多内容。 首先,如何在 Go 中构建 Web 应用程序?
在 Go 中构建 REST API
若要使用 Go 构建 REST API,需要了解以下几点:
导入库。 你将使用库
fmt
、log
和net/http
。 这些库将帮助你管理路由、处理传入请求和日志记录。 使用以下导入语句:import ( "fmt", "log", "net/http" )
设置路由。 REST API 包括被称为“路由”的逻辑分区。 路由是响应应用中特定问题的地址。 若要设置路由,请在
http
实例上调用HandleFunc()
方法并定义响应请求的路由:http.HandleFunc("/", handleRoute)
在这种情况下,需要创建一个
handleRoute
函数,以将传入请求与路由"/"
匹配。管理请求。 需要管理传入请求并读取路由器、查询参数或发布的正文等内容。 然后,需要构造响应。 处理请求的函数可能如下所示:
func handleRequest(w: http:ResponseWriter, r: http.Request) { fmt.Fprintf(w, "My first REST API") }
该代码将文本“我的第一个 REST API”发送回调用客户端。 方法
Fprintf()
采用了两个参数:响应流和要发回的字符串。创建服务器。 若要能够侦听请求,需要启动服务器。 还需要指定可向其发送请求的部分。 以下代码演示了如何创建服务器:
http.ListenAndServe(":3000", nil)
服务器现已启动,可以侦听端端口 3000 上的请求。
创建 Azure Functions 应用
在开发 Azure Functions 应用之前,我们建议你:
安装 Visual Studio Code。 可以使用任何文本编辑器或 IDE 创作 Azure Functions 应用。 本模块展示了一些简化创作的扩展。
安装适用于 Azure Functions 的 Visual Studio Code 扩展。 此扩展将帮助你对 Functions 应用进行构架、运行和调试。
安装 Azure Functions Core Tools。 此安装包括
func
可执行命令,该命令支持运行 Functions 应用等。
使用 Visual Studio Code 构架 Functions 应用
在系统上安装了所有需要的依赖项后,下一步是构架应用程序。 当系统询问运行时相关事宜时,请选择“自定义处理程序”。
现在已确保将生成正确的文件。 以这种方式生成项目时,需要为第一个函数选择触发器类型。 自定义处理程序适用于所有常用触发器和绑定。
完成项目生成后,应该会有一个提供下列文件的应用:
- host.json
- local.setting.json
- proxies.json
- function.json
“function.json”文件位于其名称与所命名的第一个函数的名称相对应的目录中。 将使用此文件来配置函数。
配置项目
为了让你的应用适用于 HTTP 基元,需要配置以下各项:
侦听自定义处理程序端口。 应用需要侦听特定端口。 变量
FUNCTIONS_CUSTOMHANDLER_PORT
包含所需的值。 可以使用以下代码查找端口值:customHandlerPort, exists := os.LookupEnv("FUNCTIONS_CUSTOMHANDLER_PORT")
配置默认的可执行文件路径。 由于要构建一个可执行文件,因此需要向 Functions 应用项目告知其所在的位置。
在项目根目录下查找“function.json”文件。 在
customHandler
部分中,指定defaultExecutablePath
。 下面是可以看到的示例:"customHandler": { "defaultExecutablePath": "mygoapp.exe" }
启用请求转发。 处理使用 HTTP 触发器的函数时,如果要处理其他类型的触发器(如队列触发器),则需要将应用配置为略有不同。
启用名为
enableForwardingHttpRequest
的属性。 启用此属性后,它将以下列方式更改处理请求的行为:原始请求的副本。 HTTP 请求不包含自定义处理程序的请求有效负载。 Functions 主机使用原始 HTTP 请求的副本调用处理程序。
与原始请求相同的路径。 Functions 主机通过与原始请求相同的路径调用处理程序。
在定义路由和路由处理程序时,需要具体了解如何设置路由。 假设你拥有以下项目大纲:
hello/ function.json
默认情况下,大纲中的文件将映射到路由
/api/hello
。 在设置路由的代码中,需要指定完整路由:mux.HandleFunc("/api/hello", helloHandler)
如果尚未启用此设置,则对于其他类型的触发器和绑定,指定路由器代码为
"/hello"
足以满足需要。处理程序的响应副本。 Functions 主机返回处理程序的 HTTP 响应副本作为对原始请求的响应。
在前面的示例中,可执行文件为 mygoapp.exe
。 该示例假设你要从名为 mygoapp.go
的文件创建可执行文件,但你可以将你的 Go 文件命名为你需要的任何内容。 在 Linux 或 macOS 上,可执行文件没有扩展名。
生成应用
此时构建 Web 应用与使用“Go”构建任何 Web 应用没有太大区别。 只要完成了上一部分中所述的配置,便表示你已完成所有设置。
现在需要执行以下步骤:
- 读取端口。
- 实例化 HTTP 服务器实例。
- 定义路由和路由处理程序。
- 开始侦听端口。
customHandlerPort, exists := os.LookupEnv("FUNCTIONS_CUSTOMHANDLER_PORT")
if !exists {
customHandlerPort = "8080"
} // 1)
mux := http.NewServeMux() // 2)
mux.HandleFunc("/order", orderHandler) // 3)
fmt.Println("Go server Listening on: ", customHandlerPort)
log.Fatal(http.ListenAndServe(":"+customHandlerPort, mux)) // 4)