Web 应用

已完成

若要使用自定义处理程序,则需要创作 Web 应用程序。 编写并编译应用程序后,需要配置 Azure Functions 主机,以便其知道如何使用该应用程序。 稍后我们将浏览更多内容。 首先,如何在 Go 中构建 Web 应用程序?

在 Go 中构建 REST API

若要使用 Go 构建 REST API,需要了解以下几点:

  • 导入库。 你将使用库 fmtlognet/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 构架 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 应用没有太大区别。 只要完成了上一部分中所述的配置,便表示你已完成所有设置。

现在需要执行以下步骤:

  1. 读取端口。
  2. 实例化 HTTP 服务器实例。
  3. 定义路由和路由处理程序。
  4. 开始侦听端口。
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)