Sdílet prostřednictvím


Použití JSONP

Odsazení JSON (JSONP) je mechanismus, který umožňuje podporu skriptování napříč webovými stránkami ve webových prohlížečích. JSONP je navržena tak, aby webové prohlížeče načítaly skripty z webu, které se liší od toho, ze které byl načten aktuální načtený dokument. Mechanismus funguje tak, že doplní datovou část JSON uživatelsky definovaným názvem funkce zpětného volání, jak je znázorněno v následujícím příkladu.

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

V předchozím příkladu je datová část {"a" = \\"b\\"}JSON zabalena do volání funkce , callback. Funkce zpětného volání musí být již definována na aktuální webové stránce. Typ obsahu odpovědi JSONP je application/javascript.

JSONP není automaticky povolen. Pokud ho chcete povolit, nastavte javascriptCallbackEnabled atribut na true jeden ze standardních koncových bodů HTTP (WebHttpEndpoint nebo WebScriptEndpoint), jak je znázorněno v následujícím příkladu.

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

Název funkce zpětného volání lze zadat v proměnné dotazu označované jako zpětné volání, jak je znázorněno na následující adrese URL.

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

Při vyvolání služba odešle odpověď jako následující.

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

Název funkce zpětného volání můžete také určit použitím JavascriptCallbackBehaviorAttribute třídy služby, jak je znázorněno v následujícím příkladu.

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

U dříve zobrazené služby žádost vypadá podobně jako následující.

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

Při vyvolání služba odpoví následujícím kódem.

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

Stavové kódy HTTP

Odpovědi JSONP s jinými stavovými kódy HTTP než 200 obsahují druhý parametr s číselnou reprezentací stavového kódu HTTP, jak je znázorněno v následujícím příkladu.

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

Ověření

Při povolení JSONP se provádějí následující ověření:

  • Infrastruktura WCF vyvolá výjimku, pokud javascriptCallback je povolená, je v požadavku k dispozici parametr dotazu zpětného volání a formát odpovědi je nastaven na JSON.

  • Pokud požadavek obsahuje parametr zpětného volání v řetězci dotazu, ale operace není HTTP GET, parametr se ignoruje.

  • Pokud je null název zpětného volání nebo prázdný řetězec, odpověď není naformátovaná jako JSONP.

Viz také