Ne pas formater une erreur
Bonjour,
J'ai écrit du code en Delphi dans l'événement BeforeXMLService, lorsque ce code génère une Exception j'obtiens une page formatée par XMLRad "Une erreur est intervenue, elle est detaillée ci-dessous ...", comment faire pour avoir une vrai page d'erreur car j'ai une application qui appelle cette fonction et qui teste le résultat de l'exécution or si ce code génère une erreur je dois récupérer un code 404 et pas la page formatée.
Merci.
Exception récupérée en XML
Est-ce que tu ne préféres pas récupérer plutôt du XML ?
Si c'est le cas, tu peux ajouter ce champ dans le Context en cas d'exception :
Code:
1 2 3 4 5 6
|
try
... // Code pouvant générer une exception
except
Context.Values['XMLC_OutputFormat'] := 'XML';
end; |
Ca te permettra de récupérer l'erreur au format XML, mais le header de la réponse HTTP indiquera toujours 200 (success) et non 404 (not found)...
En l'occurence, l'action a bien été trouvée et la DLL a répondu, signe que ce n'est pas une erreur HTTP, mais une erreur applicative. Le status code 200 est donc approprié ici.
Je ne crois pas que le Framework permette de jouer avec le status code http retourné au client. Si quelqu'un a une idée à ce sujet...
Pour gérer l'exception depuis ton application cliente, tu peux utiliser XMLCursor, comme suit :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
|
uses
STDXML_TLB, XMLCursor,
XMLHTTP; // pour avoir accès à SimplePost
...
var
Cursor: IXMLCursor;
ExceptionMsg: WideString;
Response: WideString;
begin
Response := SimplePost(URL);
Cursor := TXMLCursor.Create;
try
Cursor.LoadXML(Response);
ExceptionMsg := Cursor.GetValue('/document/XMLC_Params/XMLC_Exception');
except
// Reponse pas compatible XML, donc pas une erreur à priori
Abort;
end;
if ExceptionMsg <> '' then
raise Exception.Create('erreur pour joindre le serveur : ' + ExceptionMsg);
end; |
Tu récupères ainsi le message d'exception levé par le serveur directement sur ton poste client. Attention si la réponse n'est pas du XML, XMLCursor lève dans ce cas lui-même une exception (d'où le Abort après le LoadXML).
Dans les options du projet, il faut cocher "Assignable Typed Constant" à l'onglet "Compiler".
:!: Attention ! On ne fait pas de Free sur un XMLCursor : ca fonctionne avec des compteurs de références, donc pas de probleme de libération de ce coté là. (pas de .Free parce que XMLCursor est un pointeur sur un objet du DOM détenu par le parser XML).
Peut-être que ca répond à ta question ou que ca te permet de voir le probleme sous un angle différent ?
Bonne soirée :)