RESTful参数传递方法

本文介绍了如何在Go语言中使用RESTful风格传递参数,包括通过URL路径和curl命令行参数的方式。提供了示例代码展示如何接收和解析URL中的参数,以及如何处理curl命令传递的文件上传参数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Go语言RESTful参数传递

参考文章:https://blog.youkuaiyun.com/xingwangc2014/article/details/51623157

Go语言可以通过RESTful的方法实现守护,简单总结下RESTful的参数传递方法

一、使用URL的方式将参数传递到处理函数中
形如:/todos/{todoId}这种类型的url中的todoId参数是可以被RESTful解析,通过todoId传递参数

简单编写例子,说明通过URL进行参数传递

import (
   "fmt"
    "log"
    "net/http"
    "github.com/gorilla/mux"
)

func main() {
    // 第三方组件(Gorilla Mux package): “github.com/gorilla/mux” 
    router := mux.NewRouter().StrictSlash(true)
    // {todoId}代表需要传入的值
    router.HandleFunc("/todos/{todoId}", TodoShow).Methods("POST")
    log.Fatal(http.ListenAndServe(":8080", router))
}

// 定义回调函数
func TodoShow(w http.ResponseWriter, r *http.Request) {
    vars := mux.Vars(r)
    todoId := vars["todoId"]
    fmt.Fprintln(w, "Todo show:", todoId)
}

输入:curl http://10.12.6.112:8080/todos/AAA
输出:
URL测试输出
二、使用crul参数的方式传递参数到处理函数中
1、curl支持加入参数,并且在RESTful中可以进行解析,编写了一个利用RESTful实现文件拷贝的功能,说明这种参数的解析方式,以下为为可以解析crul参数传入的例子:

import (
   "fmt"
    "log"
    "net/http"
    "github.com/gorilla/mux"
)

func main() {
    // 第三方组件(Gorilla Mux package): “github.com/gorilla/mux” 
    router := mux.NewRouter().StrictSlash(true)
    // {todoId}代表需要传入的值
    router.HandleFunc("/daemon", Daemon).Methods("POST")
    log.Fatal(http.ListenAndServe(":8080", router))
}

// 定义回调函数
func Daemon(w http.ResponseWriter, r *http.Request) {
    // 解析CURL传入的信息
    r.ParseMultipartForm(32 << 20)
    if r.MultipartForm != nil {
        //解析目录参数
        subDir := r.MultipartForm.Value["sub_dir"]
        if len(subDir) > 0 {
            fmt.Fprintln(w, subDir[0])
        }

        // 解析文件参数
        file := r.MultipartForm.File["upload_files"]
        if len(file) > 0 {
            for _, j := range file {
                str := j.Filename
                if strings.Contains(str, "\\") { // 中文路径处理
                    str = strings.Replace(str, "\\", "/", -1)
                }
                fmt.Fprintln(w, str)
                fmt.Fprintln(w, j.Size)

                // 实现一个简单的拷贝
                // 拼接存放文件路径
                fileName := fmt.Sprintf("%v/%v", subDir[0], path.Base(str))

                // 打开待拷贝文件
                uf, _ := j.Open()

                // 打开拷贝文件
                lf, _ := os.OpenFile(fileName, os.O_CREATE|os.O_WRONLY, 0660)
                // 进行拷贝
                io.Copy(lf, uf)

                // 关闭文件描述符
                lf.close()
                uf.close()
            }

        } else {
            fmt.Fprintln(w, "Empty")
        }
    }
}

编译通过后,运行程序
新开启终端执行命令:
curl -X POST “sub_dir=/test-upload” -F “upload_files=@/mnt/hgfs/mc_share_1/etcd-v3.2.9-linux-amd64.tar.gz” -F “upload_files=@/mnt/hgfs/mc_share_1/go1.10.3.linux-amd64.tar.gz” http://10.12.6.112:8080/daemon
执行成功后,文件会拷贝到路径/test-upload下,前提是/test-upload路径存在

获取说名:
其中*http.Request的成员变量MultipartForm 是用来存放获取到信息的结构体,定义如下:
type Form

type Form struct {
    Value map[string][]string           // key-value类型变量均放入这个map,map的每个key可以带一个字符串slice结构(也表示可以声明多个同名key)
    File  map[string][]*FileHeader      // 文件key 和value ,其value是一个FileHeader的slice
}

type FileHeader

type FileHeader struct {
    Filename string                       // 文件名
    Header   textproto.MIMEHeader         // 文件头
    // 内含隐藏或非导出字段
}

具体详细信息可以参考:https://studygolang.com/pkgdoc 对于模块mime/multipart的说明

区别普通的key-value的方法是,文件名类型的key-value会多一个@

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值