Korzystanie z formatu JSONP

JSON Padding (JSONP) to mechanizm, który umożliwia obsługę skryptów między witrynami w przeglądarkach internetowych. JSONP jest zaprojektowane wokół możliwości przeglądarek internetowych do ładowania skryptów z witryny innej niż ta, z której pochodzi obecnie załadowany dokument. Mechanizm działa przez dopełnianie ładunku JSON nazwą funkcji zwrotnej zdefiniowaną przez użytkownika, jak pokazano w poniższym przykładzie.

callback({"a" = \\"b\\"});

W poprzednim przykładzie obiekt {"a" = \\"b\\"} JSON jest opakowany w wywołanie funkcji callback. Funkcja wywołania zwrotnego musi być już zdefiniowana na bieżącej stronie sieci Web. Typ zawartości odpowiedzi JSONP to application/javascript.

Format JSONP nie jest automatycznie włączony. Aby go włączyć, przypisz atrybut javascriptCallbackEnabled wartość true do jednego ze standardowych punktów końcowych HTTP (WebHttpEndpoint lub WebScriptEndpoint), jak pokazano w poniższym przykładzie.

<system.serviceModel>
  <standardEndpoints>
    <webHttpEndpoint>
      <standardEndpoint name="" javascriptCallbackEnabled="true"/>
    </webHttpEndpoint>
  </standardEndpoints>
</system.serviceModel>

Nazwę funkcji wywołania zwrotnego można określić w zmiennej kwerendy o nazwie wywołanie zwrotne, jak pokazano w poniższym adresie URL.

http://baseaddress/Service/RestService?callback=functionName

Po wywołaniu usługa wysyła odpowiedź podobną do poniższej.

functionName({"root":"Something"});

Możesz również określić nazwę funkcji callback, stosując znacznik JavascriptCallbackBehaviorAttribute w klasie usługi, jak pokazano w poniższym przykładzie.

[ServiceContract]
[JavascriptCallbackBehavior(ParameterName = "$callback")]
public class Service1
{
    [OperationContract]
    [WebGet(ResponseFormat=WebMessageFormat.Json)]
    public string GetData()
    {
    }
}

W przypadku usługi pokazanej wcześniej żądanie wygląda następująco.

http://baseaddress/Service/RestService?$callback=anotherFunction

Po wywołaniu usługa odpowiada za pomocą poniższych instrukcji.

anotherFunction ({"root":"Something"});

Kody stanu HTTP

Odpowiedzi JSONP z kodami stanu HTTP innymi niż 200 zawierają drugi parametr z liczbową reprezentacją kodu stanu HTTP, jak pokazano w poniższym przykładzie.

anotherFunction ({"root":"Something"}, 201);

Sprawdzanie poprawności

Po włączeniu protokołu JSONP są wykonywane następujące walidacje:

  • Infrastruktura WCF zgłasza wyjątek, jeśli javascriptCallback jest włączony, parametr ciągu zapytania zwrotnego jest obecny w żądaniu, a format odpowiedzi jest ustawiony na JSON.

  • Jeśli żądanie zawiera parametr ciągu zapytania wywołania zwrotnego, ale operacja nie jest operacją HTTP GET, to parametr wywołania zwrotnego jest ignorowany.

  • Jeśli nazwa wywołania zwrotnego to null lub pusty ciąg, odpowiedź nie jest sformatowana jako JSONP.

Zobacz także