我正在通過 Heroku 為我的應用程式發布 Golang API。無法讓我的 web 應用程式(Flutter/Dart 堆疊)真正從我的 api 獲得成功回應。不過,我是能夠得到利用當地卷曲的命令成功的回應。我已經閱讀了幾篇關于更改 Go mux 服務器并添加正確標頭的帖子,但這對我不起作用。我什至看到這些標頭在我的 curl 請求期間回傳。真的可以使用一些幫助,因為這會減慢我的速度。
本質上這是我創建服務器的主類
import (
"api/preventative_care"
"api/user"
"github.com/gorilla/handlers"
"github.com/gorilla/mux"
"log"
"net/http"
"os"
)
func main() {
log.SetFlags(log.LstdFlags | log.Llongfile)
router := mux.NewRouter()
// Where ORIGIN_ALLOWED is like `scheme://dns[:port]`, or `*` (insecure)
headersOk := handlers.AllowedHeaders([]string{"*"})
methodsOk := handlers.AllowedMethods([]string{"GET", "HEAD", "POST", "PUT", "OPTIONS"})
originsOk := handlers.AllowedOrigins([]string{"*"})
router.HandleFunc("/", func(writer http.ResponseWriter, request *http.Request) {
log.Println("Up and running!")
})
router.HandleFunc("/api/login", user.LoginHandler).Methods("GET")
router.HandleFunc("/api/recommendations", preventative_care.RecommendationHandler).Methods("GET")
var port = os.Getenv("PORT")
log.Printf("Starting application on port %s\n", port)
//log.Fatal(http.ListenAndServe(fmt.Sprintf(":%s", port), router))
log.Fatal(http.ListenAndServe(":" os.Getenv("PORT"), handlers.CORS(originsOk, headersOk, methodsOk)(router)))
}
呼叫此 API 的 dart 代碼如下所示:
Map<String, String> headers = {
"content-type": "application/json",
"username": username,
"password": password
};
final response = await http.get(Uri.parse(uri), headers: headers);
我在 2 個單獨的 Heroku Dynos 中同時托管 webapp 和 API。當我使用 curl 從本地訪問 API 時,我會看到以下內容:
$ > curl -iXGET https://my-app-api.herokuapp.com/api/login -H "username:hello" -H "password:pizza"
HTTP/1.1 200 OK
Server: Cowboy
Connection: keep-alive
Content-Type: application/json
Date: Thu, 18 Nov 2021 23:39:56 GMT
Content-Length: 160
Via: 1.1 vegur
我以為我應該看到 HeaderAccess-Control-Allow-Origin: *添加在那里,但我還沒有獲得 200 的成功。但是,當我嘗試使用我的 Web 應用程式從使用 Google Chrome 的登錄螢屏訪問 API 時,我看到此錯誤:
從源“https://my-app-staging.herokuapp.com”訪問“https://my-app-api.herokuapp.com/api/login”的 XMLHttpRequest 已被 CORS 政策阻止:對預檢的回應請求未通過訪問控制檢查:請求的資源上不存在“Access-Control-Allow-Origin”標頭。
不知道 - 就像 Chrome 或其他東西正在洗掉標題一樣?
編輯:我還嘗試使用 CURL 發送預檢請求,并且我看到了正確的標頭 - 但是它仍然顯示 4XX 錯誤。
$ > curl -H "Access-Control-Request-Method: GET" -H "Origin: https://my-app-staging.herokuapp.com" --head https://my-app-api.herokuapp.com/api/login
HTTP/1.1 405 Method Not Allowed
Server: Cowboy
Connection: keep-alive
Access-Control-Allow-Origin: *
Date: Fri, 19 Nov 2021 00:51:52 GMT
Via: 1.1 vegur
所以現在我真的不確定
uj5u.com熱心網友回復:
TL; 博士
gorilla/handlers不(還?)支持Access-Control-Allow-Headers. 您必須明確指定所有允許的標頭。在你的情況下,而不是
handlers.AllowedHeaders([]string{"*"})
你應該有
handlers.AllowedHeaders([]string{"content-type", "username", "password"})
更多細節
早在 2016 年,Fetch 標準就增加了對Access-Control-Allow-Headers標頭中通配符的支持(在非憑據請求的情況下)。大多數現代瀏覽器現在都支持此功能。
然而,gorilla/handlers似乎還沒有趕上規范。如果你檢查源代碼的handlers.AllowedHeaders功能和的*cors.ServeHTTP方法,你會看到有在沒有特殊處理"*"的值:它從字面上處理。因此,CORS 中間件檢測到預檢請求(content-type、username、 和password)提供的請求標頭與允許的標頭(*,字面意思)之間的不匹配,并以回應403,導致訪問控制檢查失敗。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/362229.html
標籤:走 科斯 http-headers 通配符 大猩猩
