2013-09-25 12 views
11

क्रॉस-डोमेन AJAX पोस्ट अनुरोध मोबाइल फोन पर ब्राउज़रों सहित वेब ब्राउज़र पर पूरी तरह से ठीक काम करता है, लेकिन देशी अनुप्रयोगों के लिए काम नहीं करता है बनाया PhonegapPhonegap क्रॉस-डोमेन AJAX पोस्ट अनुरोध Android पर काम नहीं

का उपयोग कर रहा बनाया है एक लॉगिन फॉर्म जिसे उपयोगकर्ताओं को अपने लॉगिन प्रमाण-पत्र दर्ज करना होता है, फिर उन्हें सर्वर द्वारा सत्यापित किया जाता है जो उसकेोकू पर होस्ट किया जाता है और यदि वैध प्रमाण-पत्र दर्ज किए जाते हैं तो json {"success":true} लौटाता है।

मेरे अजाक्स स्क्रिप्ट:

$.ajax({ 
    type: "POST", 
    url: "http://domain.com/public/auth/app-login", 
    contentType: "application/x-www-form-urlencoded; charset=utf-8", 
    dataType: "json", 
    data: {identity: <username from form>, password: <password from form>}, 
    crossDomain: true, 
    cache: false, 
    success: function(data) { 
     obj = JSON.parse(data); 
     if (obj && obj.success === true) { 
      window.location.href = 'home.html'; 
     } 
    }, 
    error: function(e) { 
     alert('Error: ' + e.message); 
    } 
}); 

कदम इस समस्या को हल करने के लिए लिया:

<access origin="http://domain.com/public/auth/app-login" />

<access origin="*" />

  • jQuery बोलने क्रॉस-डोमेन

$.support.cors = true; या jQuery.support.cors = true;

  • कैशिंग निष्क्रिय अनुमति देने के लिए cache: false

किसी भी मदद की सराहना की है।

+0

हाय, क्या आप इस समस्या को हल कर सकते हैं? क्या आप समाधान साझा कर सकते हैं? –

+1

