कोणीय 5 में हेडर में कोर के अनुरोध को कैसे जोड़ा जाए


87

मैंने हेडर में कोर्स को जोड़ा है, लेकिन मुझे अभी भी अपने अनुरोध में कॉर्स मुद्दा मिल रहा है। हेडर में CORS और अन्य अनुरोधों को जोड़ने और संभालने का सही तरीका क्या है?

यहाँ सेवा फ़ाइल कोड है:

import { HttpClient, HttpHeaders, HttpClientModule } from '@angular/common/http';
const httpOptions = {
  headers: new HttpHeaders({ 
    'Access-Control-Allow-Origin':'*',
    'Authorization':'authkey',
    'userid':'1'
  })
};

public baseurl = 'http://localhost/XXXXXX';

userAPI(data): Observable<any> {
  return this.http.post(this.baseurl, data, httpOptions)
    .pipe(
      tap((result) => console.log('result-->',result)),
      catchError(this.handleError('error', []))
    );
}

त्रुटि:

प्रीफ़्लाइट अनुरोध का उत्तर एक्सेस कंट्रोल चेक पास नहीं करता है: अनुरोधित संसाधन पर कोई 'एक्सेस-कंट्रोल-अनुमति-उत्पत्ति' हेडर मौजूद नहीं है। उत्पत्ति ' http: // localhost: 4200 ' इसलिए पहुंच की अनुमति नहीं है

विफल: (अज्ञात url) के लिए Http विफलता प्रतिक्रिया: 0 अज्ञात त्रुटि

अपने सर्वर-साइड कोड में, मैंने कोर को इंडेक्स फ़ाइल में जोड़ा है।

header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Methods: GET, POST, PATCH, PUT, DELETE, OPTIONS');
header('Access-Control-Allow-Headers: Origin, Content-Type, X-Auth-Token');

3
सर्वर की तरफ कॉर्स हेडर जोड़ने की जरूरत है।
सचिला रणवाका

@SachilaRanawaka हाँ मैंने इसे अपनी अनुक्रमणिका फ़ाइल में जोड़ा है।
अमन कुमार

उस सर्वर फ़ाइल को पोस्ट करें
सचिला रणवाका


यह उत्तर शायद उपयोगी हो सकता है: stackoverflow.com/a/58064366/7059557
अमीररज़ा-फ़राहलगहा

जवाबों:


51

मेरे अनुभव में प्लगइन्स ने HTTP के साथ काम किया लेकिन नवीनतम httpClient के साथ नहीं। इसके अलावा, सर्वर पर CORS प्रतिक्रिया हेडर को कॉन्फ़िगर करना वास्तव में एक विकल्प नहीं था। इसलिए, मैंने proxy.conf.jsonप्रॉक्सी सर्वर के रूप में कार्य करने के लिए एक फ़ाइल बनाई ।

इसके बारे में यहाँ और अधिक पढ़ें ।

proxy.conf.json फ़ाइल:

{
  "/posts": {
    "target": "https://example.com",
    "secure": true,
    "pathRewrite": {
    "^/posts": ""
  },
    "changeOrigin": true
  }
}

मैंने फ़ाइल को उसी निर्देशिका में proxy.conf.jsonफ़ाइल के ठीक बगल में रखा package.json

तब मैंने package.json फ़ाइल में स्टार्ट कमांड को संशोधित किया:

"start": "ng serve --proxy-config proxy.conf.json"

मेरे ऐप घटक से HTTP कॉल:

return this._http.get('/posts/pictures?method=GetPictures')
.subscribe((returnedStuff) => {
  console.log(returnedStuff);
});

अंत में अपना ऐप चलाने के लिए, मुझे उपयोग करना होगा npm startयाng serve --proxy-config proxy.conf.json


15
यह सिर्फ विकास के उद्देश्य से काम करता है। आप उस प्रॉक्सी टूल से अपना ऐप नहीं बना सकते हैं
GVArt

किसी को यहाँ कृपया stackoverflow.com/questions/55429787/…
नेल्सन किंग

हमें targetप्रॉक्सी.कॉन्फ़िग फ़ाइल में क्या सेट करना चाहिए ?
A-Sharabiani

मैंने इसे स्टेटस दिखाते हुए बांध दिया लेकिन अब नई त्रुटि हो रही है। HttpErrorResponse {headers: HttpHeaders, status: 200, statusText: "OK", url: "http://localhost:4200/", ok: false, …} error: SyntaxError: Unexpected token < in JSON at position 0 at JSON.parse (<anonymous>) message: "Unexpected token < in JSON at position 0" "
अमन गुप्ता

