2016-02-27 11 views
9

मैं सरल आरईएसटी कॉल के साथ कॉर्डोवा एपीपी का निर्माण कर रहा हूं।कॉर्डोवा AJAX पोस्ट अनुमति

मुद्दा है जब मैं पोस्ट के साथ एक AJAX बनाने, क्रोम मुझे भेजता है: "XMLHttpRequest लोड नहीं कर सकता http://192.168.1.111/project/app preflight के लिए प्रतिक्रिया अमान्य HTTP स्थिति कोड 405 है।" कंसोल पर

लेकिन, अगर मैं जीईटी (मूल रूप से डेटाबेस से मूल्य लौटाता हूं) के साथ एक AJAX कॉल करता हूं तो चीजें एक आकर्षण की तरह काम करती हैं।

मेरे AJAX कॉल है: बाकी

require 'Slim/Slim.php'; 
$app = new Slim(); 
$app->post('/app', 'addApp'); 
$app->run(); 

function addApp() { 
    error_log('addApp\n', 3, '/var/tmp/php.log'); 
    $request = Slim::getInstance()->request(); 
    $callback = json_decode($request->getBody()); 
    $sql = "INSERT INTO app (name) VALUES (:name)"; 
    try { 
     $db = getConnection(); 
     $stmt = $db->prepare($sql); 
     $stmt->bindParam("name", $callback->name); 
     $stmt->execute(); 
     $callback->id = $db->lastInsertId(); 
     $db = null; 
     echo json_encode($callback); 
    } catch(PDOException $e) { 
     error_log($e->getMessage(), 3, '/var/tmp/php.log'); 
     echo '{"error":{"text":'. $e->getMessage() .'}}'; 
    } 
} 

function getConnection() { 
    $dbhost="localhost"; 
    $dbuser="myuser"; 
    $dbpass="mypass"; 
    $dbname="mydb"; 
    $dbh = new PDO("mysql:host=$dbhost;dbname=$dbname", $dbuser, $dbpass); 
    $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
    return $dbh; 
} 

में

$.ajax({ 
    url: "http://192.168.1.111/project/app", 
    type: "POST", 
    dataType: "json", 
    contentType: 'application/json', 
    data: { 
    "name": "Cordova" 
    }, 
    success: function() { 
    navigator.notification.alert("Success!"); 
    }, 
    error: function(jqXHR, textStatus, errorThrown) { 
    console.log(textStatus + jqXHR.responseText); 
    } 
}); 

पोस्ट हैंडलर मैं क्या कोशिश की है:

1 #: config में पहुँच मूल .xml

<access origin="*" /> 

2 #: मेटा टैग

<meta http-equiv="Content-Security-Policy" content="default-src 'self' data: gap: https://ssl.gstatic.com 'unsafe-eval'; style-src 'self' 'unsafe-inline'; media-src *; connect-src 'self' http://192.168.1.111"> 

3 # कनेक्ट-src मेरे आईपी जोड़ें: मेरी बाकी ऐप्लिकेशन में पहुंच-नियंत्रण-अनुमति दें-उत्पत्ति जोड़े .htaccess

Header add Access-Control-Allow-Origin "*" 
Header add Access-Control-Allow-Methods: "GET,POST,OPTIONS,DELETE,PUT" 

4 #: जावास्क्रिप्ट में

समर्थन CORS जोड़े
$.support.cors = true; 
$.mobile.allowCrossDomainPages = true; 

5 #: यदि सर्वर पोस्ट में त्रुटि नहीं है की जाँच करने के लिए, मैं कर्ल का इस्तेमाल किया और सामान्य काम करता है (सफलता)

curl -i -X POST -H 'Content-Type: application/json' -d '{"name": "Cordova"}' http://192.168.1.111/project/app 

