Я пытаюсь публиковать сообщения из своего внешнего интерфейса 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 и все еще учусь, как заставить их взаимодействовать друг с другом.
удалите 'Access-Control-Allow-Origin': '*' , 'Access-Control-Allow-Headers': 'access-control-allow-origin, access-control-allow-headers' из клиента, они должны использоваться только на сервере.
@jcuypers Хорошо, поэтому я убрал это и оставил только application/json в качестве типа контента, но теперь, хотя я не получаю ошибку cors, и я вижу, что полезная нагрузка отправляется на вкладке сети браузера, она все еще показывает, что данные равен нулю при попытке запросить его в Go. Что мне нужно сделать, чтобы получить данные?
извините, я не Go парень. а вот это: if (*req).Method == "POST" { return } странно? вы используете post для отправки данных, а затем просто выходите из функции ни с чем (хотя после этого вы все еще пытаетесь напечатать)? Попробуйте поместить операторы печати внутри оператора if.





внесите изменения следующим образом:
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 []}
Но, похоже, он публикуется, потому что на интерфейсе отображается полезная нагрузка: {имя пользователя: "Джо", пароль: "Джо"} пароль: "Джо" имя пользователя: "Джо"
то, что вы называете действительным json, по моему мнению, просто объект: действительный json должен выглядеть так: { "username": "Joe", "password": "Joe" }. убедитесь, что ваш почтовый запрос имеет JSON.stringify(data)
Пожалуйста, проверьте раздел предварительной проверки. возможный дубликат stackoverflow.com/questions/43871637/…