8
यह उत्पादन के निर्माण में काम नहीं करता है, इसलिए यह एक उचित समाधान नहीं हो सकता है
आरोन मैथ्यू

4

आप fetchफ़ंक्शन और no-corsमोड भी आज़मा सकते हैं । मुझे कभी-कभी एंगुलर की अंतर्निहित http मॉड्यूल की तुलना में इसे कॉन्फ़िगर करना आसान लगता है। आप Chrome देव टूल नेटवर्क टैब में अनुरोधों पर राइट-क्लिक कर सकते हैं और उन्हें लाने के लिए सिंटैक्स ले सकते हैं, जो बहुत अच्छा है।

import { from } from 'rxjs';

// ...

result = from( // wrap the fetch in a from if you need an rxjs Observable
  fetch(
    this.baseurl,
    {
      body: JSON.stringify(data)
      headers: {
        'Content-Type': 'application/json',
      },
      method: 'POST',
      mode: 'no-cors'
    }
  )
);

प्रश्न में कोड प्रतिक्रिया को पढ़ने की कोशिश कर रहा है । no-corsब्लॉक करता है। यह सामग्री-प्रकार को सेट करने के लिए भी ब्लॉक करता है application/json
क्वेंटिन

Api.github.com/orgs/nesign/repos के लिए बहुत विशिष्ट मामला है, मैंने देखा कि Access to XMLHttpRequest at '..' from origin '..' has been blocked by CORS policy: Request header field x-timezone is not allowed by Access-Control-Allow-Headers in preflight response.यह ओवरराइड करने में असमर्थ है Access-Control-Request-Headers: cache-control,x-timezoneजो डिफ़ॉल्ट रूप से जुड़ गया है :( और गितूब ने जवाब में यह Access-Control-Allow-Headers: Authorization, Content-Type, If-Match, If-Modified-Since, If-None-Match, If-Unmodified-Since, Accept-Encoding, X-GitHub-OTP, X-Requested-With, User-Agentकाम किया है
आनंद रॉकज़

ऊप्स! एक्स-टाइमज़ोन मेरे द्वारा जोड़ा गया था - मैंने एक इंटरसेप्टर के साथ इंजीनियर किया httpclientथा लंबे समय से पहले :)
आनंद रॉकज़

3

यदि आप मेरे जैसे हैं और आप एक स्थानीय एसएमएस गेटवे सर्वर का उपयोग कर रहे हैं और आप 192.168.0.xx जैसे आईपी के लिए एक GET अनुरोध करते हैं, तो आप सुनिश्चित करें कि कोर त्रुटि के लिए मिलेगा।

दुर्भाग्य से मुझे एक कोणीय समाधान नहीं मिला, लेकिन पिछले रिप्ले की मदद से मुझे अपना समाधान मिल गया और मैं कोणीय 7 8 9 के लिए एक अद्यतन संस्करण पोस्ट कर रहा हूं।

import {from} from 'rxjs';

getData(): Observable<any> {
    return from(
      fetch(
        'http://xxxxx', // the url you are trying to access
        {
          headers: {
            'Content-Type': 'application/json',
          },
          method: 'GET', // GET, POST, PUT, DELETE
          mode: 'no-cors' // the most important option
        }
      ));
  }

बस .subscribe हमेशा की तरह।


2

शीर्ष लेख को NG5 में HttpClient के लिए इस तरह बनाएं:

let httpOptions = {
      headers: new HttpHeaders({
        'Content-Type': 'application/json',
        'apikey': this.apikey,
        'appkey': this.appkey,
      }),
      params: new HttpParams().set('program_id', this.program_id)
    };

आप अपने लोकलहोस्ट यूआरएल के साथ एपि कॉल कर पाएंगे, यह मेरे लिए काम करता है ।।

  • कृपया शीर्षलेख में अपने परम कोलम को कभी न भूलें: जैसे कि परम: नया HttpParams () सेट। ('program_id', this.program_id)

2

एंगुलर 6 में httpClient के साथ एक पोस्ट भी एक विकल्प अनुरोध कर रहा था:

हेडर जनरल:

