2011-11-05 8 views
7

के साथ AJAX-अनुरोध करने में समस्याएं मैं फ़ोनगैप और jQuery के साथ एक साधारण आरएसएस रीडर बनाने की कोशिश कर रहा हूं। मैं इस ट्यूटोरियल का अनुसरण कर रहा हूं: http://visualrinse.com/2008/09/24/how-to-build-a-simple-rss-reader-with-jquery/फ़ोनगैप एप्लिकेशन

जब मैं अपने ब्राउज़र में कोड आज़माता हूं तो मैं इसे ठीक काम करने में कामयाब रहा हूं। php-file फ़ीड लाता है और इसे आउटपुट करता है जैसा कि मुझे उम्मीद है। लेकिन जब मैं अपने संकलित फोनगैप एप्लिकेशन के भीतर से एक ही फ़ाइल चलाता हूं तो AJAX-request केवल php-file (php-code, निष्पादित परिणाम नहीं) की सामग्री देता है।

मैंने घंटों बिताए हैं और कई ट्यूटोरियल और ट्वीक्स की कोशिश की है। मुझे या तो ऑफलाइन फोनगैप मंचों में कोई समाधान नहीं मिला। मैं क्या गलत कर रहा हूं? ऐसा लगता है कि PHP PHP अनुरोध का जवाब नहीं दे रहा है। मैंने php-file को किसी भिन्न डोमेन पर ले जाने का प्रयास किया है, लेकिन परिणाम वही है, यह मेरे ब्राउज़र में काम करता है लेकिन संकलित ऐप में नहीं।

यहाँ jQuery कोड है कि ajax-कोड की शुरुआत करता है:

function get_rss_feed() { 
    //clear the content in the div for the next feed. 
    $("#feed_content").empty().html('<img class="loader" src="js/images/ajax-loader.gif" alt=""/>'); 

    $.ajax({ 
     url: 'http://192.168.1.7/rssApp/www/rss-proxy.php?url=http://www.nytimes.com/services/xml/rss/nyt/GlobalHome.xml', 
     success: function parseRSS(d) { 

     //find each 'item' in the file and parse it 
     $(d).find('item').each(function() { 

      //name the current found item this for this particular loop run 
      var $item = $(this); 
      // grab the post title 
      var title = $item.find('title').text(); 
      // grab the post's URL 
      var link = $item.find('link').text(); 
      // next, the description 
      var description = $item.find('description').text(); 
      //don't forget the pubdate 
      var pubDate = $item.find('pubDate').text(); 

      // now create a var 'html' to store the markup we're using to output the feed to the browser window 
      var html = "<div class=\"entry\"><h2 class=\"postTitle\">" + title + "<\/h2>"; 
      html += "<em class=\"date\">" + pubDate + "</em>"; 
      html += "<p class=\"description\">" + description + "</p>"; 
      html += "<a href=\"" + link + "\" target=\"_blank\">Read More >><\/a><\/div>"; 

      //put that feed content on the screen! 
      $('#feed_content').append($(html)); 
     }); 
     $('#feed_content img.loader').fadeOut(); 
    } 

    }); 

}; 

यहाँ आरएसएस-proxy.php कि यूआरएल और आउटपुट से XML लोड करता है यह:

<?php 
    // PHP Proxy 
    // Loads a XML from any location. Used with Flash/Flex apps to bypass security restrictions 
    // Author: Paulo Fierro 
    // January 29, 2006 
    // usage: proxy.php?url=http://mysite.com/myxml.xml 

    $session = curl_init($_GET['url']);     // Open the Curl session 
    curl_setopt($session, CURLOPT_HEADER, false);   // Don't return HTTP headers 
    curl_setopt($session, CURLOPT_RETURNTRANSFER, true); // Do return the contents of the call 
    $xml = curl_exec($session);       // Make the call 
    header("Content-Type: text/xml");     // Set the content type appropriately 
    echo $xml;  // Spit out the xml 
    curl_close($session); // And close the session 
?> 
+0

मैं कोड से उस आईपी पते को हटाने की सलाह दूंगा। – sciritai

+0

क्या होता है जब आप सिम्युलेटर या डिवाइस पर ब्राउज़र से '.php' फ़ाइल खोलते हैं? क्या PHP निष्पादित हो जाता है? – Marko

+0

टिप्पणियों के लिए धन्यवाद! मैंने सिम्युलेटर में ब्राउज़र से '.php' फ़ाइल तक पहुंचने का प्रयास किया है और यह काम करता है। लेकिन यह केवल तभी काम करता है जब मैं यूआरएल को सापेक्ष होने के लिए बदलता हूं, पूर्ण नहीं: 'url:' rss-proxy.php? Url = http: //www.nytimes.com/services/xml/rss/nyt/GlobalHome.xml ' '। यदि अब मैं अपने फोनगैप एप्लिकेशन के अपने www-folder में index.html फ़ाइल पर जाने के लिए मोबाइल सफारी ब्राउज़र का उपयोग करता हूं, जिसे मैं अपने 'htdocs' निर्देशिका में अपने स्थानीय एमएएमपी सर्वर पर होस्ट कर रहा हूं, यह काम करता है! लेकिन संकलित फोनगैप ऐप से नहीं। और निश्चित रूप से, '.php' फ़ाइल www- फ़ोल्डर में अन्य स्क्रिप्ट फ़ाइलों के साथ स्थित है। – user1029978

उत्तर

15

