ajax get request von http <- https

strukturart

Erfahrenes Mitglied
Hallo,

ich versuche ein Podcast-Download-App für das FirefoxOS zu schreiben. Kann aber die externen XML Dateien nicht auslesen
wenn die Abfrage-Adresse ein https ist. Gibt es dafür ein Lösung ?

Der Error Code lautet: 0

Javascript:
var episode_limit = 0;
var url_counter = 0;
var xhr;

function podcast_downloader(param_value)
{


    episode_limit = 0;


    xhr = $.ajax({
        
    xhrFields: {cors: false},
    url: param_value,
    type: 'GET',
    datatype: 'xml',

    }).done(function (data, textStatus, jqXHR) {

        alert(jqXHR.status)
        alert(jqXHR.statusText)
    
            $(data).find('item').each(function(){
            
                var file_name = ($(this).find('title').text());
                var podcast_url =  $(this).find('enclosure').attr('url');
                //only first child
                episode_limit++;
                if(episode_limit==1)
                {
                    //push file url in array to download later
                    podcast_file_list.push(podcast_url)
                    url_counter++;

                    if (url_counter < podcast_url_list.length-1)
                    
                    {
                        alert(url_counter)
                        alert("in loop "+podcast_url)
                        podcast_downloader(podcast_url_list[url_counter])

                        
                    }
                }

                else
                {
                    return false;
                }

            });
    
        }).fail(function (jqXHR, textStatus, errorThrown)
            {
                alert(jqXHR.status)
                alert(jqXHR.statusText)


                  var msg = '';
                if (jqXHR.status === 0) {
                    msg = 'Not connect.\n Verify Network.';
                } else if (jqXHR.status == 404) {
                    msg = 'Requested page not found. [404]';
                } else if (jqXHR.status == 500) {
                    msg = 'Internal Server Error [500].';
                } else if (exception === 'parsererror') {
                    msg = 'Requested JSON parse failed.';
                } else if (exception === 'timeout') {
                    msg = 'Time out error.';
                } else if (exception === 'abort') {
                    msg = 'Ajax request aborted.';
                } else {
                    msg = 'Uncaught Error.\n' + jqXHR.responseText;
                }

                alert(msg)
            }
            );
}


Danke für's lesen.


Gruss John
 
Lösung
Ich hätte als App für Firefox OS eigentlich erwartet, dass SOP ausgeschaltet ist. So wie das bei Chrome Extensions etwa der Fall ist.

Muss ich für dieses App evtl. folgendes verwenden: TCP Socket API weil ich im vorab nicht weiss welche URLs abgefragt werden und ich es so "dynamisch" anpassen könnte ?
Nein, so low-level würde ich nicht gehen, außer es ist unbedingt erforderlich. Aber dass du beliebige TCP Verbindungen aufmachen kannst, deutet darauf hin, dass SOP damit umgangen werden kann. Das wäre dann auch im Einklang mit dem ersten Satz meines Beitrags.


Ah, siehe hier, wie du Cross-Origin Requests in Firefox OS absetzen kannst: https://stackoverflow.com/q/25397511/603003
Hallo,

ich versuche ein Podcast-Download-App für das FirefoxOS zu schreiben. Kann aber die externen XML Dateien nicht auslesen
wenn die Abfrage-Adresse ein https ist. Gibt es dafür ein Lösung ?

Der Error Code lautet: 0

Javascript:
var episode_limit = 0;
var url_counter = 0;
var xhr;

