标签: go-echo

带有echo框架的golang API

我正在使用名为echo(https://github.com/labstack/echo)的轻型框架Web框架,我正在尝试使用它构建一个非常简单的API.

这是我的一条路线

 e.Get("/v1/:channel/:username", getData)
Run Code Online (Sandbox Code Playgroud)

这是getData函数,它从mysql数据库中执行一个非常简单的SELECT

func getData(c echo.Context) error {
  quote := new(Quote)  
  for rows.Next() {
        var username string
        var message string
        err = rows.Scan(&username, &message)
        checkErr(err)
        quote.username = username
        quote.message = message
  }
  log.Println(quote)

  defer rows.Close()
  return c.JSON(http.StatusOK, quote)
}
Run Code Online (Sandbox Code Playgroud)

我还有返回值的这个基本结构

type Quote struct {
    username string
    message  string
}
Run Code Online (Sandbox Code Playgroud)

可悲的是,我现在无法弄清楚如何返回JSON.当我尝试这个代码时,来自服务器的响应总是只是{} 我尝试返回c.String工作正常并输出响应但我想返回一个JSON.

我按照这个例子,并没有真正看到这里的问题. https://github.com/labstack/echox/blob/master/recipe/crud/main.go

知道我做错了什么吗?

api json go go-echo

3
推荐指数
1
解决办法
2552
查看次数

如何允许零 (0) 值

AgreementNo int`json:"agreement_no" validate:"required"`
Run Code Online (Sandbox Code Playgroud)

我想从greece_no请求中获得零值。仍然需要,但得到零值,因此 json 请求 null 不允许。但在 echo 中验证不允许零值。

如何在不删除所需验证的情况下获得此值或有任何解决方案?

validation go go-echo

3
推荐指数
1
解决办法
2026
查看次数

echo.Context 的 Set() 方法是否将值保存到底层 context.Context 中?

我正在使用Echo 框架,并希望在设置一些自定义值后传递 Go 内置的底层context.Context echo.Context

为了实现它,我想我可以首先应用 的Set(key string, val interface{})方法echo.Context,然后提取底层的context.Context.

问题是可以这样做吗?换句话说,是否像echo.Context.Set(...)直接设置值一样?或者我应该采取额外的步骤来复制我的自定义条目。context.ContextWithValue

PS我不想传递echo.Context到我的应用程序的更深层次,这就是为什么我不想直接使用它但得到引用context.Context

go go-echo go-context

3
推荐指数
1
解决办法
6839
查看次数

将参数传递给 Echo 路由中间件

如何将参数传递给 Echo 中的中间件?有一个我想要实现的例子。

func (h *handlers) Check(pm string, next echo.HandlerFunc) echo.HandlerFunc {
    return func(c echo.Context) error {
        if pm == "test" {
            return next(c)
        }
        return echo.NewHTTPError(http.StatusUnauthorized, "")
    }
}

Run Code Online (Sandbox Code Playgroud)

我想像这样设置中间件:

route.Use(middleware.Check("test input"))
Run Code Online (Sandbox Code Playgroud)

middleware go go-echo

2
推荐指数
1
解决办法
2778
查看次数

在 Golang 中对 GraphQL 进行单元测试

在这种情况下,我正在使用

有没有简单的例子来测试我的 Mutation 和 Query ?我很喜欢得到这方面的建议。我一直在寻找,但至今没有找到,

谢谢你 :)

unit-testing go graphql go-echo gqlgen

2
推荐指数
1
解决办法
1843
查看次数

如何将额外的参数传递给 Echo mux 处理程序?

如何将一些额外的变量传递给 Echo mux 处理程序?

我在 main.go 中注册了这样的路线:

 e.GET("/search/:query", handlers.Search(*kindex, app.infoLog))
Run Code Online (Sandbox Code Playgroud)

正如您可能看到的,这不是处理程序的正确签名。它应该在没有任何争论的情况下通过。IEhandlers.Search

