Web开发

首页 » 常识 » 预防 » GoWeb开发解析API查询参数
TUhjnbcbe - 2022/6/2 21:43:00
接下来的内容,我们将重点介绍如何为GET/v1/movies接口构建高级功能,该接口将以JSON数组的形式返回多个movie详细信息。MethodURL动作GET/v1/healthcheck显示应用程序运行状况和版本信息POST/v1/movies添加新的电影GET/v1/movies/:id根据id查询特定电影PUT/v1/movies/:id更新特定电影DELETE/v1/movies/:id删除特定电影GET/v1/movies查询电影详情列表我们将逐步为这个接口开发额外功能,首先返回所有影片的数据,然后通过添加过滤、排序和分页功能逐渐使其变得更实用。在后面的内容中你将学到:在一个JSON响应中返回多个资源的详细信息。接受并应用可选参数来缩小返回的数据集。使用PostgreSQL的内置功能在数据库字段上实现全文搜索。接受并安全地使用排序参数来对数据库查询结果排序。开发一个实用、可重用的模式来支持大数据集分页,并在JSON响应中返回分页元数据。下面开始第一部分内容:解析API请求中的查询参数。解析查询参数在接下来的几节中,我们将配置GET/v1/movies接口,以便客户端能够通过查询字符串参数返回所需电影数据。例如:

/v1/movies?title=godfathergenres=crime,dramapage=1page_size=5sort=-year如果客户端发送以上查询请求,意味着向接口传递的信息是:请返回电影名称包含"godfather",电影类型是crime和drama类型,根据年份降序排序的前5条数据。在sort参数中使用“-“符号表示结果降序排序。例如,参数sort=title指的是根据电影名称按字母升序排序,而sort=-title就是降序。首先,需要做的就是如何将这些参数解析到Go代码中。在Go中可以使用r.URL.Query()函数来解析查询参数。该函数返回url.Values()类型,是一个包含查询参数的map类型。我们可以使用Get()方法提取查询参数,如果参数值存在就返回否则返回空字符串。在我们的示例中,还需要对其中一些查询字符串值执行额外的处理。具体地说:genre参数可能会包含多个用逗号隔开的值,例如:genres=crime,drama。我们需要将这些值分开并存放在一个[]string切片中。page和page_size参数值是数字,需要将字符串转为int类型。除此之外:还需要对这些参数做校验,例如page和page_size不能是负数。如果page,page_size和sort客户端没有提供值的话,需要设置默认值。创建帮助函数为此,我们将创建三个新的帮助函数:readString()、readInt()和readCSV()。我们将使用这些帮助函数从查询字符串中提取和解析值,或者在必要时返回一个默认值。在cmd/api/helpers.go文件添加以下代码:

//readString从查询字符串中返回一个字符串值,如果没有匹配的key就返回默认值func(app*application)readString(qsurl.Values,keystring,defaultValuestring)string{s:=qs.Get(key)ifs==""{returndefaultValue}returns}//readCSV从查询中读取一个字符串并根据逗号分割,返回一个字符串切片func(app*application)readCSV(qsurl.Values,keystring,defaultValue[]string)[]string{csv:=qs.Get(key)ifcsv==""{returndefaultValue}returnstrings.Split(csv,",")}//readInt从查询字符串中读取值,并将字符串值转为int类型func(app*application)readInt(qsurl.Values,keystring,defaultValueint,v*validator.Validator)int{s:=qs.Get(key)ifs==""{returndefaultValue}i,err:=strconv.Atoi(s)iferr!=nil{v.AddError(key,"mustbeintegervalue")returndefaultValue}returni}添加API处理程序和路由接下来,我们为GET/v1/movies接口创建新的API处理程序:listMoviesHandler。为了演示请求参数解析,当前这个处理程序仅使用帮助函数来解析请求中的查询参数,将解析出来的参数返回给客户端。如果你跟随本系列文章操作的话,接下来创建listMoviesHandler,如下所示:File:cmd/api/movies.go

packagemain...func(app*application)listMoviesHandler(w

1
查看完整版本: GoWeb开发解析API查询参数