我正在尝试通过达到与Echo一起提供的POST请求来对pokemon API进行简单的API调用。
我正在使用{ "pokemon": "pikachu" }正文将POST请求发送到“localhost:8000 / pokemon”,其中body通过ioutil重新附加到请求,更改了使用正文进行的请求:“localhost:8000 / pokemon / pikachu”。
POST请求通过响应一些JSON来工作,但是仅对“localhost:8000 / pokemon”进行了调用,并且似乎未将主体添加到URL。
我认为这里的u := new(pokemon)绑定有问题
谁有想法?

func main() {
    e := echo.New() // Middleware
    e.Use(middleware.Logger()) // Logger
    e.Use(middleware.Recover())
    //CORS
    e.Use(middleware.CORSWithConfig(middleware.CORSConfig{
        AllowOrigins: []string{"*"},
        AllowMethods: []string{echo.GET, echo.HEAD, echo.PUT, echo.PATCH, echo.POST, echo.DELETE},
    }))
    // Root route => handler
    e.GET("/", func(c echo.Context) error {
        return c.String(http.StatusOK, "Hello, World!\n")
    })
    e.POST("/pokemon", controllers.GrabPrice) // Price endpoint
    // Server
    e.Logger.Fatal(e.Start(":8000"))
}
type pokemon struct { pokemon string `json:"pokemon" form:"pokemon" query:"pokemon"`
}
// GrabPrice - handler method for binding JSON body and scraping for stock price
func GrabPrice(c echo.Context) (err error) {
    // Read the Body content
    var bodyBytes []byte
    if c.Request().Body != nil {
        bodyBytes, _ = ioutil.ReadAll(c.Request().Body)
    }
    // Restore the io.ReadCloser to its original state
    c.Request().Body = ioutil.NopCloser(bytes.NewBuffer(bodyBytes))
    u := new(pokemon)

    er := c.Bind(u) // bind the structure with the context body
    // on no panic!
    if er != nil {
        panic(er)
    }

    // company ticker
    ticker := u.pokemon
    print("Here", string(u.pokemon))
    // yahoo finance base URL
    baseURL := "https://pokeapi.co/api/v2/pokemon"
    print(baseURL + ticker)
    // price XPath
    //pricePath := "//*[@name=\"static\"]"
    // load HTML document by binding base url and passed in ticker
    doc, err := htmlquery.LoadURL(baseURL + ticker)
    // uh oh :( freak out!!
    if err != nil {
        panic(err)
    }
    // HTML Node
        // from the Node get inner text
    price := string(htmlquery.InnerText(doc))
    return c.JSON(http.StatusOK, price)
}

最佳答案

添加到@mkopriva和@ A.Lorefice已经回答的内容
是的,您需要确保导出变量,以使绑定正常工作。
由于绑定的底层过程实际上是在结构上使用反射机制。请参阅this文档,滚动到“结构”部分以查看其内容。

type pokemon struct {
    Pokemon string `json:"pokemon" form:"pokemon" query:"pokemon"`
}

关于go - 无法将POST正文绑定(bind)到Go中的URL,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/63504015/

10-10 21:31