2017-08-30 122 views
0

我有一個API,目前正在嘗試使用它的一個端點。端點用於POST請求,端點按預期工作。該API運行在雲端,我用curl進行了測試,它非常完美,然後從我的反應應用程序中嘗試使用它,但是得到了403 status code在Gorilla Mux中配置CORS:在POST請求中出現403錯誤

在瀏覽器的控制檯中觀察我發現我在OPTIONS請求中出現該錯誤,並且POST從未完成。下面是在控制檯中顯示的結果的截圖:

enter image description here

於是,我做了一個簡單的HTML文件,表格,還有我把所需的投入和行動指向這個端點和它的工作很不錯。那麼,我不知道錯誤在哪裏?我已在API

在API中,我使用大猩猩/多路複用器中啓用了CORS和我有這樣的事情:

// Set up a router and some routes 
    r := mux.NewRouter() 
    r.HandleFunc("/", handleHome) 
    //some other routes 

    headersOk := handlers.AllowedHeaders([]string{"*"}) 
    originsOk := handlers.AllowedOrigins([]string{"*"}) 
    methodsOk := handlers.AllowedMethods([]string{"GET", "HEAD", "POST", "PUT", "OPTIONS"}) 

    // Start http server 
    port := fmt.Sprintf(":%d", SomePort) 
    http.ListenAndServe(port, handlers.CORS(originsOk, headersOk, methodsOk)(r)) 

使用:

"github.com/gorilla/mux" 
"github.com/gorilla/handlers" 

,我在我得到的消息瀏覽器(西班牙文):

Solicitud desde OTRO奧利bloqueada:LApolítica德MISMO奧利 小鬼ide eler recurso remoto en https://miURL(razón:falta la cabecera CORS'Access-Control-Allow-Origin')。

英文:基本上服務器拒絕請求,因爲CORS頭不存在。

那麼,我的路由器配置有什麼問題?

+2

這有什麼好做reactjs但阿賈克斯和一般你的api。你要發送什麼請求標題?如果您發送除https://fetch.spec.whatwg.org/#cors-safelisted-request-header中列出的標題之外的任何標題,則會導致它預先填充請求,並且您的api將在OPTIONS請求上發送403。檢查你的API。 – cowbert

+0

@cowbert正確!那是唯一被髮送的頭文件 –

+0

正如在https://stackoverflow.com/questions/45967591/config-cors-in-gorilla-mux中的註釋中指出的那樣,它似乎是您的請求添加了「osn」請求頭文件隨着添加一個Access-Control-Allow-Origin,它絕對不需要添加 - 這就是觸發瀏覽器執行預檢選項的原因。正如在另一個問題的評論中也提到的那樣,問題在於你的服務器以403的OPTIONS請求來響應你發送請求的任何URL。因此,您需要將後端配置爲不要求對該路線的OPTIONS請求進行身份驗證 – sideshowbarker

回答

2

隨着rs/cors你應該很容易地解決CORS問題。

在您server.go

package main 

import (
    . . .  
    "fmt" 
    "log" 
    "net/http" 
    "github.com/gorilla/mux" 
    "github.com/rs/cors" 
    "../myhandler" 
) 

func main() { 

fmt.Println("Settin up server, enabling CORS . . .") 

    c := cors.New(cors.Options{ 
     AllowedOrigins: []string{"*"}, // All origins 
     AllowedMethods: []string{"GET"}, // Allowing only get, just an example 
    }) 

    router := mux.NewRouter() 
    // Example handler 
    router.HandleFunc("/test", myhandler.TestHandler()) 
    http.Handle("/", router) 

    // Bind to port 8000 and pass our router in and pass the cors Handler 
    log.Fatal(http.ListenAndServe(":8000"), c.Handler(router))) 

    fmt.Println("Server is ready and is listening at port :8000 . . .") 

} 

並在您testhandler.go,讓我們假設你想接受Content-Type: application/json

. . . 

func TestHandler func(w http.ResponseWriter, r *http.Request) { 
    w.Header().Set("Content-Type", "application/json") 
    w.WriteHeader(http.StatusOK) 
    return 
}