2010-11-19 6 views
4

Ich versuche, sowohl die Server-und Client-Seite einer JSON-Anfrage zu erstellen, und ich kann nicht scheinen, damit es funktioniert. Ich habe mir zahlreiche Guides, Blogposts usw. angeschaut, aber so gut wie jeder zeigt nur die Client-Seite.JSONP - Access-Control-Allow-Origin- und MIME-Typ-Fehler

Hier ist mein Client-Code

$.ajax({ 
    dataType: 'application/json', 
    data: params, 
    jsonp: 'jsonpCallback', 
    url: settings.domain + '/httpext.dll?json_cc', 
    success: function (data) { 
     //determine the return status 
    }, 
    error: function (response, status, error) { 
     //error handling 
    } 
}); //end ajax 

gerade jetzt, der Server eine hartcodierte Wert wie dieser

jsonpCallback({"username":"meltingice","posts"1234}); 

Mein Problem zurückkehrt ist, dass ich nicht die Anforderung und Antwort bekommen, zusammen zu arbeiten. Momentan gibt die Antwort application/json zurück. Wenn ich also meine Anfrage ändere, erwarte ich, dass jsonp it Fehler mit

Ressource als Skript interpretiert, aber mit MIME-Typ application/json übertragen wird. Uncaught ReferenceError: jsonpCallback ist nicht definiert

Zunächst einmal, wie Sie sehen können, habe ich jsonpCallback definiert.

Nun, wenn ich den Datentyp application/json ändern, dann bekomme ich diesen Fehler

XMLHttpRequest cannot load http://myserver/httpext.dll?json_cc&sid=adsfhasjdkfhajksdghjk%3Basdhg&action=SALE&ccCard=&ccNum=&ccExMM=0&ccExYYYY=0&ccCVV2=&holdersName=&totalDue=0&dueDate=11%2F19%2F2010. Origin http://localhost:59905 is not allowed by Access-Control-Allow-Origin. 

Wie Sie sehen können, ist es nicht callback=? in die URL setzen. Es ist ziemlich frustrierend.

Wie richte ich die Serverseite ein, damit ich sie mit jsonp aufrufen kann? Was brauche ich für den Antworttyp? Wie formatiere ich die zurückgegebenen Daten, damit mein clientseitiger Code die Daten zurückziehen kann?

Antwort

5

Der Grund, warum dies nicht funktioniert, ist, weil Ihr Server immer einen hartcodierten Methodennamen zurückgibt und Ihr Client einen anonymen success-Handler verwendet. Dies kann nicht funktionieren. Sie müssen Ihren Server so konfigurieren, dass er den als Argument übergebenen Methodennamen verwendet, oder er ruft nie den Rückruf success auf dem Client auf. Also, wenn Sie Ihren Server so konfigurieren, zu berücksichtigen, die jsoncallback Abfrageparameter können Sie es wie folgt testen:

$.getJSON(settings.domain + '/httpext.dll?json_cc&jsoncallback=?', params, function(result) { 
    alert('success'); 
}); 

Nun wird der Server eine Anfrage erhalten, die wie folgt aussehen könnte:

http://foo.com/httpext.dll?json_cc&jsoncallback=jsonp1290183992345 

und sollte wie folgt reagieren:

jsonp1290183992345({"username":"meltingice","posts"1234}); 

mit dem richtigen Content-Type auch offensichtlich (application/json).

+0

Ich habe den Code geändert, um den Standard-Callback-Namen zu ziehen, aber ich bekomme immer noch andere Fehler. Die Ressource wird als Skript interpretiert, aber mit dem MIME-Typ application/json übertragen. – Josh

1

Ich wollte auch dieses Snippet beitragen, das ich in ASP.NET MVC verwendet habe, um das jsoncallback zu behandeln.

private static ActionResult GetContent(object data, string callback) 
    { 
     if (!string.IsNullOrEmpty(callback)) 
     { 
      ContentResult result = new ContentResult(); 
      result.ContentType = "application/json"; 

      JavaScriptSerializer serializer = new JavaScriptSerializer(); 
      string json = serializer.Serialize(data); 
      result.Content = string.Format("{0}({1})", callback, json); 
      return result; 
     } 
     else 
     { 
      JsonResult result = new JsonResult(); 
      result.Data = data; 
      result.JsonRequestBehavior = JsonRequestBehavior.AllowGet; 
      return result; 
     } 
    }