PHP gestion SimpleXMLElement Erreurs

  • devilwood
  • Silver Member
  • Silver Member
  • Avatar de l’utilisateur
  • Inscription: Nov 18, 2007
  • Messages: 429
  • Status: Offline

Message Février 12th, 2013, 3:27 pm

Im écrit une API simple pour s'interfacer avec mon système. La première tâche que je veux que mon script serveur faire est vérifier la structure XML. Je ne suis pas sûr si la définition d'un schéma ou un xsd est ce que je dois faire comme cela semble juste définir les touches et types.

Mon problème est que j'utilise PHP pour lire la chaîne XML qui est d'être soumis et utilisation strpos pour vérifier les balises appropriées. Cela fonctionnerait si j'avais seulement un type de XML appeler à mon script de serveur. Cependant, j'ai un peu et je définis l'appel dans le code XML <call> mise à jour </call>. Donc, si je reçois un appel de mise à jour alors je sais, il y aurait quelques balises requises, j'aurais besoin de chercher. Je dois donc, première phase de la balise <call> out qui m'oblige à démarrer l'analyse du XML prématurément.

Code: [ Select ]
$api = new SimpleXMLElement( $xml );
$call = $api->call; // this value would be UPDATE
  1. $api = new SimpleXMLElement( $xml );
  2. $call = $api->call; // this value would be UPDATE


Le problème est lorsque je crée l'objet SimpleXMLElement sur XML mal formé, j'obtiens une erreur fatale.

Code: [ Select ]
Fatal error: Uncaught exception 'Exception' with message 'String could not be parsed as XML'


Ma première pensée était de supprimer l'erreur et puis renvoyer une erreur personnalisée pour l'utilisateur qui a évidemment envoyé en XML mal formé. J'ai utilisé

Code: [ Select ]
libxml_use_internal_errors(true);


Cela ne supprime pas toujours l'erreur fatale.

J'ai besoin d'un moyen d'envoyer une erreur à l'utilisateur ou d'une autre façon d'obtenir la valeur de <call> de la requête XML sans il analyse avec SimplXMLElement.
L'heure actuelle, l'API client envoie la requête XML avec la balise <call> via cURL. Les en-têtes contiennent POST, content-type et content-length. Y at-il peut-être un moyen que je peux modifier l'en-tête pour contenir l'appel spécifique que je peux récupérer sur mon script de serveur API ?
  • Anonymous
  • Bot
  • No Avatar
  • Inscription: 25 Feb 2008
  • Messages: ?
  • Loc: Ozzuland
  • Status: Online

Message Février 12th, 2013, 3:27 pm

  • joebert
  • Sledgehammer
  • Genius
  • No Avatar
  • Inscription: Fév 10, 2004
  • Messages: 13455
  • Loc: Florida
  • Status: Offline

Message Février 12th, 2013, 4:47 pm

Try/Catch ?

http://php.net/manual/en/language.exceptions.php
Strong with this one, the sudo is.
  • spork
  • Brewmaster
  • Silver Member
  • Avatar de l’utilisateur
  • Inscription: Sep 22, 2003
  • Messages: 6130
  • Loc: Seattle, WA
  • Status: Offline

Message Février 12th, 2013, 5:52 pm

EW. Ne pas faire XML parsing/validation manuelle. Si vous travaillez avec des documents de DOM, utilisez ceci :

http://php.net/manual/en/domdocument.schemavalidate.php

Sinon, utilisez quelque bibliothèque appropriée PHP fournit. Voici une rapide recherche sur (Lien Google fourni pour plus de commodité, ne pas d'être de mauvaise humeur).
The Beer Monocle. Classy.
  • devilwood
  • Silver Member
  • Silver Member
  • Avatar de l’utilisateur
  • Inscription: Nov 18, 2007
  • Messages: 429
  • Status: Offline

Message Février 13th, 2013, 8:28 am

À droite, j'ai regardé une validation à l'aide de xsd de construction mais il semblait exagéré parce que je ne suis pas sûr comment que la validation fonctionne avec différents demande XML. Par exemple, un utilisateur peut appeler UPDATE dans la requête XML. Le code XML peut ressembler à ceci :

Code: [ Select ]

<api>
<call>UPDATE</call>
<apptoken>MD5</apptoken>
<recordid>30294</recordid>
</api>
  1. <api>
  2. <call>UPDATE</call>
  3. <apptoken>MD5</apptoken>
  4. <recordid>30294</recordid>
  5. </api>


Bien sûr, tous les appels, je voudrais vérifier que cet élément &lt;apptoken&gt; a été inclus et dans le cas d'une mise à jour appeler I exigerait que &lt;recordid&gt; être définie. Sinon, je jette une erreur de réponse XML informant l'utilisateur ils soumis XML mal formé et doivent inclure une balise &lt;recordid&gt;. Toutefois, si l'appel est lu puis un spécifique &lt;recordid&gt; est facultatif mon serveur api ne sera pas erreur si cette balise est manquante, car si la balise &lt;recordid&gt; est manquante dans un appel de READ puis il sera juste défaut pour lire tout ce qui est très bien.

Je suppose que j'aurais besoin d'un xsd pour chaque appel?? comme UPDATE.xsd mais j'ai encore besoin de l'appel à la courbure demanderait afin de charger le bon .xsd. En outre, Im ne sais pas comment je construis des erreurs spécifiques et personnalisées avec le validateur xsd. Je me this captures entreraient en jeu ici aussi bien.

Selon moi, le hic, c'est ce que je cherche. Si il va arrêter l'exception et me permettre de renvoyer une erreur personnalisée à l'utilisateur puis je devrais être bon d'aller jusqu'à ce que je reçois plus de temps pour ressembler davantage à la validation par le biais de xsd. Merci pour la recherche Google, j'étais déjà allé aux 5 premiers résultats. Cependant, remontant à la deuxième résultat m'a fait me souviens que j'allais utiliser ce tutoriel, mais je n'avais encore rencontré la question même de la possibilité d'utiliser un schéma spécifique basé sur la requête entrante XML.

Est-il possible d'ajouter un en-tête personnalisé dans ma demande de courbure comme :

Code: [ Select ]

            $headers = array(
                "POST".$url,
                "Content-Type: application/xml;",
                "Content-Length: ".$content_length,
                "Call: ".$call
            );
  1.             $headers = array(
  2.                 "POST".$url,
  3.                 "Content-Type: application/xml;",
  4.                 "Content-Length: ".$content_length,
  5.                 "Call: ".$call
  6.             );


Puis le récupérer sur le serveur api avec :

Code: [ Select ]

$headers = apache_request_headers();
$call = $headers['Call'];
  1. $headers = apache_request_headers();
  2. $call = $headers['Call'];



Je pourrais alors nourrir l'appel dans ma classe de l'api qui puisse alors charger le schéma xsd pour valider. Des problèmes ou des pièges avec ce cours ?

Afficher de l'information

  • Total des messages de ce sujet: 4 messages
  • Utilisateurs parcourant ce forum: ScottG et 280 invités
  • Vous ne pouvez pas poster de nouveaux sujets
  • Vous ne pouvez pas répondre aux sujets
  • Vous ne pouvez pas éditer vos messages
  • Vous ne pouvez pas supprimer vos messages
  • Vous ne pouvez pas joindre des fichiers
 
 

© 2011 Unmelted, LLC. Ozzu® est une marque déposée de Unmelted, LLC