Отправить форму Angular в Go API продолжает публиковать Nil

Я пытаюсь публиковать сообщения из своего внешнего интерфейса angular в свой API Go, и независимо от того, что я делаю, он продолжает публиковать ноль в API Go. Когда я проверяю, попадают ли переменные к подписчику Angular, он показывает, что они есть, но по какой-то причине он не будет публиковаться в этой простой конечной точке Go.

Вот мой код, любая помощь будет очень признательна:

GO API

package main

import (
    "encoding/json"
    "fmt"
    "github.com/dgrijalva/jwt-go"
    "log"
    "net/http"
    "time"
)

func main() {

    http.HandleFunc("/signin", indexHandler)
    http.HandleFunc("/welcome", Welcome)
    http.HandleFunc("/refresh", Refresh)

    // start the server on port 8000
    log.Fatal(http.ListenAndServe(":8001", nil))
}

func setupResponse(w *http.ResponseWriter, req *http.Request) {
    (*w).Header().Set("Access-Control-Allow-Origin", "*")
    (*w).Header().Set("Access-Control-Allow-Methods", "POST, GET, OPTIONS, PUT, DELETE")
    (*w).Header().Set("Access-Control-Allow-Headers", "Accept, Content-Type, Content-Length, Accept-Encoding, X-CSRF-Token, Authorization")
}

func indexHandler(w http.ResponseWriter, req *http.Request) {
    setupResponse(&w, req)
    if (*req).Method == "POST" {
        return
    }
    fmt.Println(req.Header)

    fmt.Println(req.ParseForm())
    fmt.Println(json.NewDecoder(req.Body))

}

Угловой подписчик

 login(username: string, password: string) {

    const httpOptions = {
      headers: new HttpHeaders({ 'Content-Type': 'application/json charset=utf-8'
        , 'Access-Control-Allow-Origin': '*'
        , 'Access-Control-Allow-Headers': 'access-control-allow-origin, access-control-allow-headers'})
    };
   return this.http.post(`${environment.APIEndpoint}/signin`, {username, password}, httpOptions).pipe(map(user => {
        // login successful if there's a jwt token in the response
        if (user && user) {
          // store user details and jwt token in local storage to keep user logged in between page refreshes
          localStorage.setItem('currentUser', JSON.stringify(user));
        }

        return user;
      }));
  }

Это мой вывод в Go

map[User-Agent:[Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Mobile Safari/537.36] Access-Control-Request-Headers:[access-control-allow-headers,access-control-allow-origin,content-type] Referer:[http://localhost:4200/login?returnUrl=%2Fdashboard] Accept-Language:[en-US,en;q=0.9] Connection:[keep-alive] Accept:[/] Accept-Encoding:[gzip, deflate, br] Access-Control-Request-Method:[POST] Origin:[http://localhost:4200]] &{{} [] {[] 0 { false [] false 0 0} { false [] false 0 0} { } false false} 0 0 { false [] false 0 0} 0 []}

И затем я получаю ошибку CORS в Angular, которая:

Access to XMLHttpRequest at 'http://localhost:8001/signin' from origin 'http://localhost:4200' has been blocked by CORS policy: Request header field access-control-allow-origin is not allowed by Access-Control-Allow-Headers in preflight response.

Я был бы очень благодарен, если кто-нибудь может мне помочь. Я новичок в Go и Angular и все еще учусь, как заставить их взаимодействовать друг с другом.

Пожалуйста, проверьте раздел предварительной проверки. возможный дубликат stackoverflow.com/questions/43871637/…

jcuypers 13.03.2019 07:30

удалите 'Access-Control-Allow-Origin': '*' , 'Access-Control-Allow-Headers': 'access-control-allow-origin, access-control-allow-headers' из клиента, они должны использоваться только на сервере.

jcuypers 13.03.2019 07:36

@jcuypers Хорошо, поэтому я убрал это и оставил только application/json в качестве типа контента, но теперь, хотя я не получаю ошибку cors, и я вижу, что полезная нагрузка отправляется на вкладке сети браузера, она все еще показывает, что данные равен нулю при попытке запросить его в Go. Что мне нужно сделать, чтобы получить данные?

Joe Alvini 13.03.2019 15:36

извините, я не Go парень. а вот это: if (*req).Method == "POST" { return } странно? вы используете post для отправки данных, а затем просто выходите из функции ни с чем (хотя после этого вы все еще пытаетесь напечатать)? Попробуйте поместить операторы печати внутри оператора if.

jcuypers 13.03.2019 15:41
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Angular и React для вашего проекта веб-разработки?
Angular и React для вашего проекта веб-разработки?
Когда дело доходит до веб-разработки, выбор правильного front-end фреймворка имеет решающее значение. Angular и React - два самых популярных...
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Мы провели Twitter Space, обсудив несколько проблем, связанных с последними дополнениями в Angular. Также прошла Angular Tiny Conf с 25 докладами.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
Мое недавнее углубление в Angular
Мое недавнее углубление в Angular
Недавно я провел некоторое время, изучая фреймворк Angular, и я хотел поделиться своим опытом со всеми вами. Как человек, который любит глубоко...
Освоение Observables и Subjects в Rxjs:
Освоение Observables и Subjects в Rxjs:
Давайте начнем с основ и постепенно перейдем к более продвинутым концепциям в RxJS в Angular
0
4
61
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

внесите изменения следующим образом:

func indexHandler(w http.ResponseWriter, req *http.Request) {
    setupResponse(&w, req)
    if (*req).Method == "POST" {
          fmt.Println(req.Header)

          fmt.Println(req.ParseForm())
          fmt.Println(json.NewDecoder(req.Body))
    }
}

Угловая клиентская сторона

login(username: string, password: string) {

    const httpOptions = {
      headers: new HttpHeaders({ 'Content-Type': 'application/json charset=utf-8'})
    };
   return this.http.post(`${environment.APIEndpoint}/signin`, `{"username":username, "password":password}`, httpOptions).pipe(map(user => {
        // login successful if there's a jwt token in the response
        if (user && user) {
          // store user details and jwt token in local storage to keep user logged in between page refreshes
          localStorage.setItem('currentUser', JSON.stringify(user));
        }

        return user;
      }));
  }

Я получаю следующий ответ, когда меняю карту [Content-Length: [35] Origin: [локальный: 4200] Referer: [localhost:4200/логин?returnUrl=%2Fdashboard] Accept-Encoding: [gzip, deflate, br] Connection: [keep-alive] Accept: [application/json , text/plain, /] User-Agent: [Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.3 Safari/537.36] Content-Type: [application/json] <nil> &{0xc420066040 [ ] {[] 0 {<nil> false [] <nil> false 0 <nil> 0} {<nil> false [] <nil> false 0 <nil> 0} { } <nil> false false} 0 0 { <nil> false [] <nil> false 0 <nil> 0} <nil> 0 []}

Joe Alvini 13.03.2019 19:10

Но, похоже, он публикуется, потому что на интерфейсе отображается полезная нагрузка: {имя пользователя: "Джо", пароль: "Джо"} пароль: "Джо" имя пользователя: "Джо"

Joe Alvini 13.03.2019 19:12

то, что вы называете действительным json, по моему мнению, просто объект: действительный json должен выглядеть так: { "username": "Joe", "password": "Joe" }. убедитесь, что ваш почтовый запрос имеет JSON.stringify(data)

jcuypers 13.03.2019 19:22

Другие вопросы по теме