首页 后端开发 Golang 将分页提升到新的水平:Go API 中的排序和过滤

将分页提升到新的水平:Go API 中的排序和过滤

Jan 23, 2025 am 12:38 AM

在上一篇文章中,我们解决了分页将大型 API 响应分解为可管理的块的问题。但是,如果您曾经想让用户控制数据的排序方式过滤特定结果,那么您就可以进行下一步:排序并且过滤
让我们深入研究并通过添加这些功能使我们的 API 变得更加强大。

如果您尚未完成之前的教程,请点击此处。

为什么排序和过滤很重要

Image description
单独分页并不总是足够的。想象一下,用户搜索最新的项目或仅搜索在特定时间范围内创建的项目。排序和过滤让用户:

- 排序: 选择结果的顺序(例如最新到最旧)
- 过滤器: 将结果缩小到他们需要的范围(例如今天创建的项目)

通过将分页与排序和过滤相结合,我们创建了一个更加用户友好的 API。

扩展我们的数据库查询

我们将基于上一篇博客中的项目表进行构建。回顾一下,这是该计划:

CREATE TABLE items (
    id SERIAL PRIMARY KEY,
    name TEXT NOT NULL,
    created_at TIMESTAMP DEFAULT NOW()
);
登录后复制
登录后复制

添加排序

排序就是对结果进行排序。我们将允许用户按名称或created_at列以升序或降序排序。

第 1 步:接受排序参数

用户将传递两个查询参数:

  • sort :要排序的列(名称或created_at)。
  • order :排序方向( asc 或 desc )。

示例网址:

/items?page=1&limit=10&sort=created_at&order=desc
登录后复制
登录后复制

第2步:调整SQL查询

我们将动态修改 SQL 查询以包括排序:

// Extract sort and order query parameters
sort := r.URL.Query().Get("sort")
order := r.URL.Query().Get("order")

// Validate the sort column
validSortColumns := map[string]bool{"name": true, "created_at": true}
if !validSortColumns[sort] {
    sort = "created_at" // Default sort column
}

// Validate the sort order
if order != "asc" && order != "desc" {
    order = "asc" // Default sort order
}

// Modify the SQL query
query := fmt.Sprintf("SELECT id, name, created_at FROM items ORDER BY %s %s LIMIT  OFFSET ", sort, order)
rows, err := db.Query(query, limit, offset)
if err != nil {
    http.Error(w, "Failed to fetch items", http.StatusInternalServerError)
    return
}
登录后复制
登录后复制

添加过滤

过滤让用户可以优化他们的搜索。例如,我们可以按日期范围过滤项目或名称中包含特定关键字的项目。

第 1 步:接受过滤器参数

我们将支持两个过滤器:

  • name : 搜索包含特定子字符串的项目。
  • created_after :获取在特定日期之后创建的项目。

示例网址:

/items?page=1&limit=10&name=Item&created_after=2025-01-10 20:38:57.832777
登录后复制
登录后复制

第2步:调整SQL查询

我们将添加 WHERE 条件来处理这些过滤器:

CREATE TABLE items (
    id SERIAL PRIMARY KEY,
    name TEXT NOT NULL,
    created_at TIMESTAMP DEFAULT NOW()
);
登录后复制
登录后复制

测试增强型 API

  • 按名称升序排列:
/items?page=1&limit=10&sort=created_at&order=desc
登录后复制
登录后复制
  • 过滤在特定日期之后创建的项目:
// Extract sort and order query parameters
sort := r.URL.Query().Get("sort")
order := r.URL.Query().Get("order")

// Validate the sort column
validSortColumns := map[string]bool{"name": true, "created_at": true}
if !validSortColumns[sort] {
    sort = "created_at" // Default sort column
}

// Validate the sort order
if order != "asc" && order != "desc" {
    order = "asc" // Default sort order
}

// Modify the SQL query
query := fmt.Sprintf("SELECT id, name, created_at FROM items ORDER BY %s %s LIMIT  OFFSET ", sort, order)
rows, err := db.Query(query, limit, offset)
if err != nil {
    http.Error(w, "Failed to fetch items", http.StatusInternalServerError)
    return
}
登录后复制
登录后复制
  • 组合过滤器和排序:
