AngularJS ดำเนินการร้องขอ OPTIONS HTTP สำหรับทรัพยากรข้ามแหล่ง


264

ฉันกำลังพยายามตั้งค่า AngularJS เพื่อสื่อสารกับทรัพยากรข้ามแหล่งที่ซึ่งโฮสต์สินทรัพย์ที่ส่งไฟล์เทมเพลตของฉันอยู่ในโดเมนอื่นดังนั้น XHR ขอให้ดำเนินการเชิงมุมจะต้องข้ามโดเมน ฉันได้เพิ่มส่วนหัว CORS ที่เหมาะสมลงในเซิร์ฟเวอร์ของฉันสำหรับคำขอ HTTP เพื่อให้ทำงานได้ แต่ดูเหมือนจะไม่ทำงาน ปัญหาคือเมื่อฉันตรวจสอบคำขอ HTTP ในเบราว์เซอร์ของฉัน (chrome) คำขอที่ส่งไปยังไฟล์เนื้อหาคือคำขอ OPTIONS (ควรเป็นคำขอ GET)

ฉันไม่แน่ใจว่านี่เป็นข้อผิดพลาดใน AngularJS หรือไม่ถ้าฉันต้องการกำหนดค่าบางอย่าง จากสิ่งที่ฉันเข้าใจว่า XHR wrapper ไม่สามารถทำการร้องขอ OPTIONS HTTP ดังนั้นดูเหมือนว่าเบราว์เซอร์กำลังพยายามหาว่า "อนุญาต" เพื่อดาวน์โหลดเนื้อหาก่อนหรือไม่ก่อนที่จะดำเนินการตามคำขอ GET หากเป็นกรณีนี้ฉันจำเป็นต้องตั้งค่าส่วนหัว CORS (การควบคุมการเข้าถึงอนุญาตให้กำเนิด: http://asset.host .. .) กับโฮสต์สินทรัพย์ด้วยหรือไม่

คำตอบ:


226

คำขอ OPTIONS นั้นไม่ได้หมายถึงจุดบกพร่องของ AngularJS นี่เป็นวิธีที่ Cross-Origin Resource Sharing บังคับให้เบราว์เซอร์ทำงาน โปรดอ้างถึงเอกสารนี้: https://developer.mozilla.org/en-US/docs/HTTP_access_controlซึ่งอยู่ในส่วน "ภาพรวม" ที่ระบุไว้:

มาตรฐานการแบ่งปันทรัพยากรต้นกำเนิดทำงานโดยการเพิ่มส่วนหัว HTTP ใหม่ที่อนุญาตให้เซิร์ฟเวอร์อธิบายชุดของต้นกำเนิดที่ได้รับอนุญาตให้อ่านข้อมูลนั้นโดยใช้เว็บเบราว์เซอร์ นอกจากนี้สำหรับวิธีการร้องขอ HTTP ที่อาจทำให้เกิดผลข้างเคียงกับข้อมูลผู้ใช้ (โดยเฉพาะอย่างยิ่งสำหรับวิธี HTTP อื่น ๆ นอกเหนือจาก GET หรือสำหรับการใช้งาน POST ด้วย MIME บางประเภท) ข้อกำหนดกำหนดว่าเบราว์เซอร์ "preflight" คำขอร้องขอวิธีการสนับสนุนจากเซิร์ฟเวอร์ที่มีส่วนหัวคำขอ HTTP OPTIONS จากนั้นเมื่อ "อนุมัติ" จากเซิร์ฟเวอร์ส่งคำขอจริงด้วยวิธีการร้องขอ HTTP จริง เซิร์ฟเวอร์ยังสามารถแจ้งลูกค้าว่าควรส่ง "ข้อมูลรับรอง" (รวมถึงคุกกี้และข้อมูลการตรวจสอบ HTTP) ด้วยคำขอหรือไม่

เป็นการยากมากที่จะให้โซลูชันทั่วไปที่ทำงานกับเซิร์ฟเวอร์ WWW ทั้งหมดเนื่องจากการติดตั้งจะแตกต่างกันไปขึ้นอยู่กับเซิร์ฟเวอร์และคำกริยา HTTP ที่คุณต้องการให้การสนับสนุน ฉันขอแนะนำให้คุณอ่านบทความที่ยอดเยี่ยมนี้ ( http://www.html5rocks.com/en/tutorials/cors/ ) ซึ่งมีรายละเอียดเพิ่มเติมเกี่ยวกับส่วนหัวที่แน่นอนซึ่งจำเป็นต้องส่งโดยเซิร์ฟเวอร์


23
@matsko คุณสามารถอธิบายรายละเอียดเกี่ยวกับสิ่งที่คุณทำเพื่อแก้ไขปัญหานี้ได้หรือไม่? ฉันกำลังเผชิญกับปัญหาเดียวกันโดยคำขอAngularJS $resource POSTกำลังสร้างคำขอOPTIONSไปยังเซิร์ฟเวอร์ ExpressJS แบ็กเอนด์ของฉัน (บนโฮสต์เดียวกัน แต่เป็นพอร์ตอื่น)
dbau

6
สำหรับผู้ลงคะแนนทั้งหมด - เป็นไปไม่ได้ที่จะให้การตั้งค่าที่แน่นอนสำหรับเว็บเซิร์ฟเวอร์ทั้งหมดที่นั่น - คำตอบจะใช้เวลา 10 หน้าในกรณีนี้ ฉันได้เชื่อมโยงบทความที่ให้รายละเอียดเพิ่มเติมแทน
pkozlowski.opensource

5
คุณถูกที่คุณไม่สามารถกำหนดคำตอบได้ - คุณจะต้องเพิ่มส่วนหัวในการตอบสนองตัวเลือกของคุณที่ครอบคลุมส่วนหัวทั้งหมดที่เบราว์เซอร์ร้องขอในกรณีของฉันโดยใช้โครมมันเป็นส่วนหัว 'ยอมรับ' และ 'x -requested กับ' ใน Chrome ฉันพบสิ่งที่ฉันต้องการเพิ่มโดยดูที่คำขอเครือข่ายและดูว่า Chrome ขออะไร ฉันใช้ nodejs / expressjs เป็นข้อมูลสำรองดังนั้นฉันจึงสร้างบริการที่ตอบกลับคำขอ OPTIONS ที่ครอบคลุมส่วนหัวทั้งหมดที่ต้องการ -1 เพราะฉันไม่สามารถใช้คำตอบนี้เพื่อหาว่าต้องทำอย่างไรจึงต้องหาคำตอบเอง
Ed Sykes

2
ฉันรู้ว่ามันเป็น 2+ ปีต่อมา แต่ ... OP หมายถึงคำขอ GET หลายครั้ง (เน้นที่เพิ่มโดยฉัน): « [... ] คำขอที่ส่งไปยังไฟล์เนื้อหาเป็นคำขอ OPTIONS ( ควรเป็น GET คำขอ ). » และ«เบราว์เซอร์พยายามหาว่า "อนุญาต" เพื่อดาวน์โหลดเนื้อหาก่อนที่จะดำเนินการตามคำขอ GET »หรือไม่ มันจะไม่เป็นบั๊กของ AngularJS ได้อย่างไร? ไม่ควรห้ามการร้องขอ preflight สำหรับ GET ใช่ไหม
polettix

4
@polettix แม้คำขอ GET สามารถเรียกใช้คำขอเที่ยวบินล่วงหน้าในเบราว์เซอร์หากใช้ส่วนหัวที่กำหนดเอง ตรวจสอบ "คำขอที่ไม่ให้ง่าย" ในบทความที่ผมเคยเชื่อมโยง: html5rocks.com/en/tutorials/cors/#toc-making-a-cors-request เป็นกลไกของเบราว์เซอร์ไม่ใช่ AngularJS
pkozlowski.opensource

70

สำหรับ Angular 1.2.0rc1 + คุณต้องเพิ่ม resourceUrlWhitelist

1.2:รุ่นที่วางจำหน่ายจะเพิ่มฟังก์ชัน escapeForRegexp เพื่อให้คุณไม่ต้องหนีจากสายอีกต่อไป คุณสามารถเพิ่ม URL ได้โดยตรง

'http://sub*.assets.example.com/**' 

ตรวจสอบให้แน่ใจว่าได้เพิ่ม ** สำหรับโฟลเดอร์ย่อย นี่คือ jsbin ที่ใช้งานได้สำหรับ 1.2: http://jsbin.com/olavok/145/edit


1.2.0rc:หากคุณยังอยู่ในเวอร์ชั่น rc Angular 1.2.0rc1 วิธีแก้ปัญหาจะมีลักษณะดังนี้:

.config(['$sceDelegateProvider', function($sceDelegateProvider) {
     $sceDelegateProvider.resourceUrlWhitelist(['self', /^https?:\/\/(cdn\.)?yourdomain.com/]);
 }])

นี่คือตัวอย่าง jsbin ที่ใช้งานได้กับ 1.2.0rc1: http://jsbin.com/olavok/144/edit


ก่อน 1.2:สำหรับเวอร์ชั่นเก่า (อ้างอิงhttp://better-inter.net/enabling-cors-in-angular-js/ ) คุณต้องเพิ่ม 2 บรรทัดต่อไปนี้ใน config ของคุณ:

$httpProvider.defaults.useXDomain = true;
delete $httpProvider.defaults.headers.common['X-Requested-With'];

นี่คือตัวอย่าง jsbin ที่ใช้ได้กับรุ่น 1.2 ก่อน: http://jsbin.com/olavok/11/edit


สิ่งนี้ใช้ได้สำหรับฉัน นี่คือเวทย์มนตร์ที่เหมาะสมสำหรับฝั่งเซิร์ฟเวอร์ด้วย nodejs / express: gist.github.com/dirkk0/5967221
dirkk0

14
ใช้งานได้กับคำขอ GET เท่านั้น แต่ยังหาวิธีแก้ปัญหาสำหรับคำขอ POST ในโดเมนไขว้ไม่ได้
Pnct

2
การรวมคำตอบนี้กับผู้ใช้ 2304582 คำตอบข้างต้นควรใช้กับคำขอ POST คุณต้องบอกเซิร์ฟเวอร์ของคุณให้ยอมรับคำขอ POST จากเซิร์ฟเวอร์ภายนอกที่ส่งมา
Charlie Martin

ดูเหมือนว่ามันจะทำงานได้เองสำหรับฉัน ... ดังนั้น -1 คุณต้องการบางอย่างใน URL เดียวกับที่จะตอบสนองต่อคำขอ OPTIONS ซึ่งเป็นส่วนหนึ่งของการตรวจสอบเที่ยวบินล่วงหน้า คุณช่วยอธิบายได้ไหมว่าทำไมสิ่งนี้ถึงได้ผล
Ed Sykes

1
@EdSykes ฉันได้อัปเดตคำตอบสำหรับ 1.2 และเพิ่มตัวอย่าง jsbin ที่ใช้งานได้ หวังว่าจะแก้ปัญหาให้คุณ ตรวจสอบให้แน่ใจว่าคุณกดปุ่ม "Run with JS"
JStark

62

หมายเหตุ:ไม่แน่ใจว่าสามารถใช้งานได้กับ Angular รุ่นล่าสุด

ORIGINAL:

เป็นไปได้ที่จะแทนที่คำขอ OPTIONS (ผ่านการทดสอบใน Chrome เท่านั้น):

app.config(['$httpProvider', function ($httpProvider) {
  //Reset headers to avoid OPTIONS request (aka preflight)
  $httpProvider.defaults.headers.common = {};
  $httpProvider.defaults.headers.post = {};
  $httpProvider.defaults.headers.put = {};
  $httpProvider.defaults.headers.patch = {};
}]);

1
ทำงานได้ดีสำหรับฉันด้วย Chrome, FF & IE 10 IE 9 และด้านล่างควรได้รับการทดสอบบนเครื่อง Windows 7 หรือ XP
DOM

3
อีกวิธีหนึ่งสามารถตั้งค่านี้บนวิธีการของทรัพยากร $ เพียงอย่างเดียวและไม่ได้ทั่วโลก:$resource('http://yourserver/yourentity/:id', {}, {query: {method: 'GET'});
h7r

3
มีสิ่งใดที่จับได้หรือไม่ ดูเหมือนง่ายมาก แต่คำตอบก็ลึกลงไปในเธรด แก้ไข: ไม่ทำงานเลย
Sebastialonso

รหัสนี้ไปไหน ใน app.js, controller.js หรือที่อื่น ๆ
Murlidhar Fichadia

รหัสนี้ไม่ทำอะไรเลยสำหรับการขอรับ ฉันเพิ่มกฎแยกต่างหากเพื่อให้ได้รับเช่นกันใน config ของฉัน
kushalvm

34

บริการของคุณจะต้องตอบOPTIONSคำขอกับส่วนหัวเช่นนี้:

Access-Control-Allow-Origin: [the same origin from the request]
Access-Control-Allow-Methods: GET, POST, PUT
Access-Control-Allow-Headers: [the same ACCESS-CONTROL-REQUEST-HEADERS from request]

นี่คือเอกสารที่ดี: http://www.html5rocks.com/en/tutorials/cors/#toc-adding-cors-support-to-the-server


1
หากต้องการอธิบายอย่างละเอียดเกี่ยวกับส่วน [ACCESS-CONTROL-REQUEST-HEADERS เดียวกันจากคำขอ] ดังที่ฉันได้กล่าวไปแล้วในคำตอบอื่นคุณต้องดูที่ตัวเลือก OPTIONS ที่เบราว์เซอร์ของคุณเพิ่ม จากนั้นเพิ่มส่วนหัวเหล่านั้นในบริการที่คุณกำลังสร้าง (หรือเว็บเซิร์ฟเวอร์) ใน expressjs ที่ดูเหมือน: ejs.options (' ', ฟังก์ชั่น (ร้องขอ, การตอบสนอง) {response.header ('การเข้าถึงการควบคุมการอนุญาตให้กำเนิด', ' '); response.header ('การเข้าถึงการควบคุมการอนุญาตวิธีการ) ',' GET, PUT, POST, DELETE '); response.header (' Access-Control-Allow-Headers ',' เนื้อหาประเภท, การอนุญาต, ยอมรับ, x-Request-with '); response.send (); });
Ed Sykes

1
ความคิดเห็น Ed Sykes มีความแม่นยำมากโปรดทราบว่าส่วนหัวที่ส่งไปในการตอบสนอง OPTIONS และส่วนที่ส่งในการตอบสนอง POST ควรเหมือนกันทุกประการเช่น: Access-Control-Allow-Origin: * ไม่เหมือนกับ Access- อนุญาตให้ควบคุม - กำเนิด: * เนื่องจากช่องว่าง
Lucia

20

เอกสารเดียวกันบอกว่า

แตกต่างจากคำของ่าย (กล่าวถึงข้างต้น) คำขอ "preflighted" ก่อนส่งส่วนหัวคำขอ HTTP OPTIONS ไปยังทรัพยากรในโดเมนอื่นเพื่อตรวจสอบว่าคำขอจริงปลอดภัยที่จะส่ง คำขอข้ามไซต์จะทำการ preflighted เช่นนี้เนื่องจากอาจมีผลกระทบต่อข้อมูลผู้ใช้ โดยเฉพาะอย่างยิ่งคำขอจะได้รับการ preflight ถ้า:

มันใช้วิธีการอื่นที่ไม่ใช่ GET หรือ POST นอกจากนี้หาก POST ใช้ในการส่งข้อมูลคำขอด้วย Content-Type นอกเหนือจาก application / x-www-form-urlencoded, multipart / form-data หรือ text / plain เช่นถ้าคำขอ POST ส่ง XML payload ไปยังเซิร์ฟเวอร์ ใช้ application / xml หรือ text / xml ดังนั้นการร้องขอจะถูก preflighted

มันตั้งค่าส่วนหัวที่กำหนดเองในคำขอ (เช่นคำขอใช้ส่วนหัวเช่น X-PINGOTHER)

เมื่อคำขอดั้งเดิมคือรับโดยไม่มีส่วนหัวที่กำหนดเองเบราว์เซอร์ไม่ควรทำการร้องขอตัวเลือกที่ทำตอนนี้ ปัญหาคือมันสร้างส่วนหัว X-Requested-With ซึ่งบังคับให้ตัวเลือกการร้องขอ ดูhttps://github.com/angular/angular.js/pull/1454เกี่ยวกับวิธีลบส่วนหัวนี้



10

หากคุณกำลังใช้เซิร์ฟเวอร์ nodeJS คุณสามารถใช้ห้องสมุดนี้ได้ผลดีสำหรับฉันhttps://github.com/expressjs/cors

var express = require('express')
  , cors = require('cors')
  , app = express();

app.use(cors());

npm updateและหลังจากที่คุณสามารถทำ


4

นี่คือวิธีที่ฉันแก้ไขปัญหานี้ใน ASP.NET

  • ก่อนอื่นคุณควรเพิ่มแพ็คเกจ nuget Microsoft.AspNet.WebApi.Cors

  • จากนั้นแก้ไขไฟล์ App_Start \ WebApiConfig.cs

    public static class WebApiConfig    
    {
       public static void Register(HttpConfiguration config)
       {
          config.EnableCors();
    
          ...
       }    
    }
  • เพิ่มแอตทริบิวต์นี้ในคลาสตัวควบคุมของคุณ

    [EnableCors(origins: "*", headers: "*", methods: "*")]
    public class MyController : ApiController
    {  
        [AcceptVerbs("POST")]
        public IHttpActionResult Post([FromBody]YourDataType data)
        {
             ...
             return Ok(result);
        }
    }
  • ฉันสามารถส่ง json ไปยังการกระทำด้วยวิธีนี้

    $http({
            method: 'POST',
            data: JSON.stringify(data),
            url: 'actionurl',
            headers: {
                'Content-Type': 'application/json; charset=UTF-8'
            }
        }).then(...)

การอ้างอิง: การเปิดใช้งานคำขอข้ามแหล่งกำเนิดใน ASP.NET Web API 2


2

ยังไงก็เถอะฉันแก้ไขมันโดยการเปลี่ยน

<add name="Access-Control-Allow-Headers" 
     value="Origin, X-Requested-With, Content-Type, Accept, Authorization" 
     />

ถึง

<add name="Access-Control-Allow-Headers" 
     value="Origin, Content-Type, Accept, Authorization" 
     />

0

อธิบายอย่างสมบูรณ์ในความคิดเห็นของ pkozlowski ฉันมีวิธีแก้ปัญหาการทำงานกับ AngularJS 1.2.6 และ ASP.NET Web Api แต่เมื่อฉันอัพเกรด AngularJS เป็น 1.3.3 การร้องขอล้มเหลว

  • โซลูชันสำหรับเซิร์ฟเวอร์ Web Api คือการเพิ่มการจัดการคำขอ OPTIONS ที่จุดเริ่มต้นของวิธีการกำหนดค่า (ข้อมูลเพิ่มเติมในโพสต์บล็อกนี้ ):

    app.Use(async (context, next) =>
    {
        IOwinRequest req = context.Request;
        IOwinResponse res = context.Response;
        if (req.Path.StartsWithSegments(new PathString("/Token")))
        {
            var origin = req.Headers.Get("Origin");
            if (!string.IsNullOrEmpty(origin))
            {
                res.Headers.Set("Access-Control-Allow-Origin", origin);
            }
            if (req.Method == "OPTIONS")
            {
                res.StatusCode = 200;
                res.Headers.AppendCommaSeparatedValues("Access-Control-Allow-Methods", "GET", "POST");
                res.Headers.AppendCommaSeparatedValues("Access-Control-Allow-Headers", "authorization", "content-type");
                return;
            }
        }
        await next();
    });

ข้างต้นใช้งานไม่ได้สำหรับฉัน มีวิธีแก้ปัญหาที่ง่ายกว่ามากในการเปิดใช้งาน CORS สำหรับใช้กับ AngularJS กับ ASP.NET WEB API 2.2 และใหม่กว่า รับแพ็คเกจ Microsoft WebAPI CORS จาก Nuget จากนั้นในไฟล์กำหนดค่า WebAPI ของคุณ ... var cors = ใหม่ EnableCorsAttribute ("www.example.com", " ", " "); config.EnableCors ( ธ ); รายละเอียดอยู่ในเว็บไซต์ของ Microsoft ที่นี่asp.net/web-api/overview/security/…
kmcnamee

0

หากคุณใช้ Jersey สำหรับ REST API คุณสามารถทำได้ดังนี้

คุณไม่ต้องเปลี่ยนการใช้เว็บเซอร์

ฉันจะอธิบายสำหรับ Jersey 2.x

1) ขั้นแรกให้เพิ่ม ResponseFilter ตามที่แสดงด้านล่าง

import java.io.IOException;

import javax.ws.rs.container.ContainerRequestContext;
import javax.ws.rs.container.ContainerResponseContext;
import javax.ws.rs.container.ContainerResponseFilter;

public class CorsResponseFilter implements ContainerResponseFilter {

@Override
public void filter(ContainerRequestContext requestContext,   ContainerResponseContext responseContext)
    throws IOException {
        responseContext.getHeaders().add("Access-Control-Allow-Origin","*");
        responseContext.getHeaders().add("Access-Control-Allow-Methods", "GET, POST, DELETE, PUT");

  }
}

2) จากนั้นใน web.xml ในการประกาศ Jersey servlet เพิ่มด้านล่าง

    <init-param>
        <param-name>jersey.config.server.provider.classnames</param-name>
        <param-value>YOUR PACKAGE.CorsResponseFilter</param-value>
    </init-param>

0

ฉันเลิกพยายามแก้ไขปัญหานี้แล้ว

IIS web.config ของฉันมีส่วนเกี่ยวข้อง " Access-Control-Allow-Methods" ฉันได้ทดลองเพิ่มการตั้งค่า config ลงในโค้ด Angular ของฉัน แต่หลังจากเขียนไปสองสามชั่วโมงเพื่อพยายามให้ Chrome เรียกบริการเว็บ JSON ข้ามโดเมนฉันก็หมดท่า

ในท้ายที่สุดฉันเพิ่มหน้าเว็บตัวจัดการ ASP.Net ใบ้รับสิ่งนั้นเพื่อเรียกบริการเว็บ JSON ของฉันและส่งคืนผลลัพธ์ มันใช้งานได้ใน 2 นาที

นี่คือรหัสที่ฉันใช้:

public class LoadJSONData : IHttpHandler
{
    public void ProcessRequest(HttpContext context)
    {
        context.Response.ContentType = "text/plain";

        string URL = "......";

        using (var client = new HttpClient())
        {
            // New code:
            client.BaseAddress = new Uri(URL);
            client.DefaultRequestHeaders.Accept.Clear();
            client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
            client.DefaultRequestHeaders.Add("Authorization", "Basic AUTHORIZATION_STRING");

            HttpResponseMessage response = client.GetAsync(URL).Result;
            if (response.IsSuccessStatusCode)
            {
                var content = response.Content.ReadAsStringAsync().Result;
                context.Response.Write("Success: " + content);
            }
            else
            {
                context.Response.Write(response.StatusCode + " : Message - " + response.ReasonPhrase);
            }
        }
    }

    public bool IsReusable
    {
        get
        {
            return false;
        }
    }
}

และในตัวควบคุมเชิงมุมของฉัน ...

$http.get("/Handlers/LoadJSONData.ashx")
   .success(function (data) {
      ....
   });

ฉันแน่ใจว่ามีวิธีที่ง่ายกว่า / ทั่วไปกว่าในการทำเช่นนี้ แต่ชีวิตสั้นเกินไป ...

สิ่งนี้เหมาะกับฉันและฉันสามารถทำงานปกติได้ในขณะนี้ !!


0

สำหรับ IIS MVC 5 / Angular CLI (ใช่ฉันทราบดีว่าปัญหาของคุณคือโครงการ Angular JS) ด้วย API ที่ฉันทำต่อไปนี้:

web.configภายใต้<system.webServer>โหนด

    <staticContent>
      <remove fileExtension=".woff2" />
      <mimeMap fileExtension=".woff2" mimeType="font/woff2" />
    </staticContent>
    <httpProtocol>
      <customHeaders>
        <clear />
        <add name="Access-Control-Allow-Origin" value="*" />
        <add name="Access-Control-Allow-Headers" value="Content-Type, atv2" />
        <add name="Access-Control-Allow-Methods" value="GET, POST, PUT, DELETE, OPTIONS"/>
      </customHeaders>
    </httpProtocol>

Global.asax.cs

protected void Application_BeginRequest() {
  if (Request.Headers.AllKeys.Contains("Origin", StringComparer.OrdinalIgnoreCase) && Request.HttpMethod == "OPTIONS") {
    Response.Flush();
    Response.End();
  }
}

ที่ควรแก้ไขปัญหาของคุณสำหรับทั้ง MVC และ WebAPI โดยไม่ต้องดำเนินการอื่น ๆ ทั้งหมด จากนั้นฉันสร้าง HttpInterceptor ในโครงการ Angular CLI ที่เพิ่มไว้ในข้อมูลส่วนหัวที่เกี่ยวข้องโดยอัตโนมัติ หวังว่าสิ่งนี้จะช่วยให้ใครบางคนอยู่ในสถานการณ์ที่คล้ายกัน


0

สายไปงานเลี้ยงเล็ก ๆ น้อย ๆ

หากคุณใช้ Angular 7 (หรือ 5/6/7) และ PHP เป็น API และยังคงได้รับข้อผิดพลาดนี้ให้ลองเพิ่มตัวเลือกส่วนหัวต่อไปนี้ที่จุดสิ้นสุด (PHP API)

 header("Access-Control-Allow-Origin: *");
 header("Access-Control-Allow-Methods: PUT, GET, POST, PUT, OPTIONS, DELETE, PATCH");
 header("Access-Control-Allow-Headers: Origin, X-Requested-With, Content-Type, Accept, Authorization");

หมายเหตุ : Access-Control-Allow-Methodsสิ่งที่จะต้องเป็น แต่ฉันกำลังวางที่นี่อีกสองAccess-Control-Allow-OriginและAccess-Control-Allow-Headersเนื่องจากคุณจะต้องตั้งค่าทั้งหมดเหล่านี้อย่างเหมาะสมเพื่อให้แองกูลาร์แอปพูดคุยกับ API ของคุณอย่างถูกต้อง

หวังว่านี่จะช่วยใครซักคน

ไชโย

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.