如何从我的搜索处理程序访问 kindex 和 infoLog?

func Search(c echo.Context, kindex string, infoLog *log.Logger) error {
  # Should I access a global variable from here?
  infoLog.Printf("Kendra Index: %v\n", kindex)
  # cut..
}
Run Code Online (Sandbox Code Playgroud)

go go-echo

2
推荐指数
1
解决办法
1705
查看次数

echo 跳过 JWT 中间件

我使用 golang jwt 中间件。

e.Use(middleware.JWTWithConfig(middleware.JWTConfig{
  SigningKey:  []byte(os.Getenv("Signing_Key")),
  TokenLookup: "header:x-auth-token",       
}))
Run Code Online (Sandbox Code Playgroud)

它等待所有功能的令牌,但我不想使用这个中间件进行登录功能。如何防止这种情况发生?

go jwt go-echo

2
推荐指数
1
解决办法
2216
查看次数

在Echo golang中使用http标头时,分配给nil映射中的条目

这是我使用测试包和echo web http framework进行的测试:(webserver变量是全局echo实例)

func TestRunFunction(t *testing.T){
    req := new(http.Request)
    **req.Header.Set("Authorization","Bearer "+loginToken.Token)**
    rec := httptest.NewRecorder()
    c := WebServer.NewContext(standard.NewRequest(req, WebServer.Logger()), standard.NewResponse(rec, WebServer.Logger()))
    c.SetPath(path)
    if assert.NoError(t , RunFunction(c)){
        assert.Equal(t,http.StatusOK, rec.Code)
    }
}
Run Code Online (Sandbox Code Playgroud)

我正在尝试测试REST GET方法调用的某些功能,但出现此紧急错误:

panic: assignment to entry in nil map [recovered]
        panic: assignment to entry in nil map
Run Code Online (Sandbox Code Playgroud)

当我试图设置标题时,恐慌就以粗体显示(代码中的星号)。我究竟做错了什么?

http go go-echo

1
推荐指数
1
解决办法
1105
查看次数

如何从其他包导入子路由

而不是在 main() 下写每条路线,比如

func main() {
    e := echo.New()
    e.GET("/api", sayHello)
    e.GET("/api/music", getMusic)
    e.GET("/api/user/:id", getDetail)
    e.POST("/api/user", addUser)
    // ...
}
Run Code Online (Sandbox Code Playgroud)

如何从名为 的文件中导入所有这些子路由api.go,并在主函数中使用这些子路由?相似

import "./API"
func main() {
    e := echo.New()
    e.UseSubroute(API.Routes) // <-- similar to this
    // ...
}
Run Code Online (Sandbox Code Playgroud)

rest middleware routes go go-echo

1
推荐指数
1
解决办法
1119
查看次数

取消HTTP请求时关闭所有goroutine


我正在制作一个网络爬虫.我传递的URL通过履带功能和解析它来获取定位标记的所有链接,那么我调用相同的履带式功能适用于所有那些使用单独的goroutine每一个URL网址.
但是如果在我得到响应之前发送请求并取消它,则该特定请求的所有注入仍然在运行.
现在我想要的是当我取消请求时,由于该请求而被调用的所有goroutine都停止了.
请指导.
以下是我的爬虫功能代码.

