专栏首页Golang语言社区厚土Go学习笔记 | 36. web服务指定路径下的get参数接收与处理

厚土Go学习笔记 | 36. web服务指定路径下的get参数接收与处理

当我们使用go建立了服务器,那么一种常见的需求就摆在面前。如何给这个服务器的某个路径传参数呢?我们研究一下URL传参的接收与处理。

对于 http.Request 发出的请求,我们需要使用到 URL.Query().Get("XXX")

这次模拟建立一个价格查询页面

首先建立一个 dollars 类型,用以保存货币数值。

type dollars float32

对 dollars 建立一个 String() 方法,用以确定显示格式

func (d dollars) String() string { return fmt.Sprintf("$%.2f", d) }

建立一个 map 字典,保存多种东西的价格。

type MyHandler map[string]dollars

http.Handler 中处理路径和接收参数的操作

func (self MyHandler) ServeHTTP(w http.ResponseWriter, req *http.Request)

完整代码示例

package main

import (
    "fmt"
    "net/http"
    "log"
)

type dollars float32

func (d dollars) String() string { return fmt.Sprintf("$%.2f", d) }

type MyHandler map[string]dollars

func (self MyHandler) ServeHTTP(w http.ResponseWriter, req *http.Request) {
    switch req.URL.Path {
    case "/list":
        for item, price := range self {
            fmt.Fprintf(w, "%s: %s\n", item, price)
        }
    case "/price":
        item := req.URL.Query().Get("item")
        //item2 := req.Form.Get("item")
        price, ok := self[item]

        if !ok {
            w.WriteHeader(http.StatusNotFound) // 404
            fmt.Fprintf(w, "no such item: %q\n", item)
            return
        }
        fmt.Fprintf(w, "%s\n", price)
    default:
        w.WriteHeader(http.StatusNotFound) // 404
        fmt.Fprintf(w, "no such page: %s\n", req.URL)
    }
}

func main() {
    handler := MyHandler{"shoes": 50, "socks": 5}
    log.Fatal(http.ListenAndServe(":4000", handler))
}

程序运行后,直接访问 http://localhost:4000/ 结果如下

no such page: /

访问 http://localhost:4000/list 结果如下

shoes: $50.00
socks: $5.00

访问 http://localhost:4000/price 结果如下

no such item: ""

这个路径是需要正确参数的,所以需要访问 http://localhost:4000/price?item=socks 结果如下

$5.00

http://localhost:4000/price?item=shoes 结果如下

$50.00

本例可以解决大部分跨页面传参和处理的基本方式了。

如果你不希望自己传递的参数出现在地址栏,那么需要在发出请求的页面上使用 post 方法。当然,接收页面也需要更换相应的接收方法。

本文分享自微信公众号 - Golang语言社区(Golangweb)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-02-12

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Docker 入门介绍

    Docker简介 ---- Docker是DotCloud开源的、可以将任何应用包装在Linux container中运行的工具。2013年3月发布首个版本,当...

    美团技术团队
  • 为什么Go语言在中国格外的火

    Go语言推出有几年了,似乎不温不火。但是在中国范围内,确实被关注的一塌糊涂。 这是2017年2月份TIOBE出的编程语言排名: ? 在拉勾网上搜索go的职位,结...

    程序员的酒和故事
  • Go实战--golang中使用RethinkDB(gorethink/gorethink.v3)

    生命不止,继续go go go !!! 关于golang中操作数据库,曾经介绍了不少: Go实战–go语言操作sqlite数据库(The way to go) ...

    程序员的酒和故事
  • Golang语言社区--理解 go interface 的 5 个关键点

    大家好,我是社区主编彬哥,本篇文章是给大家转载的关于Go语言中interface相关的。

    李海彬
  • Golang语言社区--Go语言学习资料下载(PDF文件、视频)

    大家好,我是社区主编彬哥,今天给大家整理了部分的GO语言相关的学习资料;已经上传至百度网盘;欢迎下载;后面会持续更新:

    李海彬
  • Golang语言社区--标准库分析之strconv包

    大家好,我是Golang语言社区主编彬哥,这篇是给大家转载的关于Go语言的strconv 包相关的知识。

    李海彬
  • Golang中使用echo框架、MongoDB、JWT搭建REST API

    生命不止,继续go go go !!! 之前介绍过golang中restful api的博客,是使用redis作为持久化,httprouter作为框架: Go...

    程序员的酒和故事
  • Go语言六周年,2016年初发布Go 1.6

    原文出处: Andrew Gerrand 译文出处:oschina 2009年11月10日,Go 语言作为开源项目正式发布。从那开始,已经有超过 780...

    wangxl
  • Go语言入门

    最近准备学点新东西,聊聊Go语言入门。 Go是google 09年推出的编程语言,Go语言专门针对多处理器系统应用程序的编程进行了优化,使用Go编译的程序可以媲...

    大数据和云计算技术
  • Golang语言社区--Go语言基础第六节函数

    大家好,我是Golang语言社区主编彬哥,本篇给大家带来的是关于Go语言中的函数。

    李海彬

扫码关注云+社区

领取腾讯云代金券