En attendant de publier une étude de cas plus étoffée sur le sujet (Flex et RESTFull web services), j’ai voulu partager rapidement la solution à un problème qui m’a tenu bien énervé pendant ces deux derniers jours. Pourquoi? Très simple! On (moi bien ancré) croit toujours que la documentation c’est fait pour les autres… oui les autres!
Alors! Le contexte?
1. Admettons que je dispose d’une service de type REST exposé à l’adresse http://www.hatface.com/resources/login/ (ce qui n’est pas le cas en réalité!)
2. Au niveau de ce service j’aimerai y déclarer une méthode de type POST pour traiter toutes les demandes d’authentification.
3. Avoir une interface client développée avec Flex.
Problème?
Côté service Java, je n’arrivais pas à récupérer les paramètres envoyés par le client Flex en utilisant un object HTTPService.
Solution ?
1. Créer son l’objet HTTPService de quelque façon ce soit. Ici j’ai pris la déclaration la plus usuelle.
<mx:HTTPService id="login_user" result="checkLogin(event)"
showBusyCursor="true" method="POST" useProxy="false"
url="http://www.hatface.com/resources/login/">
<mx:request>
<username>
{username.text}
</username>
<password>
{password.text}
</password>
</mx:request>
</mx:HTTPService>
2. Implémenter la logique
Après m’être mis dans la tête que c’est l’implémentation REST avec laquelle je travaillais qui posait problème, j’ai développé mon service avec Jersey/Spring, RestEASY/Spring et pour finir CXF/Spring. Forcément lorsqu’aucun des trois ne marche on se met réciter tous les noms d’oiseaux qui nous passent par la tête.
Pour retracer le problème, je fais une implémentation rapide du service en PHP, sans changer la partie Flex. Bonheur (et malheur à la fois)! Ça marche! Il n’y a donc absolument aucun problème au niveau de Flex (idée qui commençait à mûrir dans ma tête). Ça venait bien du côté Java.
Après quelques essais et la tête un peu plus … refroidie, j’ai revu la déclaration de la méthode de mon service en la faisant passer de…
@POST
public String authenticate(@javax.ws.rs.QueryParam("username") String user) { ... }
à …
@POST
public String authenticate(@javax.ws.rs.FormParam("username") String user) { ... }
Voilà !
Je n’écris pas cet article pour la lumière de la réponse (Quelle idée d’utiliser du QueryParam dans un POST) mais pour éviter à d’autres Ninjas du code (ou des débutants tout simplement) de perdre autant de temps sur la question.
- ...
Social