हां मैंने इसे हल किया था। आपके सर्वर के साथ संवाद करने के लिए 1. डोमेन श्वेतसूचीकरण (http://docs.phonegap.com/en/2.1.0/guide_whitelist_index.md.html#Domain%20Whitelist%20Guide), 2. उपयोग XmlHttpReqquest - http: निम्नलिखित का प्रयास करें : //stackoverflow.com/questions/9464563/how-do-i-call-remote-api-using-phonegap-for-android – h4kl0rd

उत्तर

7

ठीक है। यदि index.html स्थानीय में है तो आप किसी भी मेजबान AJAX को कॉल कर सकते हैं, क्लाइंट या सर्वर में CORS को सक्षम करने की आवश्यकता नहीं है। आप को दूर:

$.support.cors = true; OR jQuery.support.cors = true; 

और:

<access origin="http://domain.com/public/auth/app-login" /> 

यह निरर्थक, केवल का उपयोग करें:

<access origin="*" /> 

आप की जाँच करें और AndroidManifest.xml में जोड़ने की जरूरत है:

<uses-permission android:name="android.permission.INTERNET" /> 

जोड़ें यदि आपके ऐप की आवश्यकता है तो अधिक अनुमति। अंत में, $ अंदर ajax फोन (document) .ready():

$.ajax({ 
    type: "POST", 
    url: "http://domain.com/public/auth/app-login", 
    dataType: "json", 
    data: {identity: <username from form>, password: <password from form>}, 
    success: function(data) { 
    obj = JSON.parse(data); 
    if (obj && obj.success === true) { 
     window.location.href = 'home.html'; 
    } 
    }, 
    error: function(e) { 
    alert('Error: ' + e.message); 
    } 
}); 
+1

कृपया पढ़ें मैं क्या लिखा है। सर्वर में कोई समस्या नहीं है क्योंकि यह मोबाइल ब्राउज़र में ब्राउज़रों पर भी वेब ब्राउज़र पर पूरी तरह से ठीक काम करता है। – h4kl0rd

+0

ठीक है। मैं समझता हूँ कि। क्या आपने स्थानीय ऐप या रिमोट सर्वर से index.html (आपका ऐप) लोड किया था। अगर आप रिमोट सर्वर से लोड करते हैं तो इसके ऊपर एक ही समस्या होगी। आप सर्वर से विस्तार त्रुटि पोस्ट कर सकते हैं: पहुंच-नियंत्रण-अनुमति दें-उत्पत्ति देने की अनुमति नहीं ... –

+0

जब मैं एंड्रॉयड पर मूल रूप से आवेदन चलाने के लिए, सही लॉगइन क्रेडेंशियल्स दर्ज करने के बाद, यह एक 'त्रुटि फेंकता है: undefined' मेरी ajax त्रुटि से आदेश। मैं ऐसा क्यों नहीं करता हूं। – h4kl0rd

1

उपयोग

JSON.stringify(data: {identity: <username from form>, password: <password from form>}) 

बजाय data: {identity: <username from form>, password: <password from form>}

जब मैं इस तरह मेरे कोड बदल मैं सफलता संदेश मिला।

3

यदि आप इस समस्या को हल करना चाहते हैं तो आप यह सुनिश्चित करना चाहेंगे कि प्लगइन को ठीक प्रक्रिया में शामिल किया जा रहा है।

RESOURCE: \app\config.xml 
<widget> 
    .... [lots of stuff] .... 
    <gap:plugin name="com.indigoway.cordova.whitelist.whitelistplugin" /> 
    <access origin="http://*" /> 
    .... 
</widget> 

आप एक संस्करण निर्दिष्ट करना भी चाहेंगे जैसा कि अनुशंसित है, और मैं ऊपर निर्दिष्ट नहीं करता हूं। प्लगइन को शामिल करने का परीक्षण करने का एक अच्छा तरीका है https://build.phonegap.com/apps पर प्रदान किए गए मुफ्त क्लाउड खाते का उपयोग करना। यदि आप अपनी परियोजना का निर्माण करते हैं तो आप प्लगइन्स टैब की जांच कर सकते हैं और सुनिश्चित कर सकते हैं कि श्वेतसूची प्लगइन शामिल है।

मैंने पढ़ा है कि आप केवल अपने HTML पृष्ठ के शीर्ष तत्व में इस की जरूरत है चाहिए, लेकिन मैं इस पोस्ट कि मैं अभी भी प्लगइन शामिल करने के लिए की जरूरत की तारीख के रूप में पाया गया।

<meta http-equiv="Content-Security-Policy" content="default-src *; style-src 'self' 'unsafe-inline'; script-src 'self' 'unsafe-inline' 'unsafe-eval'"> 

प्लगइन लोड नहीं है, तो आप जब त्रुटि स्ट्रिंग के लिए jQuery के लिए $.ajax विधि का उपयोग कर एक "नहीं मिला" त्रुटि आ सकती है।

इंटरनेट पर कुछ जानकारी आपको बताएगी कि श्वेतसूची जानकारी /www/res/ फ़ोल्डर में रखी गई है, लेकिन यह पुरानी जानकारी प्रतीत होती है। आप यह भी पा सकते हैं कि <plugin... कुछ उदाहरणों में उपयोग किया जाता है, लेकिन ऐसा लगता है कि यह एक अप्रचलित तरीका हो सकता है?

इसके अलावा, आप की आवश्यकता हो सकती:

RESOURCE: \app\config.xml 
<widget> 
    ... 
    <feature name="http://api.phonegap.com/1.0/network"/> 
    ... 
</widget> 
+0

जोड़ने '<मेटा http-समतुल्य =" सामग्री सुरक्षा-नीति "सामग्री =" डिफ़ॉल्ट-src *; शैली-src 'स्वयं' 'असुरक्षित-इनलाइन'; पटकथा src 'स्व' 'असुरक्षित-इनलाइन' 'unsafe- eval ''> 'समस्या को हल करने में मेरी मदद की। –

-1

कुछ समय आपके डोमेन में ऐसे मुद्दा है। मेरे मामले में मैंने इसे .htaccess फ़ाइल में निम्नलिखित कोड डालकर हल किया

<IfModule mod_headers.c> 
    Header set Access-Control-Allow-Origin "*" 
</IfModule> 
संबंधित मुद्दे