#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"`
}