golang Beego API请求

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了golang Beego API请求相关的知识,希望对你有一定的参考价值。

package api

type RequestMethod int

const (
	GET RequestMethod = iota
	POST
	PUT
	DELETE
	HEAD
)

func (r RequestMethod) String() string {
	switch r {
	case GET:
		return "GET"
	case POST:
		return "POST"
	case PUT:
		return "PUT"
	case DELETE:
		return "DELETE"
	case HEAD:
		return "HEAD"
	default:
		panic("Invalid request method")
	}
}

type Request struct {
	BaseURL 	string 			``
	Path 		string 			``
	Method 		RequestMethod 		``
	Params  	map[string]string 	``
	HeaderField 	map[string]string 	``
}

func NewRequest(baseURL string, path string, method RequestMethod) *Request {
	return &Request{
		BaseURL:     baseURL,
		Path:        path,
		Method:      method,
		Params:      map[string]string{},
		HeaderField: map[string]string{},
	}
}
func doIt() {
	// https://api.gnavi.co.jp/RestSearchAPI/20150630/?keyid=3244a73539a2c08f7093635da826f33c&format=json
	request := api.NewRequest(
		"https://api.gnavi.co.jp/RestSearchAPI",
		"/20150630",
		api.GET)
	request.Params["keyid"] = "3244a73539a2c08f7093635da826f33c"
	request.Params["format"] = "json"
	client := api.Client{
		Request: request,
	}
	res, err := client.SendRequest()
	if err != nil {
		fmt.Printf("client.Error: %v", err)
		this.Data["json"] = err.Error()
	}
	defer res.Body.Close()
	read, err := ioutil.ReadAll(res.Body)
	if err != nil {
		this.Data["json"] = err.Error()
	}
	data := map[string]interface{}{}
	json.Unmarshal(read, &data)
	this.Data["json"] = data
	this.ServeJSON()
}
package api

import (
	"net/http"
	"github.com/astaxie/beego/httplib"
)

type Client struct {
	Request *Request
}

func (c *Client) SendRequest() (*http.Response, error) {
	// TODO: BaseURLとPathのvalidation
	beegoRequest := httplib.NewBeegoRequest(
		c.Request.BaseURL+c.Request.Path,
		c.Request.Method.String())
	for key, value := range c.Request.HeaderField {
		beegoRequest.Header(key, value)
	}
	for key, value := range c.Request.Params {
		beegoRequest.Param(key, value)
	}
	res, err := beegoRequest.Response()
	if err != nil {
		return nil, err
	}
	return res, nil
}

beego框架(golang)学习过滤器(实现restful请求)

过滤器

在用beego做restful路由的时候,遇到了除了GTE、POST之外的HTTP请求,比如 PUT、PATCH、delete请求无法通过路由认证,报错误:405 METHOD NOT ALLOW。在参考官网后,发现自己过滤器可以改变HTTP请求方式。

比如前端 JQUERY ajax发送DELETE请求

$.post(url, id:id, _method:"DELETE", _xsrf:xsrf_token, function (data) 
    processAjaxReturnData(data)
);

虽然beego支持restful路由,但是直接请求是无法请请求通的,需要过滤器处理。

文件main.go

package main

......

func init() // 支持表单伪造PUT,DELETE,PATCH,OPTIONS请求 beego.InsertFilter("*", beego.BeforeRouter, handlers.RestfulHandler())

func main() ...... beego.Run()

这样就构建了一个过滤器,用于将带有_method的请求方式直接赋在请求头上。

文件 /beego_admin_template/handlers/restfulHandler.go

package handlers

import (
    "github.com/astaxie/beego/context"
)

var supportMethod = [6]string"GET", "POST", "PUT", "PATCH", "DELETE", "OPTIONS"

// 支持伪造restful风格的http请求
// _method = "DELETE" 即将http的POST请求改为DELETE请求
func RestfulHandler() func(ctx *context.Context) 
    var restfulHandler = func(ctx *context.Context) 
        // 获取隐藏请求
        requestMethod := ctx.Input.Query("_method")

        if requestMethod ==  ""
            // 正常请求
            requestMethod = ctx.Input.Method()
        

        // 判断当前请求是否在允许请求内
        flag := false
        for _, method := range supportMethod
            if method == requestMethod 
                flag = true
                break
            
        

        // 方法请求
        if flag == false 
            ctx.ResponseWriter.WriteHeader(405)
            ctx.Output.Body([]byte("Method Not Allow"))
            return
        

        // 伪造请求方式
        if requestMethod != "" && ctx.Input.IsPost() 
            ctx.Request.Method = requestMethod
        
    
    return restfulHandler

过滤器的作用

过滤器个人认为类似于中间件,可以在处理业务逻辑之前,进行一些必要的处理,比如请求验证、权限认证、强制跳转等等。在上一篇beego的验证码处理就看到了这样的一句代码

// create filter for serve captcha image
beego.InsertFilter(cpt.URLPrefix+"*", beego.BeforeRouter, cpt.Handler)

这是专门为验证码图片进行的处理,表示在beego路由处理之前,用cpt.Handler方法处理验证码图片。

官网具体使用方式可以参考 https://beego.me/docs/mvc/controller/filter.md

以上是关于golang Beego API请求的主要内容,如果未能解决你的问题,请参考以下文章

新篇章,Golang 和 beego 初识

Golang入门教程beego 快速开发 HTTP 框架

golang框架对比Revel and Beego

golang框架对比Revel and Beego

golang 都有哪些比较稳定的 web 开发框架

golang简单实现jwt验证(beegoxormjwt)