7 回答

TA貢獻1815條經驗 獲得超13個贊
我相信這是最簡單的例子:
header := w.Header()
header.Add("Access-Control-Allow-Origin", "*")
header.Add("Access-Control-Allow-Methods", "DELETE, POST, GET, OPTIONS")
header.Add("Access-Control-Allow-Headers", "Content-Type, Authorization, X-Requested-With")
您還可以添加標題Access-Control-Max-Age,當然您可以允許任何您想要的標題和方法。
最后你想回應最初的請求:
if r.Method == "OPTIONS" {
w.WriteHeader(http.StatusOK)
return
}
編輯(2019 年 6 月):我們現在為此使用大猩猩。他們的東西得到了更積極的維護,而且他們已經這樣做了很長時間。留下舊的鏈接,以防萬一。
下面的舊中間件推薦: 當然,為此使用中間件可能會更容易。我不認為我已經使用過它,但是這個似乎是強烈推薦的。

TA貢獻1830條經驗 獲得超9個贊
這個答案解釋了幕后發生的事情,以及如何用任何語言解決這個問題的基礎知識。有關參考,請參閱有關此主題的 MDN 文檔。
您正在從一個域(比如 domain-a.com)上運行的 JavaScript 向另一個域(domain-b.com)上運行的 API 發出 URL 請求。當您這樣做時,瀏覽器必須詢問 domain-b.com 是否可以允許來自 domain-a.com 的請求。它通過一個 HTTP 請求來做到這一點OPTIONS。然后,在響應中,domain-b.com 上的服務器必須(至少)提供以下 HTTP 標頭,上面寫著“是的,沒關系”:
HTTP/1.1 204 No Content // or 200 OK
Access-Control-Allow-Origin: https://domain-a.com // or * for allowing anybody
Access-Control-Allow-Methods: POST, GET, OPTIONS // What kind of methods are allowed
... // other headers
如果您使用的是 Chrome,您可以通過按 F12 并轉到“網絡”選項卡來查看 domain-b.com 上的服務器給出的響應,從而查看響應的樣子。
因此,回到@threeve 的原始答案的最低限度:
header := w.Header()
header.Add("Access-Control-Allow-Origin", "*")
if r.Method == "OPTIONS" {
w.WriteHeader(http.StatusOK)
return
}
這將允許任何人從任何地方訪問這些數據。由于其他原因,他包含的其他標頭是必需的,但這些標頭是通過 CORS(跨源資源共享)要求的最低要求。

TA貢獻1798條經驗 獲得超7個贊
CORS 問題應該在后端修復。臨時解決方法使用此選項。
打開命令提示符
導航到 chrome 安裝位置或輸入
cd "c:\Program Files (x86)\Google\Chrome\Application"
ORcd "c:\Program Files\Google\Chrome\Application"
執行命令
chrome.exe --disable-web-security --user-data-dir="c:/ChromeDevSession"
使用上述選項,您可以在沒有安全保護的情況下打開新的 chrome。這個 chrome 不會拋出任何 cors 問題。

TA貢獻1786條經驗 獲得超11個贊
對于尚未找到解決方案的任何人,如果您正在使用:
AWS HTTP API 網關;
您正在使用帶有身份驗證的任何方法進行路由和 lambda 集成;
您認為您已經正確配置了 CORS;
該錯誤是因為瀏覽器正在向您的路由發送預檢 OPTIONS 請求而沒有 Authentication 標頭,因此無法獲得 CORS 標頭作為響應。
為了解決這個問題,我在沒有身份驗證的情況下為 OPTIONS 方法添加了另一條路線,并且 lambda 集成僅返回 { statusCode: 200 };

TA貢獻1818條經驗 獲得超8個贊
在 WebService 應用程序中啟用 CORS。首先,添加 CORS NuGet 包。在 Visual Studio 中,從工具菜單中選擇 NuGet 包管理器,然后選擇包管理器控制臺。在包管理器控制臺窗口中,鍵入以下命令:
Install-Package Microsoft.AspNet.WebApi.Cors
此命令安裝最新的包并更新所有依賴項,包括核心 Web API 庫。使用 -Version 標志來定位特定版本。CORS 包需要 Web API 2.0 或更高版本。
打開文件 App_Start/WebApiConfig.cs。將以下代碼添加到 WebApiConfig.Register 方法:
using System.Web.Http;
namespace WebService
{
? ? public static class WebApiConfig
? ? {
? ? ? ? public static void Register(HttpConfiguration config)
? ? ? ? {
? ? ? ? ? ? // New code
? ? ? ? ? ? config.EnableCors();
? ? ? ? ? ? config.Routes.MapHttpRoute(
? ? ? ? ? ? ? ? name: "DefaultApi",
? ? ? ? ? ? ? ? routeTemplate: "api/{controller}/{id}",
? ? ? ? ? ? ? ? defaults: new { id = RouteParameter.Optional }
? ? ? ? ? ? );
? ? ? ? }
? ? }
}
接下來,將 [EnableCors] 屬性添加到您的控制器/控制器方法
using System.Net.Http;
using System.Web.Http;
using System.Web.Http.Cors;
namespace WebService.Controllers
{
? ? [EnableCors(origins: "http://mywebclient.azurewebsites.net", headers: "*", methods: "*")]
? ? public class TestController : ApiController
? ? {
? ? ? ? // Controller methods not shown...
? ? }
}

TA貢獻1802條經驗 獲得超4個贊
Angular 和 Django Rest 框架。
我在向我的 DRF api 發出發布請求時遇到了類似的錯誤。碰巧我所缺少的只是端點的尾部斜杠。

TA貢獻1872條經驗 獲得超4個贊
這里提供的解決方案是正確的。但是,同樣的錯誤也可能發生在用戶錯誤中,即您的端點請求方法與您在發出請求時使用的方法不匹配。
例如,當您將方法請求為 POST 時,服務器端點使用“RequestMethod.PUT”定義。
- 7 回答
- 0 關注
- 6300 瀏覽
添加回答
舉報