OBS: मैं आराम करने के लिए स्लिम ढांचे का उपयोग कर रहा (http://coenraets.org/blog/2011/12/restful-services-with-jquery-php-and-the-slim-framework/)

================

अद्यतन # 1:

मैंने अपना डेटाबेस और एप्लिकेशन ऑनलाइन होस्ट में अपलोड कर लिया है और परिणाम अभी भी वही हैं।

================

अद्यतन # 2:

एक और परीक्षण कर रहा, मैंने देखा कि contentType को हटाने: "application/json " डीबगर एक और त्रुटि दिखाता है।

SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'name' cannot be empty 

================

यह है कि मैं इस और कुछ भी नहीं एक समाधान के रूप में प्रकट होता है हल करने के लिए कोशिश कर रहा हूँ दो दिन हो गया है।मैं वास्तव में दुखी हूँ।

+0

आप सर्वर पोस्ट का समर्थन नहीं करते हैं, तो आप आपको एक्शन कोड दिखा सकते हैं? – Naumov

+0

@Naumov क्षमा करें, मैं उस बिंदु को भूल गया, मैंने अपना प्रश्न अपडेट कर लिया है। सर्वर पोस्ट काम कर रहा है, मैंने इसका परीक्षण करने के लिए कर्ल का उपयोग किया है। – reidark

+0

मुझे लगता है कि शायद यह आपकी मदद करेगा http://stackoverflow.com/questions/298745/how-do-i-send-a-cross-domain-post-request-via-javascript और 'url: "http: //192.168 .1.111/प्रोजेक्ट/ऐप "'शमा के साथ यूआरएल आज़माएं' http: //' – Naumov

उत्तर

-1

स्टैक ओवरव्लो में लगभग 60 प्रश्न पढ़ने और सीओआरएस, PHP और एक्सेस कंट्रोल के बारे में चीजें पढ़ने के बाद मैं एक "सरल समाधान" तक पहुंच गया।

लेकिन, समाधान पोस्ट करने से पहले, मैं कहना चाहता हूं कि समस्या का प्रकार बहुत अधिक "सामान्य" है और त्रुटि कहीं भी हो सकती है।

ठीक है, पहला, समाधान क्रोम पर काम नहीं करता है। क्रोम हमेशा 405 स्टेटस कोड लौटाएगा, लेकिन, असली डिवाइस (या सिमुलेटर) में कॉर्डोवा ऐप चलाकर समाधान एक आकर्षण की तरह काम करता है। हां, यह क्रोम को क्रॉस-डोमेन अनुरोधों को अवरुद्ध करने के बारे में है।

प्रथम चरण:

AJAX में डेटा के साथ रखा जाना चाहिए '{}'। हाँ, मुझे इसके बारे में पता नहीं था। यदि आपको आवश्यकता है, तो अधिक आसान बनाने के लिए JSON.stringify के आसपास खेलें।

$.ajax({ 
    url: "http://myonlineurl.com/project/app", 
    type: "POST", 
    dataType: "json", 
    contentType: 'application/json', 
    data: '{ "name": "Cordova", "another_thing" : "thing" }', 
    success: function() { 
     navigator.notification.alert("Success!"); 
    }, 
    error: function(jqXHR, textStatus, errorThrown) { 
     console.log(textStatus + jqXHR.responseText); 
    } 
}); 

दूसरा कदम:

REST API में आप चीजों के लिए काम करते हैं पहुंच-नियंत्रण-अनुमति दें-हेडर सक्रिय करना होगा।

<?php header('Access-Control-Allow-Headers: X-Requested-With, origin, content-type'); ?> 

वर्तमान समय में मेरा एपीपी इन समाधानों के साथ सामान्य काम कर रहा है। मुझे अन्य समाधानों (क्रोम में भी काम के लिए) के बारे में सुनकर खुशी हुई।

धन्यवाद दोस्तों!

1

मुझे लगता है कि समस्या यह हो सकता है:

preflight त्रुटि तथ्य यह है कि ग्राहक (पोस्ट से पहले) एक विकल्प अनुरोध कर रही है की वजह से है; यह अनुरोध सर्वर द्वारा सही तरीके से संभाल नहीं है। चूंकि OPTIONS अनुरोध सर्वर द्वारा प्रबंधित नहीं किया जाता है, इसलिए अगला पोस्ट संसाधित नहीं होता है। तो सबसे पहले डीबगर (या सर्वर पर स्नीफिंग) के साथ जांच करें, जो अनुरोध है जो आपके द्वारा उल्लिखित त्रुटि का कारण बन रहा है। अगर मेरा अनुमान सही है तो इसे संभालें और आप देखेंगे कि अगला पोस्ट क्लाइंट द्वारा सही ढंग से उत्साहित किया जाएगा।

+1

हां, डीबगर में विकल्प मुख्य त्रुटि से पहले प्रकट होते हैं। लेकिन, मुझे नहीं पता कि यह वास्तव में क्या है। – reidark

+0

बिल्कुल सही! आपको सर्वर पर विकल्प अनुरोधों को संभालना होगा। – pinturic

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