Il semble qu'il n'y a aucun moyen de mettre en œuvre un JSONP (JSON avec rembourrage) en utilisant Datasnap, mais je veux jeter cette question ici au cas où quelqu'un a résolu ce problème.
Contexte: JSONP est un mécanisme qui exploite la capacité de référencement de sites croisés de l'élément de script HTML afin de surmonter la même politique d'origine de la classe XMLHTTPRequest . Utilisation d'un XMLHTTPQUEST Vous ne pouvez obtenir que des données (objets JSON) uniquement à partir du même domaine servi le document HTML. Mais si vous souhaitez extraire des données de plusieurs sites et lier ces données à contrôler dans le navigateur? P>
avec JSONP, votre attribut SRC de l'élément de script ne fait pas référence à un fichier JavaScript, mais fait référence à un web méthode (une qui peut résider sur un domaine différent à partir duquel le HTML a été récupéré). Cette méthode Web renvoie le JavaScript. P>
La balise de script suppose que les données renvoyées sont un fichier JavaScript et l'exécute normalement. Cependant, ce que la méthode Web renvoie réellement est un appel de fonction avec un objet JSON littéral comme paramètre. En supposant que la fonction appelée est définie, la fonction exécute et peut fonctionner sur l'objet JSON. Par exemple, la fonction peut extraire des données de l'objet JSON et lier ce que les données au document actuel. P>
Les avantages et les inconvénients de JSONP ont été largement dispensés (il représente un problème de sécurité très grave), donc n'est pas nécessaire de répéter cela ici. P>
Qu'est-ce que je suis intéressé, c'est si quelqu'un a compris comment utiliser JSONP avec les serveurs DelphI's Datasnap repose-repos. Voici le problème, comme je le vois. Une utilisation de JSONP typique peut inclure une étiquette de script qui ressemble à quelque chose comme ceci: p> La méthode Web getdata retournerait un appel comme ce qui suit: p> {"result":["workit({\"id\":\"Delphi Pro\",\"price\":999});"]}
4 Réponses :
Vous pouvez écrire un descendant TDShttpServiceComPONENT et l'accrocher à votre instance de TDShttPService code>. Dans l'exemple suivant, une instance de
tjsonpdispatcher code> est créée à l'exécution (pour éviter de l'enregistrer dans l'IDE):
Très belle solution. Merci pour votre réponse. J'aimerais pouvoir accepter votre réponse et la réponse de Marco comme correcte (pas possible). J'ai accepté la réponse de Marco en raison de sa simplicité. Mais j'ai voté votre solution.
@Cary merci! Je préférerais aussi la réponse de Marco, il est très intéressant d'apprendre sur tdsinvocationmetadata code>. Malheureusement, il ne semble pas exposer des informations sur la demande, seule la réponse. Parfois, il pourrait être utile d'avoir accès aux données de demande de la méthode du serveur.
Très belle solution, mais dans mon code, la procédure de Docommand n'est jamais appelée. Utiliser Delphi Xe7 ..
Il existe une manière dans les méthodes de repos Delphi DataSnap pour contourner le traitement JSON personnalisé et renvoyer exactement le JSON souhaité. Voici une fonction de classe que j'utilise (dans ma structure de détente) pour renvoyer des données simples à un JQGrid: BTW, vous pouvez attribuer nilier à la suite de la fonction de repos. p> p> info sur http://blogs.embarcadero.com/mathewd/2011/01/18/invocation-metadata/ . < / del>
Info à https://mathewdelong.wordpress.com/2011/01/18 / Invocation-métadonna / . p>
Merci, Marco! Grande solution. Et merci d'inclure le lien avec le blog de Mat Delong sur cette technique.
Oui, merci de lier à mon blog Marco :)
Le problème de la stratégie d'origine peut être résolu facilement dans Datasnap. Vous pouvez personnaliser l'en-tête de réponse de cette manière:
procedure TWebModule2.WebModuleBeforeDispatch(Sender: TObject; Request: TWebRequest; Response: TWebResponse; var Handled: Boolean); begin **Response.SetCustomHeader('access-control-allow-origin','*');** if FServerFunctionInvokerAction <> nil then FServerFunctionInvokerAction.Enabled := AllowServerFunctionInvoker; end;
Je n'ai pas eu l'occasion d'essayer cette approche, mais merci de contribuer.
La réponse de Nicolás Loaiza Code> Motivez-moi pour trouver une solution pour TDShttPService, définissez l'en-tête de réponse client dans Trace Event:
procedure TDataModule1.DSHTTPService1Trace(Sender:
TObject; AContext: TDSHTTPContext; ARequest: TDSHTTPRequest; AResponse:
TDSHTTPResponse);
begin
if AResponse is TDSHTTPResponseIndy then
(AResponse as TDSHTTPResponseIndy).ResponseInfo.CustomHeaders.AddValue('access-control-allow-origin', '*');
end;
La question peut être réduite à «DataSnap propose-t-il un filtre / crochet / événement qui permet de modifier la réponse JSON générée avant qu'elle ne soit envoyée au client»?