我正在使用名为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
知道我做错了什么吗?
AgreementNo int`json:"agreement_no" validate:"required"`
Run Code Online (Sandbox Code Playgroud)
我想从greece_no请求中获得零值。仍然需要,但得到零值,因此 json 请求 null 不允许。但在 echo 中验证不允许零值。
如何在不删除所需验证的情况下获得此值或有任何解决方案?
我正在使用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
如何将参数传递给 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) 在这种情况下,我正在使用
有没有简单的例子来测试我的 Mutation 和 Query ?我很喜欢得到这方面的建议。我一直在寻找,但至今没有找到,
谢谢你 :)
如何将一些额外的变量传递给 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) 我使用 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)
它等待所有功能的令牌,但我不想使用这个中间件进行登录功能。如何防止这种情况发生?
这是我使用测试包和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)
当我试图设置标题时,恐慌就以粗体显示(代码中的星号)。我究竟做错了什么?
而不是在 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)
我正在制作一个网络爬虫.我传递的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) 我正在尝试使用 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 代码是否有误......
我正在使用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,想创建自己的 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 ×13
go-echo ×13
middleware ×2
api ×1
go-context ×1
gqlgen ×1
graphql ×1
http ×1
json ×1
jwt ×1
rest ×1
routes ×1
unit-testing ×1
validation ×1
web-crawler ×1