当客户端在 发出POST请求时/albums,您希望将请求正文中描述的专辑添加到现有专辑数据中。
成都创新互联公司主要从事成都做网站、网站制作、成都外贸网站建设、网页设计、企业做网站、公司建网站等业务。立足成都服务班戈,10多年网站建设经验,价格优惠、服务专业,欢迎来电咨询建站服务:028-86922220
为此,您将编写以下内容:
1、编写代码
a.添加代码以将专辑数据添加到专辑列表。
在此代码中:
1)用于Context.BindJSON 将请求正文绑定到newAlbum。
2) album将从 JSON 初始化的结构附加到albums 切片。
3)向响应添加201状态代码,以及表示您添加的专辑的 JSON。
b.更改您的main函数,使其包含该router.POST函数,如下所示。
在此代码中:
1)将路径中的POST方法与 /albumspostAlbums函数相关联。
使用 Gin,您可以将处理程序与 HTTP 方法和路径组合相关联。这样,您可以根据客户端使用的方法将发送到单个路径的请求单独路由。
a.如果服务器从上一节开始仍在运行,请停止它。
b.从包含 main.go 的目录中的命令行,运行代码。
c.从不同的命令行窗口,用于curl向正在运行的 Web 服务发出请求。
该命令应显示添加专辑的标题和 JSON。
d.与上一节一样,使用curl检索完整的专辑列表,您可以使用它来确认添加了新专辑。
该命令应显示专辑列表。
当客户端向 发出请求时GET /albums/[id],您希望返回 ID 与id路径参数匹配的专辑。
为此,您将:
a.在您在上一节中添加的函数下方postAlbums,粘贴以下代码以检索特定专辑。
此getAlbumByID函数将提取请求路径中的 ID,然后找到匹配的专辑。
在此代码中:
(1)Context.Param用于从 URL 中检索id路径参数。当您将此处理程序映射到路径时,您将在路径中包含参数的占位符。
(2)循环album切片中的结构,寻找其ID 字段值与id参数值匹配的结构。如果找到,则将该album结构序列化为 JSON,并将其作为带有200 OK HTTP 代码的响应返回。
如上所述,实际使用中的服务可能会使用数据库查询来执行此查找。
(3)如果找不到专辑,则返回 HTTP 404错误。
b.最后,更改您的main,使其包含对router.GET的新调用,路径现在为/albums/:id ,如以下示例所示。
在此代码中:
(1)将/albums/:id路径与getAlbumByID功能相关联。在 Gin 中,路径中项目前面的冒号表示该项目是路径参数。
a.如果服务器从上一节开始仍在运行,请停止它。
b.在包含 main.go 的目录中的命令行中,运行代码以启动服务器。
c.从不同的命令行窗口,用于curl向正在运行的 Web 服务发出请求。
该命令应显示您使用其 ID 的专辑的 JSON。如果找不到专辑,您将收到带有错误消息的 JSON。
恭喜!您刚刚使用 Go 和 Gin 编写了一个简单的 RESTful Web 服务。
本节包含您使用本教程构建的应用程序的代码。
//分页函数
//定义函数pageft(),三个参数的含义为:
//$totle:信息总数;
//$displaypg:每页显示信息数,这里设置为默认是20;
//$url:分页导航中的链接,除了加入不同的查询信息“page”外的部分都与这个URL相同。
// 默认值本该设为本页URL(即$_SERVER["REQUEST_URI"]),但设置默认值的右边只能为常量,所以该默认值设为空字符串,在函数内部再设置为本页URL。
function pageft($totle, $displaypg = 20, $url = '', $shownum = 1, $showtext = 1, $showselect = 0, $showlvtao = 7) {
if(empty($totle)){
return false;
}
$page = isset($_GET['page'])?intval($_GET['page']):1;
$url.='/page/';
//页码计算:
$lastpg = ceil($totle / $displaypg); //最后页,也是总页数
$page = min($lastpg, $page);
$prepg = $page -1; //上一页
$nextpg = ($page == $lastpg ? 0 : $page +1); //下一页
$firstcount = ($page -1) * $displaypg;
//开始分页导航条代码:
if ($showtext == 1) {
$pagenav = 'div class="results"span第 ' . ($totle ? ($firstcount +1) : 0) . '-' . min($firstcount + $displaypg, $totle) . ' 条 共 '.$totle.'/span/divdivul class="pager"';
} else {
$pagenav = "";
}
//如果只有一页则跳出函数:
//if ($lastpg = 1)
//return false;
if ($prepg)
$pagenav .= 'lia href="'.$url.$prepg.'"laquo; 上一页/a/li';
else
$pagenav .= 'li class="disabled"laquo; 上一页/li';
if ($shownum == 1) {
$o = $showlvtao; //中间页码表总长度,为奇数
$u = ceil($o / 2); //根据$o计算单侧页码宽度$u
$f = $page - $u; //根据当前页$currentPage和单侧宽度$u计算出第一页的起始数字
//str_replace('{p}',,$fn)//替换格式
if ($f 0) {
$f = 0;
} //当第一页小于0时,赋值为0
$n = $lastpg; //总页数,20页
if ($n 1) {
$n = 1;
} //当总数小于1时,赋值为1
if ($page == 1) {
$pagenav .= 'li class="current"1/li';
} else {
$pagenav .= 'lia href="'.$url.'1"1/a/li';
}
///////////////////////////////////////
for ($i = 1; $i = $o; $i++) {
if ($n = 1) {
break;
} //当总页数为1时
$c = $f + $i; //从第$c开始累加计算
if ($i == 1 $c 2) {
$pagenav .= 'li class="separator".../li';
}
if ($c == 1) {
continue;
}
if ($c == $n) {
break;
}
if ($c == $page) {
$pagenav .= 'li class="current"' . $page . '/li';
} else {
$pagenav .= 'lia href="'.$url.$c.'"'.$c.'/a/li';
}
if ($i == $o $c $n -1) {
$pagenav .= 'li class="separator".../li';
}
if ($i $n) {
break;
} //当总页数小于页码表长度时
}
if ($page == $n $n != 1) {
$pagenav .= 'li class="current"' . $n . '/li';
} else {
if ($lastpg 1){
$pagenav .= 'lia href="'.$url.$n.'"'.$n.'/a/li';
}
}
}
if ($nextpg)
$pagenav .= 'lia href="'.$url.$nextpg.'"下一页 raquo;/a/li';
else
$pagenav .= 'li class="disabled"下一页 raquo;/li';
$pagenav .= '/ul/div';
if ($showselect == 1) {
//下拉跳转列表,循环列出所有页码:
$pagenav .= "跳至select name='topage' size='1' onchange='window.location=\"$url\"+this.value'\n";
for ($i = 1; $i = $lastpg; $i++) {
if ($i == $page)
$pagenav .= "option value='$i' selected$i/option\n";
else
$pagenav .= "option value='$i'$i/option\n";
}
$pagenav .= "/select页";
}
return $pagenav;
}
//数据查询页面
$page = array();
$page['url'] = U('Supervise/myefficiencybooklist',array('Status'=$_GET['Status']));
$page['pagesize'] = 16;
$page['frmnum'] = ($pagenum-1)*$page['pagesize'];
$Efficiencybook = M('efficiencybook','app_yhcm_supervise_');
$totle = $Efficiencybook-where('uid = '.$this-_G['userid'].$where)-count();
$page['totle'] = $totle;
$this-assign('page',$page);//将分页参数复制给模版变量
{:pageft($page['totle'],$page['pagesize'],$page['url'])}
以上是我一个项目里面用到的 你适当的改下就能用了
在写sql语句时,where的条件主要是 key=1 and key2=2 或者 key=1 or key2=2 这种形式[还有 and与or 混合]。
认真分析会发现条件有 4部分 组成-- 字段名、操作符、查询值、与前一个条件的关系[and,or] ,这样就很容易实现了。下面就是一个说明,为了简化,其中会默认省略一些特征。
启动项目
访问测试地址:
带分页的地址:
本教程介绍了使用 Godatabase/sql及其标准库中的包访问关系数据库的基础知识。
您将使用的database/sql包包括用于连接数据库、执行事务、取消正在进行的操作等的类型和函数。
在本教程中,您将创建一个数据库,然后编写代码来访问该数据库。您的示例项目将是有关老式爵士乐唱片的数据存储库。
首先,为您要编写的代码创建一个文件夹。
1、打开命令提示符并切换到您的主目录。
在 Linux 或 Mac 上:
在 Windows 上:
2、在命令提示符下,为您的代码创建一个名为 data-access 的目录。
3、创建一个模块,您可以在其中管理将在本教程中添加的依赖项。
运行go mod init命令,为其提供新代码的模块路径。
此命令创建一个 go.mod 文件,您添加的依赖项将在其中列出以供跟踪。
注意: 在实际开发中,您会指定一个更符合您自己需求的模块路径。有关更多信息,请参阅一下文章。
GO语言(二十五):管理依赖项(上)
GO语言(二十六):管理依赖项(中)
GO语言(二十七):管理依赖项(下)
接下来,您将创建一个数据库。
在此步骤中,您将创建要使用的数据库。您将使用 DBMS 本身的 CLI 创建数据库和表,以及添加数据。
您将创建一个数据库,其中包含有关黑胶唱片上的老式爵士乐录音的数据。
这里的代码使用MySQL CLI,但大多数 DBMS 都有自己的 CLI,具有类似的功能。
1、打开一个新的命令提示符。
在命令行,登录到您的 DBMS,如下面的 MySQL 示例所示。
2、在mysql命令提示符下,创建一个数据库。
3、切到您刚刚创建的数据库,以便您可以添加表。
4、在文本编辑器的 data-access 文件夹中,创建一个名为 create-tables.sql 的文件来保存用于添加表的 SQL 脚本。
将以下 SQL 代码粘贴到文件中,然后保存文件。
在此 SQL 代码中:
(1)删除名为album表。 首先执行此命令可以让您更轻松地稍后重新运行脚本。
(2)创建一个album包含四列的表:title、artist和price。每行的id值由 DBMS 自动创建。
(3)添加带有值的四行。
5、在mysql命令提示符下,运行您刚刚创建的脚本。
您将使用以下形式的source命令:
6、在 DBMS 命令提示符处,使用SELECT语句来验证您是否已成功创建包含数据的表。
接下来,您将编写一些 Go 代码进行连接,以便进行查询。
现在你已经有了一个包含一些数据的数据库,开始你的 Go 代码。
找到并导入一个数据库驱动程序,该驱动程序会将您通过database/sql包中的函数发出的请求转换为数据库可以理解的请求。
1、在您的浏览器中,访问SQLDrivers wiki 页面以识别您可以使用的驱动程序。
2、使用页面上的列表来识别您将使用的驱动程序。为了在本教程中访问 MySQL,您将使用 Go-MySQL-Driver。
3、请注意驱动程序的包名称 - 此处为github.com/go-sql-driver/mysql.
4、使用您的文本编辑器,创建一个用于编写 Go 代码的文件,并将该文件作为 main.go 保存在您之前创建的数据访问目录中。
5、进入main.go,粘贴以下代码导入驱动包。
在此代码中:
(1)将您的代码添加到main包中,以便您可以独立执行它。
(2)导入 MySQL 驱动程序github.com/go-sql-driver/mysql。
导入驱动程序后,您将开始编写代码以访问数据库。
现在编写一些 Go 代码,让您使用数据库句柄访问数据库。
您将使用指向结构的指针sql.DB,它表示对特定数据库的访问。
编写代码
1、进入 main.go,在import您刚刚添加的代码下方,粘贴以下 Go 代码以创建数据库句柄。
在此代码中:
(3)使用 MySQL 驱动程序Config和FormatDSN类型以收集连接属性并将它们格式化为连接字符串的 DSN。
该Config结构使代码比连接字符串更容易阅读。
(4)调用sql.Open 初始化db变量,传递 FormatDSN。
(5)检查来自 的错误sql.Open。例如,如果您的数据库连接细节格式不正确,它可能会失败。
为了简化代码,您调用log.Fatal结束执行并将错误打印到控制台。在生产代码中,您会希望以更优雅的方式处理错误。
(6)调用DB.Ping以确认连接到数据库有效。在运行时, sql.Open可能不会立即连接,具体取决于驱动程序。您在Ping此处使用以确认 database/sql包可以在需要时连接。
(7)检查来自Ping的错误,以防连接失败。
(8)Ping如果连接成功,则打印一条消息。
文件的顶部现在应该如下所示:
3、保存 main.go。
1、开始跟踪 MySQL 驱动程序模块作为依赖项。
使用go get 添加 github.com/go-sql-driver/mysql 模块作为您自己模块的依赖项。使用点参数表示“获取当前目录中代码的依赖项”。
2、在命令提示符下,设置Go 程序使用的DBUSER和DBPASS环境变量。
在 Linux 或 Mac 上:
在 Windows 上:
3、在包含 main.go 的目录中的命令行中,通过键入go run来运行代码。
连接成功了!
接下来,您将查询一些数据。