मैं PHP के साथ HTTP शीर्षलेखों को परिभाषित करने वाला एक कर्ल POST अनुरोध करने का प्रयास कर रहा हूं और मुझे CORS समस्या हो रही है।

तो मेरे पास एक .php फ़ाइल है जिसे AJAX का उपयोग करके वेबएप से बुलाया जाता है। इस .php फ़ाइल में मैं cURL का उपयोग करके किसी बाहरी API को HTTP POST अनुरोध कर रहा हूँ। यह सब तब तक ठीक रहा जब तक मुझे प्रमाणीकरण उद्देश्यों के लिए अलग-अलग HTTP शीर्षलेख सेट नहीं करना पड़ा। जब मैं कर्ल अनुरोध में HTTP शीर्षलेखों को परिभाषित करने का प्रयास करता हूं:

//Set Headers
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
  'Authorization': 'someAuthorization',
  'x-api-key': 'somekey',
  'Content-Type': 'application/x-www-form-urlencoded'
));

मुझे क्लाइंट (वेबएप) और मेरे अपने एंडपॉइंट के बीच एक सीओआरएस समस्या मिलनी शुरू हो जाती है जो पहले नहीं हो रही थी। मैंने कर्ल अनुरोध निष्पादित करने के बाद हेडर को फिर से परिभाषित करने का प्रयास किया लेकिन यह काम नहीं किया:

//execute post
$result = curl_exec($ch);
if($result === false){
  echo 'Curl error: ' . curl_error($ch);
}else{
//$httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
//CORS
if (isset($_SERVER['HTTP_ORIGIN'])) {
    //header("Access-Control-Allow-Origin: {$_SERVER['HTTP_ORIGIN']}");
    header("Access-Control-Allow-Origin: http://localhost:4200");
    header('Access-Control-Allow-Credentials: true');    
    header("Access-Control-Allow-Methods: GET, POST, OPTIONS"); 
}   
if ($_SERVER['REQUEST_METHOD'] == 'OPTIONS') {
    if (isset($_SERVER['HTTP_ACCESS_CONTROL_REQUEST_METHOD']))
        header("Access-Control-Allow-Methods: GET, POST, OPTIONS");         
    if (isset($_SERVER['HTTP_ACCESS_CONTROL_REQUEST_HEADERS']))
        header("Access-Control-Allow-Headers: 
{$_SERVER['HTTP_ACCESS_CONTROL_REQUEST_HEADERS']}");
    exit(0);
}
echo $result;
};

कोई अंदाजा ऐसा क्यों हो रहा है? मेरे लिए ऐसा लगता है कि कर्ल अनुरोध करके मैं हेडर को कर्ल के साथ ओवरराइड कर रहा हूं, इसलिए सीओआरएस हेडर कॉन्फ़िगरेशन कभी लागू नहीं होता है।

यहाँ .php फ़ाइल में सभी कोड हैं

<?php

$url = 'someurl';
$fields = ['pax' => '2', 'ownerid' => '1', 'channel' => '3'];

//url-ify the data for the POST
$fields_string = http_build_query($fields);

//open connection
$ch = curl_init();

//set the url, number of POST vars, POST data
curl_setopt($ch,CURLOPT_URL, $url);
curl_setopt($ch,CURLOPT_POST, count($fields));
curl_setopt($ch,CURLOPT_POSTFIELDS, $fields_string);

//So that curl_exec returns the contents of the cURL; rather than echoing it
curl_setopt($ch,CURLOPT_RETURNTRANSFER, true); 

//Set Headers
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
'Authorization': 'someAuth',
'x-api-key': 'someKey',
'Content-Type': 'application/x-www-form-urlencoded',
));

//DISABLE SSL
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);

//execute post
$result = curl_exec($ch);
if($result === false){
  echo 'Curl error: ' . curl_error($ch);
}else{
  //$httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
  //CORS
  if (isset($_SERVER['HTTP_ORIGIN'])) {
    //header("Access-Control-Allow-Origin: {$_SERVER['HTTP_ORIGIN']}");
    header("Access-Control-Allow-Origin: http://localhost:4200");
    header('Access-Control-Allow-Credentials: true');    
    header("Access-Control-Allow-Methods: GET, POST, OPTIONS"); 
  }   
  if ($_SERVER['REQUEST_METHOD'] == 'OPTIONS') {
    if (isset($_SERVER['HTTP_ACCESS_CONTROL_REQUEST_METHOD']))
        header("Access-Control-Allow-Methods: GET, POST, OPTIONS");         
    if (isset($_SERVER['HTTP_ACCESS_CONTROL_REQUEST_HEADERS']))
        header("Access-Control-Allow-Headers:{$_SERVER['HTTP_ACCESS_CONTROL_REQUEST_HEADERS']}");
    exit(0);
  }
  echo $result;
};

curl_close($ch);
?>
1
alexcancode 24 पद 2018, 16:58

1 उत्तर

सबसे बढ़िया उत्तर

कर्ल अनुरोध में कुछ शीर्षलेख सेट करने से आपकी .php स्क्रिप्ट में शीर्षलेख नहीं बदलता है।

अपडेट 1:

आपकी PHP स्क्रिप्ट में एक पार्स त्रुटि है (जैसा कि आपने स्वयं पाया):

curl_setopt($ch, CURLOPT_HTTPHEADER, array(
  'Authorization': 'someAuthorization',
  'x-api-key': 'somekey',
  'Content-Type': 'application/x-www-form-urlencoded'
));

होना चाहिए:

curl_setopt($ch, CURLOPT_HTTPHEADER, array(
  'Authorization: someAuthorization',
  'x-api-key: somekey',
  'Content-Type: application/x-www-form-urlencoded'
));

इस स्क्रिप्ट के लिए अजाक्स कॉल के परिणामस्वरूप त्रुटि 500 ​​​​प्रतिक्रिया होती है जिसमें डिफ़ॉल्ट हेडर होते हैं और नहीं वे हेडर होते हैं जिन्हें आप अपनी .php स्क्रिप्ट में सेट करने का प्रयास करते हैं।

समस्या "पहले" देखने के लिए अपने स्थानीय परिवेश में त्रुटि रिपोर्टिंग सक्षम करें।

उदाहरण के लिए php.ini में:

error_reporting=E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED 
display_errors=On

@see मैं PHP त्रुटियों को प्रदर्शित करने के लिए कैसे प्राप्त करूं?

1
Steffen Mächtel 27 पद 2018, 15:20