अनुरोध URL: https: //hp-probook/perl-bin/muziek.pl/=/postData
अनुरोध विधि: विकल्प
स्थिति कोड: 200 ठीक है
दूरस्थ पता: 127.0.0.1: 443
रेफ़रर पॉलिसी: नो-रेफ़रर-जब-डाउनग्रेड

मेरा पर्ल रीस्ट सर्वर रिटर्न कोड 200 के साथ विकल्प अनुरोध को लागू करता है।

अगले पोस्ट अनुरोध हैडर:

स्वीकार करना:*/*
स्वीकार-एनकोडिंग: gzip, deflate, br
स्वीकार करें-भाषा: nl-NL, nl, q = 0.8, en-US; q = 0.6, एन, क्यू = 0.4
पहुंच-नियंत्रण-अनुरोध-हेडर: सामग्री प्रकार
पहुंच-नियंत्रण-अनुरोध-विधि: पोस्ट
कनेक्शन: रखें जिंदा
मेजबान: HP-PROBOOK
उत्पत्ति: http: // localhost: 4200
संदर्भित: http: // localhost: 4200 /
उपयोगकर्ता-एजेंट: मोज़िला / 5.0 (X11; लिनक्स x86_64) AppleWebKit / 537.36 (KHTML, जैसे गेको) Chrome / 59.0.3071.109 Safari / 537.36

सूचना पहुँच-नियंत्रण-अनुरोध-हेडर्स: सामग्री-प्रकार।

तो, मेरी बैकेंड पर्ल स्क्रिप्ट निम्नलिखित हेडर का उपयोग करती है:

 - "अभिगम-नियंत्रण-अनुमति-उत्पत्ति" => '*',
 - "एक्सेस-कंट्रोल-अलाउंस-मेथड्स" => 'GET, POST, PATCH, DELETE, PUT, OPTIONS',
 - "एक्सेस-कंट्रोल-अनुमति-हेडर्स" => 'उत्पत्ति, सामग्री-प्रकार, एक्स-प्रामाणिक-टोकन, सामग्री-प्रकार'

इस सेटअप के साथ GET और POST ने मेरे लिए काम किया!


1

कृपया कोणीय कोर्स से अनुरोधों को आयात करें

    import {RequestOptions, Request, Headers } from '@angular/http';

और नीचे दिए गए अपने कोड में अनुरोध विकल्प जोड़ें

    let requestOptions = new RequestOptions({ headers:null, withCredentials: 
    true });

अपने एपीआई अनुरोध में अनुरोध विकल्प भेजें

नीचे कोड स्निपेट-

     let requestOptions = new RequestOptions({ headers:null, 
     withCredentials: true });
     return this.http.get(this.config.baseUrl + 
     this.config.getDropDownListForProject, requestOptions)
     .map(res => 
     {
      if(res != null)
      { 
        return res.json();
        //return true;
      }
    })
  .catch(this.handleError);
   }  

और अपने बैकएंड PHP कोड में CORS जोड़ें जहां सभी एपीआई अनुरोध पहले उतरेंगे।

इसे आज़माएं और मुझे बताएं कि क्या यह काम कर रहा है या नहीं, मेरे पास एक ही मुद्दा था मैं कोणीय 5 से कॉर्स जोड़ रहा था जो काम नहीं कर रहा था, तो मैंने कॉर्स को बैकेंड में जोड़ा और यह मेरे लिए काम कर गया


-6

निम्नलिखित ने घंटों की कोशिश के बाद मेरे लिए काम किया

      $http.post("http://localhost:8080/yourresource", parameter, {headers: 
      {'Content-Type': 'application/json', 'Access-Control-Allow-Origin': '*' } }).

हालाँकि निम्नलिखित कोड काम नहीं किया, मैं स्पष्ट नहीं हूँ कि क्यों, उम्मीद है कि कोई इस उत्तर को सुधार सकता है।

          $http({   method: 'POST', url: "http://localhost:8080/yourresource", 
                    parameter, 
                    headers: {'Content-Type': 'application/json', 
                              'Access-Control-Allow-Origin': '*',
                              'Access-Control-Allow-Methods': 'POST'} 
                })

1
$ http? क्या यह AngularJS है, क्योंकि हम वहां Angular 5 के बारे में बात कर रहे हैं। यह कोड काम नहीं कर सका
विक्टर जोज़्विकि

@VictorJozwicki आप सही हैं कि यह कोणीय 5 नहीं है। मेरे पैकेज में। यह केवल कोणीय संस्करण 1.7.5 दिखाता है।
एमजी डेवलपर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.