/items?page=1&limit=10&name=Item&created_after=2025-01-10 20:38:57.832777
登录后复制
登录后复制

要避免的常见错误

不验证用户输入:允许任意列或无效的排序顺序可能会使您的数据库遭受 SQL 注入。始终验证输入。

结论/后续步骤

您可以在此处找到本教程的完整代码存储库

通过分页、排序和过滤,您的 API 现在更加用户友好和灵活。对于更高级的功能,请考虑添加:

  • 基于游标的分页适用于大型数据集。
  • 分面过滤用于复杂搜索。

请继续关注下一篇文章,我们将探索这些先进技术!

要获取有关 Golang 概念、项目等的更多信息并随时了解教程的最新动态,请在 Twitter 和 GitHub 上关注 Siddhesh。

在那之前继续学习继续建设 ??

以上是将分页提升到新的水平:Go API 中的排序和过滤的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

Debian OpenSSL有哪些漏洞 Debian OpenSSL有哪些漏洞 Apr 02, 2025 am 07:30 AM

OpenSSL,作为广泛应用于安全通信的开源库,提供了加密算法、密钥和证书管理等功能。然而,其历史版本中存在一些已知安全漏洞,其中一些危害极大。本文将重点介绍Debian系统中OpenSSL的常见漏洞及应对措施。DebianOpenSSL已知漏洞:OpenSSL曾出现过多个严重漏洞,例如:心脏出血漏洞(CVE-2014-0160):该漏洞影响OpenSSL1.0.1至1.0.1f以及1.0.2至1.0.2beta版本。攻击者可利用此漏洞未经授权读取服务器上的敏感信息,包括加密密钥等。

从前端转型后端开发,学习Java还是Golang更有前景? 从前端转型后端开发,学习Java还是Golang更有前景? Apr 02, 2025 am 09:12 AM

后端学习路径:从前端转型到后端的探索之旅作为一名从前端开发转型的后端初学者,你已经有了nodejs的基础,...

Go语言中用于浮点数运算的库有哪些? Go语言中用于浮点数运算的库有哪些? Apr 02, 2025 pm 02:06 PM

Go语言中用于浮点数运算的库介绍在Go语言(也称为Golang)中,进行浮点数的加减乘除运算时,如何确保精度是�...

Go的爬虫Colly中Queue线程的问题是什么? Go的爬虫Colly中Queue线程的问题是什么? Apr 02, 2025 pm 02:09 PM

Go爬虫Colly中的Queue线程问题探讨在使用Go语言的Colly爬虫库时,开发者常常会遇到关于线程和请求队列的问题。�...

在 Go 语言中,为什么使用 Println 和 string() 函数打印字符串会出现不同的效果? 在 Go 语言中,为什么使用 Println 和 string() 函数打印字符串会出现不同的效果? Apr 02, 2025 pm 02:03 PM

Go语言中字符串打印的区别:使用Println与string()函数的效果差异在Go...

Beego ORM中如何指定模型关联的数据库? Beego ORM中如何指定模型关联的数据库? Apr 02, 2025 pm 03:54 PM

在BeegoORM框架下,如何指定模型关联的数据库?许多Beego项目需要同时操作多个数据库。当使用Beego...

在Go语言中使用Redis Stream实现消息队列时,如何解决user_id类型转换问题? 在Go语言中使用Redis Stream实现消息队列时,如何解决user_id类型转换问题? Apr 02, 2025 pm 04:54 PM

Go语言中使用RedisStream实现消息队列时类型转换问题在使用Go语言与Redis...

GoLand中自定义结构体标签不显示怎么办? GoLand中自定义结构体标签不显示怎么办? Apr 02, 2025 pm 05:09 PM

GoLand中自定义结构体标签不显示怎么办?在使用GoLand进行Go语言开发时,很多开发者会遇到自定义结构体标签在�...

See all articles