func crawler(c echo.Context, urlRec string, feed chan string, urlList *[]string, wg *sync.WaitGroup) {
    defer wg.Done()
    URL, _ := url.Parse(urlRec)
    response, err := http.Get(urlRec)
    if err != nil {
        log.Print(err)
        return
    }

    body := response.Body
    defer body.Close()

    tokenizer := html.NewTokenizer(body)
    flag := true
    for flag {
        tokenType := tokenizer.Next()
        switch {
        case tokenType == html.ErrorToken:
            flag = false
            break
        case tokenType == html.StartTagToken:
            token := tokenizer.Token()

            // Check if the token is an <a> …
Run Code Online (Sandbox Code Playgroud)

synchronization web-crawler go go-echo

0
推荐指数
1
解决办法
953
查看次数

使用 Echo 提供文件服务

我正在尝试使用 Echo 提供多个文件,但并非每次都有效。API 代码如下所示:

package main

import (
    "github.com/labstack/echo"

    "net/http"
)

func main() {
    e := echo.New();

    e.GET("/", home);

    e.File("/data1", "assets/data1.csv");

    e.File("/data2", "assets/data2.csv");

    e.Logger.Fatal(e.Start(":4243"));
}

func home(c echo.Context) error {
  return c.String(http.StatusOK, "Are you lost?");
}
Run Code Online (Sandbox Code Playgroud)

准确地说,它确实适用于第一个文件获取,但随后的任何后续调用(无论是文件获取还是更多“经典”调用)都会失败。每个浏览器的错误消息都略有不同:

在 Chrome 中:

SyntaxError:无法对“XMLHttpRequest”执行“setRequestHeader”:“Bearer {the_entire_content_of_the_first_fetched_file}”不是有效的 HTTP 标头字段值。

在火狐中:

SyntaxError:指定了无效或非法的字符串

在 Edge 中,只需:

语法错误

尝试激活 CORS,没有任何变化。

看起来与 Postman 配合得很好。也许这是我如何在应用程序中获取数据的问题?

如果您可能需要更多信息,这个线程与我的上一个线程直接相关(Vuejs with axios request in vuex store: can't make multiple request, Why?),但我不想将它们混淆,因为我还不知道我的 Vue 代码还是 Echo 代码是否有误......

go go-echo

0
推荐指数
1
解决办法
1万
查看次数

避免 labstack/echo 路由中的全局变量

我正在使用labstack/echo webserver 和gofight进行单元测试。在学习 go 时,go 想知道是否有 go 成语用于访问(嵌入式) echo 结构之外的状态。例如:

type WebPlusDB struct {
    web *echo.Echo
    db  *databaseInterface
}

func NewEngine() *echo.Echo {
    e := echo.New()
    e.GET("/hello", route_hello)
    return e    
}

func NewWebPlusDb() {
    e := NewEngine()
    db := database.New()   
    return WebPlusDB{e,db}
}

// for use in unit tests
func NewFakeEngine() *WebPlusDB {
    e := NewEngine()
    db := fakeDatabase.New()   
    return WebPlusDB{e,db}
}    

func route_hello(c echo.Context) error {
    log.Printf("Hello world\n")

    // how do I access WebPlusDB.db from here? …
Run Code Online (Sandbox Code Playgroud)

go go-echo

0
推荐指数
1
解决办法
796
查看次数

创建路由模块 Go/Echo RestAPI

我刚刚开始学习 Go,想创建自己的 REST API。

问题很简单:我想将 api 的路由放在不同的文件中,例如:routes/users.go,然后将其包含在“main”函数中并注册这些路由。

Echo/Go 中有大量的restAPI 示例,但它们都在 main() 函数中具有路由。

我检查了一些示例/github 入门套件,但似乎找不到我喜欢的解决方案。

func main() {
    e := echo.New()

    e.GET("/", func(c echo.Context) error {
        responseJSON := &JSResp{Msg: "Hello World!"}
        return c.JSON(http.StatusOK, responseJSON)
    })

     //I want to get rid of this
    e.GET("users", UserController.CreateUser)
    e.POST("users", UserController.UpdateUser)
    e.DELETE("users", UserController.DeleteUser)

    //would like something like
    // UserRoutes.initRoutes(e)

    e.Logger.Fatal(e.Start(":1323"))
}

//UserController.go
//CreateUser 
func CreateUser(c echo.Context) error {
    responseJSON := &JSResp{Msg: "Create User!"}
    return c.JSON(http.StatusOK, responseJSON)
}

//UserRoutes.go
func initRoutes(e) { //this is probably e* echo …
Run Code Online (Sandbox Code Playgroud)

go go-echo

-1
推荐指数
1
解决办法
2241
查看次数