2011-11-05 26 views
7

Tôi đang cố tạo một trình đọc RSS đơn giản với Phonegap và jQuery. Tôi đang làm theo hướng dẫn này: http://visualrinse.com/2008/09/24/how-to-build-a-simple-rss-reader-with-jquery/.Các sự cố khi thực hiện yêu cầu ajax bằng ứng dụng Phonegap

Tôi đã cố gắng làm việc này tốt khi tôi thử mã trong trình duyệt của mình. Tệp php tìm nạp nguồn cấp dữ liệu và xuất kết quả giống như tôi mong đợi. Nhưng khi tôi chạy cùng một tệp từ bên trong ứng dụng Phonegap đã biên dịch, yêu cầu ajax chỉ trả lại nội dung của tệp php (mã php, không phải kết quả được thực thi).

Tôi đã bỏ ra hàng giờ Google và thử nhiều hướng dẫn và chỉnh sửa. Tôi không tìm thấy giải pháp nào trong diễn đàn chính thức của Phonegap. Tôi đang làm gì sai? Vấn đề có vẻ là PHP không đáp ứng yêu cầu. Tôi đã cố gắng để di chuyển các tập tin php vào một tên miền khác nhau nhưng kết quả là như nhau, nó hoạt động trong trình duyệt của tôi nhưng không phải trong các ứng dụng biên dịch.

Dưới đây là đoạn code jQuery mà khởi ajax-code:

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(); 
    } 

    }); 

}; 

Đây là rss-proxy.php rằng tải XML từ url và đầu ra nó:

<?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

Tôi khuyên bạn nên xóa địa chỉ IP đó khỏi mã. – sciritai

+0

Điều gì sẽ xảy ra khi bạn mở tệp '.php' từ trình duyệt trên trình mô phỏng hoặc thiết bị? Liệu PHP có được thực hiện? – Marko

+0

Cảm ơn các ý kiến! Tôi đã cố gắng truy cập tệp '.php' từ trình duyệt trong trình mô phỏng và nó hoạt động. Nhưng nó chỉ hoạt động nếu tôi thay đổi URL là tương đối, không tuyệt đối: 'url: 'rss-proxy.php? Url = http: //www.nytimes.com/services/xml/rss/nyt/GlobalHome.xml' '. Nếu bây giờ tôi sử dụng trình duyệt Safari trên điện thoại di động để truy cập tệp index.html trong thư mục www của ứng dụng Phonegap mà tôi đang lưu trữ trên máy chủ MAMP cục bộ trong thư mục 'htdocs' của nó, nó hoạt động! Nhưng không phải từ ứng dụng Phonegap được biên dịch. Và tất nhiên, tệp '.php' nằm trong thư mục www cùng với các tệp tập lệnh khác. – user1029978

Trả lời

15

Cuối cùng tôi đã giải quyết được vấn đề này! Nó chỉ ra rằng bạn cần phải đưa danh sách trắng vào máy chủ mà bạn muốn yêu cầu từ ứng dụng PhoneGap của bạn trong Xcode nếu bạn muốn yêu cầu đến một miền nhất định (có thể là localhost của bạn hoặc bất kỳ thứ gì). Lý do mà tôi không tìm thấy điều này trước đó là tôi đã không kiểm tra lỗi trong phản hồi ajax. Khi tôi đã làm điều đó, tôi nhận được mã trạng thái http 401 (Không được phép) và thông báo lỗi "Whitelist rejected".

Để khắc phục điều này, tôi đã mở tệp PhoneGap.plist trong dự án của mình và theo khóa ExternalHosts tôi đã thêm mục mới có giá trị: *.localhost. Tôi cũng đã thay đổi url ajax để:

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

tôi biên soạn và chạy các ứng dụng trên iOS Simulator và máy chủ localhost của tôi đáp lại bằng một phản ứng ajax hoàn thành công!