function podcast_downloader(param_value)
{


    episode_limit = 0;


    xhr = $.ajax({
       
    xhrFields: {cors: false},
    url: param_value,
    type: 'GET',
    datatype: 'xml',

    }).done(function (data, textStatus, jqXHR) {

        alert(jqXHR.status)
        alert(jqXHR.statusText)
   
            $(data).find('item').each(function(){
           
                var file_name = ($(this).find('title').text());
                var podcast_url =  $(this).find('enclosure').attr('url');
                //only first child
                episode_limit++;
                if(episode_limit==1)
                {
                    //push file url in array to download later
                    podcast_file_list.push(podcast_url)
                    url_counter++;

                    if (url_counter < podcast_url_list.length-1)
                   
                    {
                        alert(url_counter)
                        alert("in loop "+podcast_url)
                        podcast_downloader(podcast_url_list[url_counter])

                       
                    }
                }

                else
                {
                    return false;
                }

            });
   
        }).fail(function (jqXHR, textStatus, errorThrown)
            {
                alert(jqXHR.status)
                alert(jqXHR.statusText)


                  var msg = '';
                if (jqXHR.status === 0) {
                    msg = 'Not connect.\n Verify Network.';
                } else if (jqXHR.status == 404) {
                    msg = 'Requested page not found. [404]';
                } else if (jqXHR.status == 500) {
                    msg = 'Internal Server Error [500].';
                } else if (exception === 'parsererror') {
                    msg = 'Requested JSON parse failed.';
                } else if (exception === 'timeout') {
                    msg = 'Time out error.';
                } else if (exception === 'abort') {
                    msg = 'Ajax request aborted.';
                } else {
                    msg = 'Uncaught Error.\n' + jqXHR.responseText;
                }

                alert(msg)
            }
            );
}


Danke für's lesen.


Gruss John

Hat niemand einen Tip oder ist es zu schlecht erklärt ?
 
Die Fehlerkonsole sagt:

Javascript:
Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at https://feeds.br.de/b5-fuer-bergsteiger/feed.xml. This can be fixed by moving the resource to the same domain or enabling CORS.
 
Das sagt ja schon mal was aus. Da macht wohl der Browser dicht. Wenn man zb zur einer anderen Webseite ein Request schickt ,ohne das die Webseite das erlaubt , macht die CORS dicht. Das kann meines wissen auch passieren wenn eine seite HTTP ist und die andere HTTPS . Kannst höchstens versuchen die adressen beide auf https zu kriegen oder andere möglichkeiten versuchen.
Weiß ja nicht was man so alles für möglichkeiten man noch hat bei so neee web-app , doch mit reinen Javascript wird das ohne Api oder sowas schwer werden.

Das ist jetzt meine meinung dazu.Könnte auch falsch sein:)
 
Man sollte doch mit den Begriffen etwas sorgfältiger umgehen:
SOP: Same Origin Policy - die Regel, dass der Browser Zugriffe auf Inhalte auf einer anderen Domain unterbindet. Dies trifft in diesem Fall zu. Siehe auch die Fehlermeldung: "The Same Origin Policy disallows reading the remote resource at ... "
CORS: Cross Origin Resourec Sharing - Verfahren, das den Zugriff auf Inhalte auf einer anderen Domain trotz SOP ermöglicht. Siehe ebenfalls die Fehlermeldung, die empfiehlt, dieses anzuwenden.
 
Danke für eure Antworten.

Ich habe schone eine andere App für das OS geschrieben: strukturart/osm-map
wo auch Daten von extern bezogen werden. Um dies zu erlauben habe ich folgendes in den Header der Index.html geschrieben:

HTML:
    <meta http-equiv="Content-Security-Policy" content="default-src 'self'  https://nominatim.openstreetmap.org https://api.tiles.mapbox.com/* https://api.openweathermap.org/ https://tile.openweathermap.org/ http://maps.openweathermap.org/https://openweathermap.org/ https://tile.openstreetmap.org/">

um den Zugriff zu erlauben.

Muss ich für dieses App evtl. folgendes verwenden: TCP Socket API weil ich im vorab nicht weiss welche URLs abgefragt werden und ich es so "dynamisch" anpassen könnte ?
 
Mit den xhrFields bin ich jetzt nicht so vertraut, aber als erstes würde ich versuchen, dort cors auf true zu setzen:
xhrFields: {cors: true},
 
Ich hätte als App für Firefox OS eigentlich erwartet, dass SOP ausgeschaltet ist. So wie das bei Chrome Extensions etwa der Fall ist.

Muss ich für dieses App evtl. folgendes verwenden: TCP Socket API weil ich im vorab nicht weiss welche URLs abgefragt werden und ich es so "dynamisch" anpassen könnte ?
Nein, so low-level würde ich nicht gehen, außer es ist unbedingt erforderlich. Aber dass du beliebige TCP Verbindungen aufmachen kannst, deutet darauf hin, dass SOP damit umgangen werden kann. Das wäre dann auch im Einklang mit dem ersten Satz meines Beitrags.


Ah, siehe hier, wie du Cross-Origin Requests in Firefox OS absetzen kannst: https://stackoverflow.com/q/25397511/603003
 
Lösung
Zurück