मैं अंततः इसे हल करने में कामयाब रहा हूं! यह पता चला है कि यदि आप किसी निश्चित डोमेन से अनुरोध करना चाहते हैं (चाहे वह आपका लोकहोस्ट हो या जो भी हो) तो आपको एक्सकोड में अपने फोनगैप एप्लिकेशन से अनुरोध करने के लिए सर्वर को श्वेतसूची में डालना होगा। कारण यह है कि मुझे पहले यह नहीं मिला था कि मैंने AJAX प्रतिक्रिया में त्रुटियों की जांच नहीं की थी। एक बार मुझे लगता है कि मैं HTTP स्थिति कोड 401 (अनधिकृत) और त्रुटि संदेश "Whitelist rejected" मिल गया था।

इसे ठीक करने के लिए मैंने अपनी परियोजना में PhoneGap.plist फ़ाइल खोला और कुंजी ExternalHosts के तहत मैंने मूल्य के साथ एक नया आइटम जोड़ा: *.localhost। मैं भी करने के लिए ajax यूआरएल बदल दिया है:

url: 'http://localhost/rssApp/www/rss-proxy.php?url=http://www.nytimes.com/services/xml/rss/nyt/GlobalHome.xml'

मैं संकलित और iOS सिम्युलेटर पर आवेदन चलाने के लिए और मेरे स्थानीय होस्ट सर्वर एक पूरी तरह से सफल ajax प्रतिक्रिया के साथ जवाब दिया!

प्रत्येक बाहरी होस्ट के लिए जो आप चाहते हैं कि आप अपने एप्लिकेशन से जुड़ने के लिए इसे ExternalHosts की सूची में जोड़ दें। उदाहरण के लिए आप आप अपनी सूची में *.google.com जोड़ना होगा http://google.com/maps/api.php पर एक API तक पहुँच चाहते हैं।

जब आप यह पता लगाने की कोशिश करते हैं कि सर्वर क्यों प्रतिक्रिया नहीं दे रहा है, तो मुझे परेशान करने की तरह, लेकिन मुझे लगता है कि यह सुरक्षा कारणों से अच्छा है।उम्मीद है कि यह किसी और को वहां मदद करता है जो अपने फोनगैप एप्लिकेशन से सरल AJAX अनुरोधों के साथ संघर्ष कर रहा है!

+0

प्रश्न में "हल" लिखने के बजाय कृपया अपना उत्तर स्वीकार करें; अगर आपको ऐसा करने से पहले कुछ निश्चित समय का इंतजार करना पड़ेगा, तो उस निश्चित समय की प्रतीक्षा करें: सिस्टम आपको एक कारण बताता है। –

+0

इसके अलावा, यदि आप अपने फोनगैप ऐप में 'बाहरीहोस्ट' से संबंधित किसी भी प्रतिबंध के बारे में परेशान नहीं करना चाहते हैं, तो मैं जोड़ सकता हूं, बस '*। *' जोड़ें और आपको अनुरोध भेजने और उससे प्राप्त करने की अनुमति होगी कोई सर्वर – user1029978

+0

क्षमा करें तोमालाक, यह पहली बार है जब मैं यहां एक प्रश्न पोस्ट कर रहा हूं। मैं अभी तक नियमों और परंपरागत प्रथाओं का आदी नहीं हूं। मैंने अभी देखा है कि दूसरों के पास उनके प्रश्न में "हल किया गया" उपसर्ग है। – user1029978

0

यह ऐसा लगता है कि आप स्थानीय रूप से अपना सर्वर चला रहे हैं (1 9 2.168.xx आईपी पते पर आधारित) जिसका अर्थ है कि केवल आपके नेटवर्क से जुड़े डिवाइस ही इसका उपयोग कर सकते हैं। आप फोन को एक ही वाईफाई नेटवर्क से अपने कंप्यूटर के रूप में अस्थायी फ़िक्स के रूप में कनेक्ट कर सकते हैं। लेकिन आपको इंटरनेट पर पहुंचने के लिए इसे वास्तविक सर्वर पर होस्ट करने की आवश्यकता होगी।

आप अपने आईपी पते पर अपने राउटर पर पोर्ट 80 को भी अग्रेषित कर सकते हैं और फिर अपने अनुरोध यूआरएल में अपना वास्तविक आईपी पता (whatsmyip.org देखें) का उपयोग कर सकते हैं। लेकिन यह वास्तव में एक स्थिर समाधान नहीं है।

+0

धन्यवाद आपके जवाब के लिए जेसन! हालांकि, मैंने एक वेब-होटल द्वारा होस्ट किए गए किसी अन्य बाहरी LAMP सर्वर पर php स्क्रिप्ट अपलोड करके कोशिश की है और मेरे AJAX अनुरोध में यूआरएल बदल दिया है, लेकिन यह या तो काम नहीं करेगा। मेरे ब्राउज़र में ऐसे समाधान अभी भी काम करता है। जब मैं Google को खोजता हूं तो यह समाधान है कि यह किसी भी सर्वर साइड स्क्रिप्ट पर किसी भी यूआरएल को टाइप करने से कहीं ज्यादा कठिन नहीं होना चाहिए और इसे काम करना चाहिए: – user1029978

+0

उदाहरण के लिए: 'ajax.open ("GET", " http://search.twitter.com/search.json?q=bacon ", सत्य);' लेकिन मैं इसे काम पर नहीं ला सकता। वैसे, मैं आईओएस सिम्युलेटर का उपयोग कर रहा हूं, ऐप को भौतिक फोन पर नहीं चला रहा हूं। यह कोई मुद्दा नहीं होना चाहिए, हालांकि, मैं सिम्युलेटर में मोबाइल सफारी ब्राउज़र से सभी सर्वरों तक पहुंच सकता हूं। – user1029978

+0

http://wiki.phonegap.com/w/page/42450600/PhoneGap%20Ajax%20Sample से AJAX बेकन उदाहरण मेरे एंड्रॉइड डिवाइस पर ठीक काम करता है –