7 回答

TA貢獻(xiàn)1815條經(jīng)驗(yàn) 獲得超13個(gè)贊
我相信這是最簡單的例子:
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")
您還可以添加標(biāo)題Access-Control-Max-Age,當(dāng)然您可以允許任何您想要的標(biāo)題和方法。
最后你想回應(yīng)最初的請(qǐng)求:
if r.Method == "OPTIONS" {
w.WriteHeader(http.StatusOK)
return
}
編輯(2019 年 6 月):我們現(xiàn)在為此使用大猩猩。他們的東西得到了更積極的維護(hù),而且他們已經(jīng)這樣做了很長時(shí)間。留下舊的鏈接,以防萬一。
下面的舊中間件推薦: 當(dāng)然,為此使用中間件可能會(huì)更容易。我不認(rèn)為我已經(jīng)使用過它,但是這個(gè)似乎是強(qiáng)烈推薦的。

TA貢獻(xiàn)1830條經(jīng)驗(yàn) 獲得超9個(gè)贊
這個(gè)答案解釋了幕后發(fā)生的事情,以及如何用任何語言解決這個(gè)問題的基礎(chǔ)知識(shí)。有關(guān)參考,請(qǐng)參閱有關(guān)此主題的 MDN 文檔。
您正在從一個(gè)域(比如 domain-a.com)上運(yùn)行的 JavaScript 向另一個(gè)域(domain-b.com)上運(yùn)行的 API 發(fā)出 URL 請(qǐng)求。當(dāng)您這樣做時(shí),瀏覽器必須詢問 domain-b.com 是否可以允許來自 domain-a.com 的請(qǐng)求。它通過一個(gè) HTTP 請(qǐng)求來做到這一點(diǎn)OPTIONS。然后,在響應(yīng)中,domain-b.com 上的服務(wù)器必須(至少)提供以下 HTTP 標(biāo)頭,上面寫著“是的,沒關(guān)系”:
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 并轉(zhuǎn)到“網(wǎng)絡(luò)”選項(xiàng)卡來查看 domain-b.com 上的服務(wù)器給出的響應(yīng),從而查看響應(yīng)的樣子。
因此,回到@threeve 的原始答案的最低限度:
header := w.Header()
header.Add("Access-Control-Allow-Origin", "*")
if r.Method == "OPTIONS" {
w.WriteHeader(http.StatusOK)
return
}
這將允許任何人從任何地方訪問這些數(shù)據(jù)。由于其他原因,他包含的其他標(biāo)頭是必需的,但這些標(biāo)頭是通過 CORS(跨源資源共享)要求的最低要求。

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

TA貢獻(xiàn)1786條經(jīng)驗(yàn) 獲得超11個(gè)贊
對(duì)于尚未找到解決方案的任何人,如果您正在使用:
AWS HTTP API 網(wǎng)關(guān);
您正在使用帶有身份驗(yàn)證的任何方法進(jìn)行路由和 lambda 集成;
您認(rèn)為您已經(jīng)正確配置了 CORS;
該錯(cuò)誤是因?yàn)闉g覽器正在向您的路由發(fā)送預(yù)檢 OPTIONS 請(qǐng)求而沒有 Authentication 標(biāo)頭,因此無法獲得 CORS 標(biāo)頭作為響應(yīng)。
為了解決這個(gè)問題,我在沒有身份驗(yàn)證的情況下為 OPTIONS 方法添加了另一條路線,并且 lambda 集成僅返回 { statusCode: 200 };

TA貢獻(xiàn)1818條經(jīng)驗(yàn) 獲得超8個(gè)贊
在 WebService 應(yīng)用程序中啟用 CORS。首先,添加 CORS NuGet 包。在 Visual Studio 中,從工具菜單中選擇 NuGet 包管理器,然后選擇包管理器控制臺(tái)。在包管理器控制臺(tái)窗口中,鍵入以下命令:
Install-Package Microsoft.AspNet.WebApi.Cors
此命令安裝最新的包并更新所有依賴項(xiàng),包括核心 Web API 庫。使用 -Version 標(biāo)志來定位特定版本。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貢獻(xiàn)1802條經(jīng)驗(yàn) 獲得超4個(gè)贊
Angular 和 Django Rest 框架。
我在向我的 DRF api 發(fā)出發(fā)布請(qǐng)求時(shí)遇到了類似的錯(cuò)誤。碰巧我所缺少的只是端點(diǎn)的尾部斜杠。

TA貢獻(xiàn)1872條經(jīng)驗(yàn) 獲得超4個(gè)贊
這里提供的解決方案是正確的。但是,同樣的錯(cuò)誤也可能發(fā)生在用戶錯(cuò)誤中,即您的端點(diǎn)請(qǐng)求方法與您在發(fā)出請(qǐng)求時(shí)使用的方法不匹配。
例如,當(dāng)您將方法請(qǐng)求為 POST 時(shí),服務(wù)器端點(diǎn)使用“RequestMethod.PUT”定義。
- 7 回答
- 0 關(guān)注
- 6260 瀏覽
添加回答
舉報(bào)