2017-10-13 46 views
2

我一直在努力在我的Elm客戶端和長頸鹿服務器之間啓用跨域請求。儘管在Elm和長頸鹿中啓用了CORS,但Http Post的問題

榆樹(客戶端):

tryPostRegistration : String -> Http.Body -> Decoder JsonProfile -> Http.Request JsonProfile 
tryPostRegistration url body decoder = 
    Http.request 
     { method = "POST" 
     , headers = 
      [ header "Origin" "http://elm-lang.org" 
      , header "Access-Control-Request-Method" "POST" 
      , header "Access-Control-Request-Headers" "X-Custom-Header" 
      ] 
     , url = url 
     , body = body 
     , expect = Http.expectJson decoder 
     , timeout = Nothing 
     , withCredentials = False 
     } 


tryRegister : Form -> (Result Http.Error JsonProfile -> msg) -> Cmd msg 
tryRegister form msg = 
    let 
     url = 
      baseUrl ++ "register" 

     body = 
      encodeRegistration form |> Http.jsonBody 

     request = 
      tryPostRegistration url body profileDecoder 
    in 
     Http.send msg request 

錯誤(榆樹客戶端):

HTTP404:NOT FOUND - 服務器沒有找到任何匹配 請求的URI(統一資源標識符)(XHR)選項 - http://localhost:5000/register

長頸鹿(服務器):

let configureCors (builder : CorsPolicyBuilder) = 
    builder.WithOrigins("http://localhost:5000").AllowAnyMethod().AllowAnyHeader() |> ignore 

let configureApp (app : IApplicationBuilder) = 
    app.UseCors configureCors |> ignore 
    app.UseGiraffe webApp 

let configureServices (services : IServiceCollection) = 
    ... 
    services.AddCors |> ignore // Enables CORS 

錯誤(長頸鹿服務器):

DBUG:Microsoft.AspNetCore.StaticFiles.StaticFileMiddleware 1 OPTIONS請求不被支持

dbug:Giraffe.Middleware.GiraffeMiddleware [0] 長頸鹿迴歸斯內德對於一些HTTP/1.1 OPTIONS /註冊

附錄:

Elm Gateway (with CORS support)

Giraffe server (with CORS support)

Giraffe CORS sample project reference

回答

2

有時間檢查一下,並找不到任何路線在您的代碼或帶選項路線的長頸鹿代碼。在C#中。核心網我用:

public IActionResult GetOptions() 
    { 
     Response.Headers.Add("Allow", "GET, OPTIONS, POST"); 
     return Ok(); 
    } 

所以,我認爲你需要這樣的GET補充一下:

route "/options" >=> setHttpHeader "Allow" "GET, OPTIONS, POST" 

心中已經沒有試過長頸鹿,所以我一直沒能測試這是否正確。

+0

我愛你的男人... –

1
let configureCors (builder : CorsPolicyBuilder) = 
    builder.WithOrigins("http://localhost:5000").AllowAnyMethod().AllowAnyHeader() |> ignore 

該位表示「允許跨起源請求來源是否爲http://localhost:5000。但是,您似乎在默認端口8000上使用了elm-live。因此,您的服務器拒絕來自端口8000的請求。

長話短說,更改爲http://localhost:8000。如果這不能解決問題,手指穿過真正的F#知識的人可以進一步幫助。


headers = 
    [ header "Origin" "http://elm-lang.org" 
    , header "Access-Control-Request-Method" "POST" 
    , header "Access-Control-Request-Headers" "X-Custom-Header" 
    ] 

該位不會做任何事情 - 瀏覽器本身設置這些。 Elm的HTTP庫使用您的瀏覽器的XMLHttpRequest實現,並且XMLHttpRequest不允許設置這些標頭,因此它們將被忽略。 https://fetch.spec.whatwg.org/#forbidden-header-namer列出您不允許覆蓋的標頭。

+0

謝謝。我提出了你所建議的更新。但是,我仍然收到相同的錯誤。 –

+0

似乎你正在使用Cookie認證。根據https://docs.microsoft.com/en-us/aspnet/core/security/cors,您可能需要將..AllowCredentials()添加到configureCors - 我必須在使用Windows身份驗證時執行此操作。 –

+0

此外 - 檢查瀏覽器devtools網絡選項卡(或Fiddler)中的飛行前請求和響應,並驗證它是否符合https://docs.microsoft.com/en-us/aspnet/core/security/cors(How CORS工作)。你有沒有嘗試不同的瀏覽器? –

相關問題