Не удается привязать текст публикации к URL в Go

#go #post #bind

#Вперед #Публикация #привязать

Вопрос:

Я пытаюсь выполнить простой вызов API для pokemon API, выполнив POST-запрос, который я обслуживаю с помощью Echo.

Я отправляю запрос POST на «localhost: 8000 / pokemon» с телом, { "pokemon": "pikachu" } где ТЕЛО повторно подключается к запросу через 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)
}
  

Комментарии:

1. Вам необходимо экспортировать поля. т.е. type pokemon struct { Pokemon string ... }

2. Как упоминает @mkopriva, если в вашей структуре нет экспортированных полей, механизм привязки не сможет получить к ним доступ, чтобы сопоставить их теги с тегами в теле, поэтому привязка не может произойти. В некоторых IDE использование структур с неэкспортируемыми полями покажет вам предупреждение или ошибку, если вы сделаете это.

Ответ №1:

Добавление к тому, на что уже ответили @mkopriva и @A.Lorefice

Да, вам нужно убедиться, что переменная экспортирована, чтобы привязка работала должным образом. Поскольку процесс привязки underlay фактически использует механизм отражения в структуре. Смотрите эту документацию, прокрутите раздел Structs, чтобы увидеть, что это такое.

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