2017-11-07 1 views
1

Ich mache eine shopify App, die Skript-Tags verwendet und ich muss einen Ajax-Aufruf an unseren Server, um die benötigten Informationen über den Laden zu bekommen. Alles funktionierte großartig, bis mein Kollege mir mitteilte, dass es überhaupt nicht auf seinem iPhone funktionierte. Es funktioniert auch nicht in Safari auf Mac, aber es funktioniert in Chrom.Ajax Cross Herkunft Anfrage funktioniert nicht in Safari aber funktioniert in Chrom und Firefox

Ich bemerkte, dass der Status der Anfrage immer "0" in Safari ist und ich versuchte, eine Anfrage an den Test-Shop zu stellen, ich teste meine Tests statt unseres Servers und bekam einen Status von 200. Ich bin mir ziemlich sicher, dass es ein kreatives Ursprungsproblem ist.

Von dem, was ich fand, sollte es die Header sein, die ich auf der angeforderten Seite ändern muss, aber ich hatte bereits "Access-Control-Allow-Origin: *" und ich versuchte alle Vorschläge, die ich finden konnte und nichts funktioniert.

zur Zeit ist das, was ich auf der gewünschten Seite, ich bin mit Laravel:

header('Access-Control-Allow-Origin: *'); 
header("Access-Control-Allow-Headers: X-API-KEY, Origin, X-Requested-With, Content-Type, Accept, Access-Control-Request-Method"); 
header("Access-Control-Allow-Methods: GET, POST, OPTIONS, PUT, DELETE"); 

$shop = Shop::where("domain", request('shop'))->first(); 

echo json_encode(
[ 
    'logo' => $shop->logo, 
    'text' => $shop->customizable_text, 
    'version' => $shop['plan'] 
]); 

und dies ist die Funktion, die ich zur Zeit bin mit dem Anruf in Javascript zu machen (ich war mit Jquery bei erster, aber ich dachte, dass es das Problem, so habe ich versucht, mit nur Javascript) war:

function ajaxRequest(url, parameters, callback){ 
const req = new XMLHttpRequest(); 

req.onreadystatechange = function(event) { 
    // XMLHttpRequest.DONE === 4 
    if (this.readyState === XMLHttpRequest.DONE) { 
     if (this.status === 200) { 
      callback(this.responseText); 
     } else { 
      console.log("Status: %d (%s)", this.status, this.statusText); 
     } 
    } 
}; 

if(parameters.keys.length){ 
    url = url + "?" 
    for(var i = 0; i < parameters.param.length; i++){ 
     if(i == 0){ 
      url = url + parameters.keys[i] + "=" + parameters.param[i] 
     } 
     else{ 
      url = url + "&" + parameters.keys[i] + "=" + parameters.param[i]; 
     } 
    } 
} 

req.open('GET', url, true); 
req.send(null); 
} 

alles funktioniert, wie es sollte in chrome und Firefox, es ist nur Safari. Irgendeine Idee, was ich tun sollte, um das zu beheben?

+1

Sie möchten wahrscheinlich https://stackoverflow.com/q/47166384/441757 verwenden, um Ihre Frage zu bearbeiten/zu aktualisieren und die genauen Fehlermeldungen (falls vorhanden) hinzuzufügen, die Sie in der Safari-Devtools-Konsole sehen. Außerdem würde es hilfreich sein, wenn Sie in Safari Devtools zur Registerkarte Netzwerk gehen und die Details aller relevanten Anforderungen und Antworten dort, einschließlich der HTTP-Statuscodes und HTTP-Methoden und aller Überschriften, erneut laden und überprüfen und diese zur Frage auch hinzufügen – sideshowbarker

+0

@sideshowbarker Ich habe keinen Zugang zu einem Mac, aber ich habe es geschafft, mit remotedebug-ios-webkit-adapter mit einem iphone zu debuggen und es gibt keinen Fehler. Ich sehe nur das Konsolenprotokoll "Status: 0". In der Netzwerk-Registerkarte sehe ich meinen Ajax-Anruf nicht, es ist so, als ob er überhaupt nicht aufgerufen wird (aber es funktioniert, wenn ich die URL in dieselbe Domäne ändere, in der ich meine Tests mache). –

Antwort

0

versuchen, alle Header ermöglicht es zu überprüfen Sie irgendwelche Header

Access-Control-Allow-Header fehlen: es war *

0

wie immer ein dummer Fehler. Ich habe vergessen, das 's' auf 'https' zu setzen. Safari versuchen Sie nicht einmal, die Anfrage zu senden, wenn Sie die Anfrage von einer https-Website an eine http URL senden.

Verwandte Themen