2010-01-18 6 views
7

je dois publier des données de mon formulaire HTML au serveur au format xml, quelque chose comme:Comment poster du XML au serveur via un formulaire HTML?

<some_parameters> 
    <firstname>Homer</firstname> 
    <lastname>Simpson</lastname> 
    <street>74 Evergreen Tr.</street> 
</some_parameters> 

Tout ce que je sais est qu'il va à l'une des applications de CRM fonctionnent sur différents domaines. Maintenant, je ne suis pas sûr de la meilleure façon de faire cela.

Je pensais juste à envelopper les valeurs des champs dans mon formulaire lorsque l'utilisateur soumet le formulaire. Donc, si l'utilisateur a tapé "Homer" dans le champ "firstname" et clique sur submit, mon JS changera la valeur du champ en <firstname>Homer</firstname> puis publiera les données.

Si cela aide j'utilise jQuery du côté client. Je pense qu'il doit y avoir le meilleur moyen que ma solution romprait avec JS désactivé et semble un peu douteux, donc si vous pouviez me pointer dans la bonne direction ce serait génial.

+0

Pour quelqu'un pour vous aider, ils devront savoir ce que vous utilisez pour votre backend. –

Répondre

3

La meilleure façon que je puisse penser est d'intercepter l'action de soumission de formulaire et de convertir les détails du formulaire au format XML, puis de le soumettre au serveur. Il y a plusieurs façons de le faire, mais le plus simple serait de mettre en œuvre une solution via un framework comme jQuery:

Un exemple de cette chose peut être trouvé en ligne à http://www.docunext.com/...data-to-xml-with-jquery qui utilise le JSON to XML Plugin:

$("#myform").submit(function(){ 
    var formjson = $('#myform').serializeArray(); 
    var formxml = json2xml(formjson); 
    $.post("/collect.php", { 'data': formxml }, function(data){ 
    // callback logic 
    }); 
    return false; 
}); 
+0

Les deux liens sont morts! – thomaskonrad

+0

@thomaskonrad J'ai corrigé les liens (en redirigeant vers les archives sur le wayback). Il est probable que certains téléchargements et autres ressources ne fonctionnent pas. Faites-moi savoir si vous rencontrez d'autres problèmes. – Sampson

2

Vous pouvez envoyer un fichier XML en utilisant XFORMS. Par exemple, voir: http://www.mozilla.org/projects/xforms/

+0

+1 mais ce n'est pas pris en charge sur la plupart des navigateurs à ma connaissance. –

+1

Obsolète depuis Gecko 19 (Firefox 19/Thunderbird 19/SeaMonkey 2.16) –

8

Publier du code XML sans javascript ou plugin de navigateur est impossible. Les deux formats possibles d'affichage des formulaires html sont application/x-www-form-urlencoded et multipart/form-data.

+0

Voulez-vous dire ** possible ** à la place de l'impossible? – MaxZoom

4

Je viens de recevoir cela fonctionne en chrome, la clé est d'avoir l'espace vide dans le nom de zone de texte:

<html> 
    <body> 
     <form action="http://target_webservice" method="post"> 
      <textarea rows="20" cols="100" name=" "> 
       <?xml version="1.0"?><requestElements><blah></blah></requestElements> 
      </textarea> 
      <input type="submit" value="Submit"> 
     </form>   
    </body> 
</html> 
0

Si le code des serveurs côté est une option, vous pouvez utiliser un script CURL php personnalisé comme un intermédiaire transmettre votre demande sur à la troisième partie dans un format xml réel. Je ne suis pas sûr si CURL vient avec une installation php standard, et si ce n'est pas une option, vous pourriez probablement utiliser fsocketopen à la place (bien que personnellement je pense que la tactique est plus difficile). Mais CURL est assez facile à installer et extrêmement utile pour permettre à PHP d'envoyer des requêtes comme s'il s'agissait d'un navigateur. La différence qui vous intéresse ici, c'est que cela vous permet de définir l'en-tête 'Content-type: text/xml'.

Donc, votre formulaire html envoie des valeurs GET ou POST régulières à votre script PHP. Ensuite, ayez ce script php personnel pour les convertir au format XML attendu par la 3ème partie. (Ne pas oublier de le précéder la balise <?xml version="1.0" encoding="ISO-8859-1"?>, avec tout ce que les valeurs d'attribut sont appropriées pour vous.) Et puis l'envoyer via ce code:

$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL, $url); 
curl_setopt($ch, CURLOPT_HEADER, 1); 
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); 
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST'); 
curl_setopt($ch, CURLOPT_POST, 1); 
curl_setopt($ch, CURLOPT_POSTFIELDS, $xmlRequest); 
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
    'Content-type: text/xml', 
    'Content-length: '.strlen($xmlRequest), 
)); 
$output = curl_exec($ch); 
curl_close($ch); 
Questions connexes