首页 > 后端开发 > Golang > 正文

使用 Go 构建您的第一个 REST API

Linda Hamilton
发布: 2024-10-02 14:07:30
原创
112 人浏览过

Building Your First REST API with Go

使用 Go 构建您的第一个 REST API – 让我们开始吧!

那么,您已经听说过有关 Go 的热议,对吧?它快速、简单,基本上是当今后端开发的摇滚明星。如果您是 Go 新手或者只是想用它构建一些很酷的东西,那么您来对地方了。本周,我们将深入研究如何使用 Go 构建您自己的 REST API,所以系好安全带——这将是一次有趣的旅程!

为什么去?

现在,到底为什么这么多开发者对 Go 着迷呢?好吧,想象一下:谷歌工程师厌倦了等待他们的程序编译,决定创建一些不会让他们想要抓狂的东西。输入 Go——一种不仅可以完成工作,而且可以快速、轻松地完成工作的语言。

Go 是为当今的硬件而构建的,充分利用了多核系统。它的秘密武器? Goroutines——这些神奇的小型并发工作者,可以毫不费力地同时处理大量任务。无论您是在构建 Web 应用程序、API 还是微服务,Go 都能让一切顺利运行,就像您一直梦想的运转良好的机器一样。

最重要的是:Go 非常容易学。无论您是从 Python、Java 还是像 PHP 这样“经典”的东西切换过来,在说“Hello,World!”之前,您都将开始使用 Go 进行编码。而且它运行——非常快。还需要我多说吗?

设置您的 Go 项目

好了,闲聊够了,让我们动手吧。首先,我们需要建立一个简单的 Go 项目。别担心,我已经帮你解决了:

  1. 确保已安装 Go。如果没有,请在这里获取。

  2. 现在,让我们创建一个项目目录并初始化项目:

   mkdir go-rest-api
   cd go-rest-api
   go mod init github.com/yourusername/go-rest-api
登录后复制
  1. 在此目录中,创建一个名为 main.go 的新文件,并准备好进行一些编码魔法。

编写API

这就是事情变得令人兴奋的地方!我们将构建一个超级简单的 API 来管理书籍列表(因为谁不喜欢书籍?)。我们的 API 将具有以下端点:

  • GET /books – 获取所有书籍(耶,书籍!)
  • POST /books – 添加新书
  • GET /books/:id – 通过 ID 获取特定书籍(因为并非所有书籍都是一样的)

准备好了吗?让我们深入研究代码:

package main

import (
    "encoding/json"
    "fmt"
    "log"
    "net/http"
    "strconv"

    "github.com/gorilla/mux"
)

type Book struct {
    ID     int    `json:"id"`
    Title  string `json:"title"`
    Author string `json:"author"`
}

var books []Book

// Get all books
func getBooks(w http.ResponseWriter, r *http.Request) {
    w.Header().Set("Content-Type", "application/json")
    json.NewEncoder(w).Encode(books)
}

// Get a single book by ID
func getBook(w http.ResponseWriter, r *http.Request) {
    params := mux.Vars(r)
    id, err := strconv.Atoi(params["id"])
    if err != nil {
        http.Error(w, "Invalid book ID", http.StatusBadRequest)
        return
    }
    for _, book := range books {
        if book.ID == id {
            w.Header().Set("Content-Type", "application/json")
            json.NewEncoder(w).Encode(book)
            return
        }
    }
    http.Error(w, "Book not found", http.StatusNotFound)
}

// Add a new book
func createBook(w http.ResponseWriter, r *http.Request) {
    var book Book
    _ = json.NewDecoder(r.Body).Decode(&book)
    book.ID = len(books) + 1 // Assign an ID (we’re just winging it here)
    books = append(books, book)
    w.Header().Set("Content-Type", "application/json")
    json.NewEncoder(w).Encode(book)
}

func main() {
    // Add some dummy data to start with
    books = append(books, Book{ID: 1, Title: "The Go Programming Language", Author: "Alan A. A. Donovan"})
    books = append(books, Book{ID: 2, Title: "Learning Go", Author: "Jon Bodner"})

    // Initialize the router
    r := mux.NewRouter()

    // Define the endpoints
    r.HandleFunc("/books", getBooks).Methods("GET")
    r.HandleFunc("/books/{id}", getBook).Methods("GET")
    r.HandleFunc("/books", createBook).Methods("POST")

    // Start the server
    fmt.Println("Server is running on port 8000...")
    log.Fatal(http.ListenAndServe(":8000", r))
}
登录后复制

分解它

  1. Mux Router:我们使用 gorilla/mux 来处理 API 中的路由。它可以轻松定义路由,并且是在 Go 中构建 Web 服务的首选。您可以使用以下命令安装它:
   go get -u github.com/gorilla/mux
登录后复制
  1. 处理程序:我们设置了 getBooks、getBook 和 createBook 函数来处理 HTTP 请求。他们使用 Go 的 net/http 包来处理响应和数据编码/解码。简单!

  2. JSON 编码:Go 内置的 json 包在这里完成繁重的工作,将我们的数据转换为 JSON 格式,以便客户端和 API 之间轻松通信。

运行 API

现在到了有趣的部分——让我们运行这个东西!在您的终端中,只需执行:

go run main.go
登录后复制

繁荣!您的 API 已启动并正在运行。您现在可以使用Postman或curl等工具来测试它:

  • 获取所有书籍
  curl http://localhost:8000/books
登录后复制
  • 获取一本特定的书
  curl http://localhost:8000/books/1
登录后复制
  • 添加新书
  curl -X POST http://localhost:8000/books -d '{"title":"New Book","author":"New Author"}' -H "Content-Type: application/json"
登录后复制

接下来是什么?

这个小 API 只是 Go 在后端开发中的冰山一角。下周,我们将通过添加身份验证(是的,我们将采用完整的 JWT)并保护这些端点免受不需要的访问者的侵害来进行升级。

敬请关注第 2 部分——在 Go 中使用 JWT(JSON Web 令牌)在 REST API 中设置用于身份验证的中间件

以上是使用 Go 构建您的第一个 REST API的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:dev.to
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!