/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