Création d'un objet par l'api REST

4.0
Création d'un objet par l'api REST
0
Tags: #<Tag:0x00007f13d7f0e028>

(thelohn) #1

Bonjour,

Pour intégrer, modifier et supprimer des données dans une application, nous voulons utiliser les webservices REST.
J’arrive à lister, modifier et supprimer mes instances d’objets métiers, mais pas à en créer.

Le message d’erreur est “Incorrect row id for creation”, à la fois depuis l’interface intégrée et depuis postman.

Le message est présent avec ou sans spécifier de row_id. Celui-ci ne semble pas auto incrementé, donc comment gérer une création ?

Merci pour votre réponse.

Cordialement,
Guillaume


(David AZOULAY) #2

Avant de rentrer dans le détails du fonctionnement l’API bas niveau REST puis-je vous demander quelle technologie vous utilisez coté client. Je pose la question car il y a plusieurs “wrappers” au dessus de ces services bas niveau qui évitent de rentrer dans ces détails.

Cela dit, à première vue, votre pb c’est que vous passez un row ID, or celui-ci est créé par Simplicité, on n’est donc pas sensé lui passer à la création (sauf dans des cas particuliers de row ID custom mais je ne pense pas qu’on soit dans un cas de ce genre).

De manière générale, quand vous postez une demande, merci de préciser de quelle version de Simplicité on parle (idéalement avec la release exacte qu’on obtient, par exemple, sur le endpoint /health dans la rubrique [Platform], ex:

[Platform]
(...)
Version=4.0.P21b
BuiltOn=2018-08-19 21:12 (revision 787adad0cb710767a3d7fe1e0e638818e6741d7c)
(...)

(thelohn) #3

Nous sommes en v4 release 20:

[Platform]
Status=OK
Version=4.0.P20
BuiltOn=2018-07-13 20:42 (revision 5d7751543ceb62ff8a1ac684ded2c0abeea814d3)
Encoding=UTF-8
EndpointIP=127.0.0.1
EndpointURL=https://dev-sim:10373/sem
SystemDate=2018-08-20 14:41:54

Le problème se pose également sans envoyer de row_id :

Merci


(David AZOULAY) #4

Vous n’avez pas répondu à ma question sur la techno que vous utilisez coté client


(thelohn) #5

Le problème se pose avec postman. Nous envisageons de faire les appels directement depuis notre bus de service par la suite.


(David AZOULAY) #6

OK vous voulez donc faire des appels bas niveau sans l’aide de librairies wrapper (juste pour que vous sachiez que ça existe voici le wrapper node.js + Javascript brower : https://github.com/simplicitesoftware/nodejs-api)

Pour ce qui est de l’appel direct des services REST en création j’ai refait le test décrit dans la doc https://www.simplicite.io/resources/documentation/02-integration/rest-services.md#create

En tapant sur /api/rest/<object name>/0 ça marche mais sans le /0 qui est sensé être optionnel il y a effectivement une erreur "Incorrect row ID for creation". Nous allons regarder car c’est une à priori régression.

Le workaround est donc d’ajouter le /0


(thelohn) #7

Ca fonctionne, merci.

En revanche j’ai un autre problème : je reçois un message d’erreur me demandant de compléter les champs obligatoires alors qu’ils sont bien présents dans la requête. Si j’envoie la même requête en passant ces champs en non obligatoires pour tester, mon individu est bien créé :


(David AZOULAY) #8

Je ne constate pas un tel pb sur mes cas de test : si un champ obligatoire est absent j’ai bien un message d’erreur "Field is required ..." et ça n’enregistre pas sinon pas de pb.

Les APIs REST passent par la même validation que la UI. Cette validation vérifie de manière générique que les champs obligatoires sont tous bien renseignés, que les valeurs des champs matchent bien le format paramétré etc. Si des contraintes ou du code pre/post validation est présent ceux-ci s’exécutent aussi. Or ceux ci jouent peut être dans votre cas sur les valeurs de vos champs et/ou sur leur caractère obligatoire…


(thelohn) #9

La requête fonctionne depuis votre interface graphique de requêtage. En revanche il faut remplacer les double quotes par des simples dans postman.

Nos problèmes semblent résolus ! Merci


(David AZOULAY) #10

Selon moi la seule manière de faire des tests REST sans les effets de bord des outils genre Postman ou notre API tester c’est d’utiliser curl en ligne de commande… Votre histoire de quotes est sans doute un pb de format JSON, coté serveur on parse le body JSON avec un org.json.JSONObject si le body est malformé aucun des champs de ce body ne seront pris en compte et vous aurez forcément des messages indiquant que des champs obligatoires sont absent


(David AZOULAY) #11

Le pb du /0 non optionnel est réglé et poussé sur la branche master.

Par contre en faisant les tests associés nous avons rencontré des cas “aléatoire” (i.e. que nous n’avons pas encore bien cernés) où la lecture d’un body JSON correct de la requête tombe en erreur. Dans de tels cas on se retrouve avec des messages "Field is required...". Nous continuons nos investigations sur ce point.


(David AZOULAY) #12

Le pb de parsing JSON est réglé. La correction est poussée sur la branche master.