2015-05-15 11 views
56

के बजाय विकल्प भेज रहा है मैं PHP बैकएंड के माध्यम से एक MySQL डेटाबेस में डेटा को अद्यतन/सम्मिलित करने का प्रयास कर रहा हूं। मैं AngularJS के साथ फ्रंट एंड का निर्माण कर रहा हूं और REST API के साथ संचार करने के लिए $http सेवा का उपयोग कर रहा हूं।

मेरे सेटअप इस तरह दिखता है:

मैं के माध्यम से शीर्ष लेख सेट कर रहा हूं $ httpProvider:

$httpProvider.defaults.withCredentials = true; 
$httpProvider.defaults.headers = {'Content-Type': 'application/json;charset=utf-8'}; 

और बाद कॉल इस तरह दिखता है:

return $http({ 
     url: url, 
     method: "POST", 
     data: campaign 
    }); 

क्रोम में देव कंसोल मुझे यह दिखाता है:

enter image description here

जब मैं पद से बदल डालने के लिए, मैं एक विकल्प भेज रहा एक PUT बजाय कहते हैं। और सामग्री-प्रकार केवल content-type पर स्विच करता है।

मेरा अनुरोध पेलोड एक वस्तु के रूप में भेज रहा है:

enter image description here

मैं अपने हैडर ठीक से सेट करते हैं?


संपादित करें:

$e->getResponse() 
       ->getHeaders() 
       ->addHeaderLine('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS'); 

    $e->getResponse() 
       ->getHeaders() 
       ->addHeaderLine('Access-Control-Allow-Origin', '*'); 

वहाँ कुछ याद आ रही है:

पीएचपी बैकएंड कुछ हेडर सेट करता है?

+0

एप्लिकेशन/जेसन एक डिफ़ॉल्ट सामग्री-प्रकार सेट है। यदि आप इसे टेक्स्ट/सादे – Chandermani

+0

@Chandermani पर सेट कर रहे हैं तो आपको अपने कोड में खोजना होगा। मेरा कोड काफी छोटा है। मेरे पास एक api.js फ़ाइल है जहां मैं इसे करता हूं, और एक .config.js फ़ाइल जहां मैं वर्तमान में शीर्षलेख मैन्युअल रूप से सेट करता हूं। –

+0

मैं सर्वसम्मति से सहमत हूं। आपके शीर्षकों की आवश्यकता नहीं होनी चाहिए। कुछ बहुत अजीब चल रहा है। मैं कोणीय में लिखे गए प्रत्येक 'http.post' को देखता हूं और वे सभी सरल थे। हेडर माना जाता था। –

उत्तर

64

ठीक है, मैंने इसे हल कर लिया है।

समस्या क्या थी?
हटाएँ CORS कार्यप्रवाह, रख दिया और पोस्ट इस प्रकार है:

enter image description here

यह क्या करता है, यह है:

  1. चेकिंग जो अनुरोध करने वाले
  2. बनाया जा रहा है, तो यह पोस्ट है ,
  3. यह पहले यह देखने के लिए एक विकल्प अनुरोध भेजता है कि डोमेन, जिस अनुरोध से भेजा गया है, सर्वर से एक जैसा ही है। एक विकल्प अनुरोध क्रेडेंशियल्स नहीं भेजता है:
  4. यदि नहीं, यह एक प्रवेश-हैडर इस अनुरोध

यहां महत्वपूर्ण भेजने के लिए अनुमति दी जा करना चाहता है।

तो मेरे बैकएंड सर्वर ने PUT अनुरोध को अस्वीकार कर दिया।

समाधान:
.htaccess फ़ाइल

RewriteCond %{REQUEST_METHOD} OPTIONS 
RewriteRule ^(.*)$ blank.php [QSA,L] 
Header set Access-Control-Allow-Origin "http://sub.domain:3000" 
Header always set Access-Control-Allow-Credentials "true" 
Header always set Access-Control-Max-Age "1000" 
Header always set Access-Control-Allow-Headers "X-Requested-With, Content-Type, Origin, Authorization, Accept, Client-Security-Token, Accept-Encoding" 
Header always set Access-Control-Allow-Methods "POST, GET, OPTIONS, DELETE, PUT" 

इसके बाद अंदर इस लाना, सार्वजनिक फ़ोल्डर के अंदर blank.php कहा जाता है एक खाली .php फ़ाइल बनाएँ।

संपादित करें: एक टिप्पणीकर्ता के रूप में, एक खाली PHP फ़ाइल बनाने के बजाय, आप इस rewrite नियम को अपनी .htaccess फ़ाइल में जोड़ सकते हैं \;

RewriteRule ^(.*)$ $1 [R=200,L,E=HTTP_ORIGIN:%{HTTP:ORIGIN}]] 

स्पष्ट करने के लिए:

  1. मैं पहले से ही पहुंच-नियंत्रण-हैडर
  2. यह क्या हल पहले दो लाइनों था, और
  3. पहुंच-नियंत्रण-अनुमति दें-उत्पत्ति भेजा पोर्ट

के साथ विशिष्ट सबडोमेन से सर्वश्रेष्ठ वेबसाइट मैंपर पा सकता हूं।

+0

blank.php बनाने के बजाय, हम इस 'रिवाइट्रूल^^ का उपयोग कर सकते हैं।*) $ $ 1 [आर = 200, एल, ई = HTTP_ORIGIN:% {HTTP: ओरिजिन}]] ' – rajagopalx

+0

धन्यवाद @gruberb। आपकी जानकारी ने मुझे समझने में मदद की कि मुझे पोस्ट के बजाय विकल्प क्यों मिला। – Velidan

+0

बधाई। मैंने इस तरह के एक पूर्ण कोर स्पष्टीकरण कभी नहीं देखा है। – jprivillaso

3

आप मैन्युअल रूप से अपने $http हेडर निर्दिष्ट करने के लिए की जरूरत नहीं है, यह सब पर्दे के पीछे आप के लिए किया है और वे अपने आप POST और PUT प्रकार अनुरोधों के लिए application/json की तैयारी में हैं है। तो आपको बस इतना करना चाहिए कि

$http.post(url, data); 
$http.put(url, data); 
+2

मैंने इसे हटा दिया, लेकिन फिर मैं एक पुट/पोस्ट के बजाय एक विकल्प कॉल भेज रहा हूं। अगर मैं उन्हें सेट करता हूं, कम से कम मैं सही कॉल भेज रहा हूं। –

+1

@gruberb, आपको इस लेख को पढ़ने की कोशिश करनी चाहिए: https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS –

+1

@ फिलिप एंड्रेचेव धन्यवाद! मैंने अपना जवाब अपडेट कर लिया है। –

संबंधित मुद्दे