Đối với mọi máy chủ lưu trữ bên ngoài mà bạn muốn ứng dụng của mình kết nối với bạn phải thêm ứng dụng đó vào danh sách ExternalHosts. Ví dụ: nếu bạn muốn truy cập API trên http://google.com/maps/api.php, bạn phải thêm *.google.com vào danh sách của mình.

Loại khó chịu khi bạn cố gắng tìm ra lý do tại sao máy chủ không phản hồi, nhưng tôi đoán đó là lý do bảo mật.Hy vọng điều này sẽ giúp người khác ra khỏi đó đang đấu tranh với các yêu cầu ajax đơn giản từ ứng dụng PhoneGap của họ!

+0

Vui lòng chấp nhận câu trả lời của bạn thay vì viết "đã giải quyết" trong câu hỏi; nếu bạn phải đợi một khoảng thời gian nhất định trước khi bạn có thể làm điều đó, thì hãy chờ một khoảng thời gian nhất định: có một lý do khiến hệ thống của bạn trở thành hiện thực. –

+0

Ngoài ra, tôi có thể thêm, nếu bạn không muốn bận tâm về bất kỳ hạn chế nào liên quan đến 'ExternalHosts' trong ứng dụng PhoneGap của bạn, chỉ cần thêm' *. * 'Và bạn sẽ được phép gửi yêu cầu và nhận phản hồi đến và đi bất kỳ máy chủ nào. – user1029978

+0

Xin lỗi Tomalak, đây là lần đầu tiên tôi đăng câu hỏi ở đây. Tôi chưa quen với các quy tắc và thông lệ. Tôi vừa thấy rằng những người khác có tiền tố "SOLVED:" trong câu hỏi của họ. – user1029978

0

Nó có vẻ như bạn đang chạy máy chủ của bạn cục bộ (dựa trên địa chỉ IP 192.168.xx) có nghĩa là chỉ những thiết bị được kết nối với mạng của bạn mới có thể truy cập vào nó. Bạn có thể kết nối điện thoại với cùng một mạng wifi như máy tính của bạn như là một sửa chữa tạm thời. Nhưng bạn sẽ cần phải lưu trữ điều này trên một máy chủ thực sự cho nó để có thể truy cập qua internet.

Bạn cũng có thể chuyển tiếp cổng 80 trên bộ định tuyến đến địa chỉ IP này và sau đó sử dụng địa chỉ IP thực của bạn (xem whatsmyip.org) trong url yêu cầu của bạn. Nhưng đó không phải là một giải pháp thực sự ổn định.

+0

Cảm ơn Jason đã trả lời của bạn! Tuy nhiên, tôi đã thử bằng cách tải tập lệnh php lên một máy chủ LAMP bên ngoài khác do một khách sạn web lưu trữ và thay đổi url trong yêu cầu ajax của tôi, nhưng điều này cũng không hoạt động. Trong trình duyệt của tôi giải pháp như vậy vẫn hoạt động mặc dù. Giải pháp mà tôi tiếp tục tìm thấy khi tôi Google này là không khó hơn việc nhập bất kỳ URL nào vào bất kỳ tập lệnh phía máy chủ nào và nó sẽ hoạt động: – user1029978

+0

Ví dụ: 'ajax.open (" GET "," http://search.twitter.com/search.json?q=bacon ", true);' Nhưng tôi không thể làm việc này. Nhân tiện, tôi đang sử dụng trình mô phỏng iOS, không chạy ứng dụng trên điện thoại thực. Tuy nhiên, đây không phải là vấn đề, tôi có thể truy cập tất cả các máy chủ từ trình duyệt Safari trên thiết bị di động trong trình mô phỏng. – user1029978

+0

Ví dụ về thịt xông khói ajax từ http://wiki.phonegap.com/w/page/42450600/PhoneGap%20Ajax%20Sample hoạt động tốt trên các thiết bị Android của tôi –

Các vấn đề liên quan