A JSONP használata

A JSON Padding (JSONP) egy olyan mechanizmus, amely lehetővé teszi a webhelyek közötti szkriptek támogatását a webböngészőkben. A JSONP célja, hogy a webböngészők olyan webhelyről tölthessenek be szkripteket, amely eltér az aktuális betöltött dokumentumtól. A mechanizmus úgy működik, hogy a JSON üzenetet egy felhasználó által definiált visszahívási függvény nevével egészíti ki, ahogyan az az alábbi példában látható.

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

Az előző példában a JSON hasznos adata {"a" = \\"b\\"} függvényhívásba van csomagolva. callback A visszahívási függvénynek már definiálva kell lennie az aktuális weboldalon. A JSONP-válasz tartalomtípusa: application/javascript.

A JSONP nincs automatikusan engedélyezve. Az engedélyezéshez állítsa be az javascriptCallbackEnabled attribútumot true az egyik SZABVÁNYOS HTTP-végponton (WebHttpEndpoint vagy WebScriptEndpoint) az alábbi példában látható módon.

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

A visszahívási függvény neve megadható egy visszahívás nevű lekérdezési változóban, ahogyan az az alábbi URL-címen látható.

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

A meghíváskor a szolgáltatás az alábbihoz hasonló választ küld.

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

A visszahívási függvény nevét úgy is megadhatja, hogy a szolgáltatásosztályra alkalmazza az JavascriptCallbackBehaviorAttribute alábbi példában látható módon.

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

A korábban bemutatott szolgáltatás esetében a kérés a következőhöz hasonlóan néz ki.

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

A meghíváskor a szolgáltatás a következőkkel válaszol.

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

HTTP-állapotkódok

A 200-astól eltérő HTTP-állapotkódokkal rendelkező JSONP-válaszok közé tartozik egy második paraméter, amely a HTTP-állapotkód numerikus ábrázolását tartalmazza, ahogyan az alábbi példában is látható.

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

Érvényesítés

A JSONP engedélyezésekor a következő érvényesítések lesznek végrehajtva:

  • A WCF-infrastruktúra kivételt jelez, ha javascriptCallback engedélyezve van, egy visszahívási lekérdezési sztring paraméter található a kérelemben, és a válaszformátum JSON-ra van állítva.

  • Ha a kérelem tartalmazza a visszahívási lekérdezési sztring paramétert, de a művelet nem HTTP GET, a visszahívási paraméter figyelmen kívül lesz hagyva.

  • Ha a visszahívás neve null vagy üres sztring, a válasz nem JSONP formátumban van formázva.

Lásd még