Erreur à la création d'un objet par API

Ok déjà vous êtes sur la branche prerelease => il faudrait passer en release car utiliser la prerelease n’est sensé se faire que lorsqu’on approche d’une release, en ce moment le contenu de prerelease et release est identique mais ça ne va pas durer.

Pour ce qui est des appels de services /api/rest GET/POST/PUT/DELETE sur cette version j’ai refais des tests et ça fait bien ce qu’il faut:

POST (creation d’un record):

GET (consultation du record créé):

PUT (mise à jour du record):

DELETE (suppression du record):

POST (en erreur ici car il manque l’attribut clé fonctionnelle référence):

Etc.

A noter les accents dans un des attributs de mes tests.

La page “API tester” avait des petits bugs qui ont été corrigés mais de toute façon ce n’est qu’un outil de test “historique” qui ne doit pas être considéré comme autre chose.

Je vous laisse retester avec votre version à jour, si vous avez des pbs envoyez nous l’équivalent de ce que j’ai envoyé ci-dessus à savoir les appels effectués, les données envoyées et les réponses reçues.

Même problème sur notre environnement de développement qui est sur la branche release:

Par contre notre objet est bien et on peut le consulter par un GET :

Même erreur sur un PUT :

Puis-je voir les 2 headers passés pour les POST et PUT ?
Ainsi que le header d’identification/authentification ?

Je fais une authentification en basic

OK je précise l’authentification systématique en basic auth n’est pas aussi performante que l’utilisation de token. Il faut donc toujours privilégier cette méthode par token.

Sur les headers je ne vois rien d’anormal il est impératif pour POST/PUT d’avoir Content-type à application/json, c’est le cas ici.

Comme les appels de service marchent très bien sur d’autres objets il doit y avoir une erreur dans le traitement de création/update en fct des données envoyées et/ou du code specifique de l’objet. Je pense qu’il a peut être des indices dans les logs…

Je suis en train de faire en sorte que ce cas d’erreur (le “data” pas trouvé dans la réponse du create/update qui finit actuellement en erreur non prévue “internal server error” (500)) trace un peu plus de choses dans les logs pour pouvoir mieux cerner ce pb qu’on ne reproduit pas. Je vais pousser ça dans l’après midi.

Ca a été poussé.

  • Mettez vous à jour
  • Activez le log event DCOREWS001 (i.e. passez le de debug à info)
  • Refaites vos test
  • Envoyez nous les messages correspondants que vous trouverez dans les logs (NB: merci de ne pas nous envoyer l’intégralité de logs, juste les traces liés à vos appels)

2020-03-19 09:08:17,683 DEBUG [com.simplicite.webapp.tools.ServletTool] SIMPLICITE|https://dev-sim:10423/forpro|/forpro|DEBUG|system|com.simplicite.webapp.tools.ServletTool|setHTTPHeaders||Evénement: [REQUEST] method POST on /forpro/ui/logs from 172.20.7.28 with session 677A1BADA8254B31A82FE6F18C12EFD4, [RESPONSE] MIME type: text/html; charset=UTF-8 max age: 0 seconds
2020-03-19 09:08:13,654 DEBUG [com.simplicite.webapp.servlets.api.RESTServlet] SIMPLICITE|https://dev-sim:10423/forpro|/forpro|DCOREWS001|designer|com.simplicite.webapp.servlets.api.RESTServlet|service||Trace web services: Elapsed time for URI: /forpro/api/rest/CrbFopIndividu/ = 88ms
2020-03-19 09:08:13,654 DEBUG [com.simplicite.webapp.tools.ServletTool] SIMPLICITE|https://dev-sim:10423/forpro|/forpro|DEBUG|system|com.simplicite.webapp.tools.ServletTool|setHTTPHeaders||Evénement: [REQUEST] method POST on /forpro/api/rest/CrbFopIndividu/ from 172.20.7.28 with session 7424828D64514E322F40A953BC4D48C8, [RESPONSE] MIME type: application/json max age: -1 seconds
2020-03-19 09:08:13,653 ERROR [com.simplicite.webapp.servlets.api.RESTServlet] SIMPLICITE|https://dev-sim:10423/forpro|/forpro|ERROR|designer|com.simplicite.webapp.servlets.api.RESTServlet|post||Evénement: Error in create result: {"row_id":"9624","fopIndividuNir":"185122587878","fopIndividuCivilite":"M","fopIndividuNomNaissance":"TEST AVEC ÀCCENT","fopIndividuNomUsage":"TEST AVEC ÀCCENT","fopIndividuPrenom":"TOTO","fopIndividuIdentite":"TEST AVEC ÀCCENT TOTO","fopIndividuDtNaissance":"1985-12-25","fopIndividuPaysNaissance":"000","fopIndividuEmail":"toto@test.com","fopIndividuCommuneNaissance":"PARIS","fopIndividuIdDe":null,"fopIndividuCodeInseeNaissance":null,"fopIndividuNirCertifie":true,"fopIndividuDtMajDe":null,"fopIndividuOrigine":"OF"}
    org.json.JSONException: JSONObject["data"] not found.
     at org.json.JSONObject.get(JSONObject.java:573)
     at org.json.JSONObject.getJSONObject(JSONObject.java:766)
     at com.simplicite.webapp.servlets.AbstractRESTServlet.post(AbstractRESTServlet.java:558)
     at com.simplicite.webapp.servlets.AbstractRESTServlet.service(AbstractRESTServlet.java:294)
     at javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
     at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
     at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
     at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
     at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
     at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
     at com.simplicite.webapp.filters.RewriteFilter.doFilter(RewriteFilter.java:77)
     at com.simplicite.webapp.filters.AbstractFilter.doFilter(AbstractFilter.java:37)
     at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
     at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
     at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202)
     at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
     at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541)
     at com.simplicite.tomcat.valves.APISessionValve.invoke(APISessionValve.java:187)
     at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139)
     at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
     at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:688)
     at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)
     at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343)
     at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:373)
     at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)
     at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868)
     at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1594)
     at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
     at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
     at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
     at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
     at java.base/java.lang.Thread.run(Thread.java:834)
2020-03-19 09:08:13,624 DEBUG [com.simplicite.util.engine.ObjectManager] SIMPLICITE|https://dev-sim:10423/forpro|/forpro|DCOREDB002|system|com.simplicite.util.engine.ObjectManager|query||Param: colonne [1] valeur (9624)
2020-03-19 09:08:13,623 DEBUG [com.simplicite.util.engine.ObjectManager] SIMPLICITE|https://dev-sim:10423/forpro|/forpro|DCOREDB001|system|com.simplicite.util.engine.ObjectManager|query||Requête SQL: jdbc/simplicite: select t.row_id, t.FOP_INDIVIDU_NIR, t.FOP_INDIVIDU_CIVILITE, t.FOP_INDIVIDU_NOM_NAISSANCE, t.FOP_INDIVIDU_NOM_USAGE, t.FOP_INDIVIDU_PRENOM, t.FOP_INDIVIDU_IDENTITE, t.FOP_INDIVIDU_DT_NAISSANCE, t.FOP_INDIVIDU_PAYS_NAISSANCE, t.FOP_INDIVIDU_EMAIL, t.FOP_INDIVIDU_COMMUNE_NAISSANCE, t.FOP_INDIVIDU_ID_DE, t.FOP_INDIVIDU_CODE_INSEE_NAISSANCE, t.FOP_INDIVIDU_NIR_CERTIFIE, t.FOP_INDIVIDU_DT_MAJ_DE, t.FOP_INDIVIDU_ORIGINE, t.created_dt, t.created_by, t.updated_dt, t.updated_by from CRB_FOP_INDIVIDU t where (t.row_id=?) order by t.row_id asc
2020-03-19 09:08:13,613 DEBUG [com.simplicite.util.engine.ObjectManager] SIMPLICITE|https://dev-sim:10423/forpro|/forpro|DCOREDB002|system|com.simplicite.util.engine.ObjectManager|update||Param: colonne fopIndividuOrigine valeur (OF)
2020-03-19 09:08:13,613 DEBUG [com.simplicite.util.engine.ObjectManager] SIMPLICITE|https://dev-sim:10423/forpro|/forpro|DCOREDB002|system|com.simplicite.util.engine.ObjectManager|update||Param: colonne fopIndividuNirCertifie valeur (1)
2020-03-19 09:08:13,612 DEBUG [com.simplicite.util.engine.ObjectManager] SIMPLICITE|https://dev-sim:10423/forpro|/forpro|DCOREDB002|system|com.simplicite.util.engine.ObjectManager|update||Param: colonne fopIndividuCommuneNaissance valeur (PARIS)
2020-03-19 09:08:13,612 DEBUG [com.simplicite.util.engine.ObjectManager] SIMPLICITE|https://dev-sim:10423/forpro|/forpro|DCOREDB002|system|com.simplicite.util.engine.ObjectManager|update||Param: colonne fopIndividuEmail valeur (toto@test.com)
2020-03-19 09:08:13,612 DEBUG [com.simplicite.util.engine.ObjectManager] SIMPLICITE|https://dev-sim:10423/forpro|/forpro|DCOREDB002|system|com.simplicite.util.engine.ObjectManager|update||Param: colonne fopIndividuPaysNaissance valeur (000)
2020-03-19 09:08:13,612 DEBUG [com.simplicite.util.engine.ObjectManager] SIMPLICITE|https://dev-sim:10423/forpro|/forpro|DCOREDB002|system|com.simplicite.util.engine.ObjectManager|update||Param: colonne fopIndividuDtNaissance valeur (1985-12-25)
2020-03-19 09:08:13,611 DEBUG [com.simplicite.util.engine.ObjectManager] SIMPLICITE|https://dev-sim:10423/forpro|/forpro|DCOREDB002|system|com.simplicite.util.engine.ObjectManager|update||Param: colonne fopIndividuIdentite valeur (TEST AVEC ÀCCENT TOTO)
2020-03-19 09:08:13,611 DEBUG [com.simplicite.util.engine.ObjectManager] SIMPLICITE|https://dev-sim:10423/forpro|/forpro|DCOREDB002|system|com.simplicite.util.engine.ObjectManager|update||Param: colonne fopIndividuPrenom valeur (TOTO)
2020-03-19 09:08:13,611 DEBUG [com.simplicite.util.engine.ObjectManager] SIMPLICITE|https://dev-sim:10423/forpro|/forpro|DCOREDB002|system|com.simplicite.util.engine.ObjectManager|update||Param: colonne fopIndividuNomUsage valeur (TEST AVEC ÀCCENT)
2020-03-19 09:08:13,611 DEBUG [com.simplicite.util.engine.ObjectManager] SIMPLICITE|https://dev-sim:10423/forpro|/forpro|DCOREDB002|system|com.simplicite.util.engine.ObjectManager|update||Param: colonne fopIndividuNomNaissance valeur (TEST AVEC ÀCCENT)
2020-03-19 09:08:13,610 DEBUG [com.simplicite.util.engine.ObjectManager] SIMPLICITE|https://dev-sim:10423/forpro|/forpro|DCOREDB002|system|com.simplicite.util.engine.ObjectManager|update||Param: colonne fopIndividuCivilite valeur (M)
2020-03-19 09:08:13,610 DEBUG [com.simplicite.util.engine.ObjectManager] SIMPLICITE|https://dev-sim:10423/forpro|/forpro|DCOREDB002|system|com.simplicite.util.engine.ObjectManager|update||Param: colonne fopIndividuNir valeur (185122587878)
2020-03-19 09:08:13,610 DEBUG [com.simplicite.util.engine.ObjectManager] SIMPLICITE|https://dev-sim:10423/forpro|/forpro|DCOREDB002|system|com.simplicite.util.engine.ObjectManager|update||Param: colonne updated_by valeur (designer)
2020-03-19 09:08:13,610 DEBUG [com.simplicite.util.engine.ObjectManager] SIMPLICITE|https://dev-sim:10423/forpro|/forpro|DCOREDB002|system|com.simplicite.util.engine.ObjectManager|update||Param: colonne created_by valeur (designer)
2020-03-19 09:08:13,609 DEBUG [com.simplicite.util.engine.ObjectManager] SIMPLICITE|https://dev-sim:10423/forpro|/forpro|DCOREDB002|system|com.simplicite.util.engine.ObjectManager|update||Param: colonne updated_dt valeur (2020-03-19 09:08:13)
2020-03-19 09:08:13,609 DEBUG [com.simplicite.util.engine.ObjectManager] SIMPLICITE|https://dev-sim:10423/forpro|/forpro|DCOREDB002|system|com.simplicite.util.engine.ObjectManager|update||Param: colonne created_dt valeur (2020-03-19 09:08:13)
2020-03-19 09:08:13,609 DEBUG [com.simplicite.util.engine.ObjectManager] SIMPLICITE|https://dev-sim:10423/forpro|/forpro|DCOREDB002|system|com.simplicite.util.engine.ObjectManager|update||Param: colonne row_id valeur (9624)
2020-03-19 09:08:13,608 DEBUG [com.simplicite.util.engine.ObjectManager] SIMPLICITE|https://dev-sim:10423/forpro|/forpro|DCOREDB001|system|com.simplicite.util.engine.ObjectManager|update||Requête SQL: jdbc/simplicite: insert into CRB_FOP_INDIVIDU (row_id,created_dt,updated_dt,created_by,updated_by,FOP_INDIVIDU_NIR,FOP_INDIVIDU_CIVILITE,FOP_INDIVIDU_NOM_NAISSANCE,FOP_INDIVIDU_NOM_USAGE,FOP_INDIVIDU_PRENOM,FOP_INDIVIDU_IDENTITE,FOP_INDIVIDU_DT_NAISSANCE,FOP_INDIVIDU_PAYS_NAISSANCE,FOP_INDIVIDU_EMAIL,FOP_INDIVIDU_COMMUNE_NAISSANCE,FOP_INDIVIDU_ID_DE,FOP_INDIVIDU_CODE_INSEE_NAISSANCE,FOP_INDIVIDU_NIR_CERTIFIE,FOP_INDIVIDU_DT_MAJ_DE,FOP_INDIVIDU_ORIGINE) values (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,null,null,?,null,?)
2020-03-19 09:08:13,603 DEBUG [com.simplicite.util.engine.ObjectManager] SIMPLICITE|https://dev-sim:10423/forpro|/forpro|DCOREDB001|system|com.simplicite.util.engine.ObjectManager|update||Requête SQL: update m_rowid set rid_curval=9624 where rid_table='CRB_FOP_INDIVIDU.row_id' and rid_curval=9623
2020-03-19 09:08:13,600 DEBUG [com.simplicite.util.engine.ObjectManager] SIMPLICITE|https://dev-sim:10423/forpro|/forpro|DCOREDB001|system|com.simplicite.util.engine.ObjectManager|query||Requête SQL: select rid_curval from m_rowid where rid_table='CRB_FOP_INDIVIDU.row_id'
2020-03-19 09:08:13,576 DEBUG [com.simplicite.util.engine.ObjectManager] SIMPLICITE|https://dev-sim:10423/forpro|/forpro|DCOREDB002|system|com.simplicite.util.engine.ObjectManager|query||Param: colonne fopIndividuNir valeur (185122587878)
2020-03-19 09:08:13,576 DEBUG [com.simplicite.util.engine.ObjectManager] SIMPLICITE|https://dev-sim:10423/forpro|/forpro|DCOREDB001|system|com.simplicite.util.engine.ObjectManager|query||Requête SQL: jdbc/simplicite: select row_id from CRB_FOP_INDIVIDU where FOP_INDIVIDU_NIR=?
2020-03-19 09:08:13,569 DEBUG [com.simplicite.webapp.servlets.api.RESTServlet] SIMPLICITE|https://dev-sim:10423/forpro|/forpro|DCOREWS001|designer|com.simplicite.webapp.servlets.api.RESTServlet|post||Trace web services: Request(nkIbe07Cmp): Root: /forpro
    Location: /forpro/api/rest/CrbFopIndividu/
    Simple parameters:
     row_id = [0]
    Multiple parameters:
     fopIndividuIdentite = [TEST AVEC ÀCCENT TOTO]
     fopIndividuNirCertifie = [1]
     fopIndividuPrenom = [TOTO]
     fopIndividuCodeInseeNaissance = []
     fopIndividuNir = [185122587878]
     fopIndividuNomUsage = [TEST AVEC ÀCCENT]
     fopIndividuDtMajDe = []
     fopIndividuEmail = [toto@test.com]
     fopIndividuCivilite = [M]
     fopIndividuCommuneNaissance = [PARIS]
     fopIndividuDtNaissance = [1985-12-25]
     fopIndividuPaysNaissance = [000]
     fopIndividuOrigine = [OF]
     fopIndividuIdDe = []
     fopIndividuNomNaissance = [TEST AVEC ÀCCENT]
    Document parameters:
    Method: POST
    Content type: application/json
    Charset: UTF-8
    User agent: PostmanRuntime/7.6.0
    Session ID: 7424828D64514E322F40A953BC4D48C8
    Headers:
     content-length = 592
     cookie = JSESSIONID=7424828D64514E322F40A953BC4D48C8
     postman-token = cd1962e8-811d-4469-88dd-f6cbf5ee2b8b
     x-forwarded-for = 172.20.7.28
     accept = */*
     x-real-ip = 172.20.7.28
     authorization = Basic ZGVzaWduZXI6NmFjQFBNMzM=
     host = forpro.dev-sim.cr-bretagne.fr
     connection = upgrade
     content-type = application/json
     cache-control = no-cache
     accept-encoding = gzip, deflate
     user-agent = PostmanRuntime/7.6.0
    Body (JSON object): {"fopIndividuIdentite":"TEST AVEC ÀCCENT TOTO","fopIndividuNirCertifie":"1","fopIndividuPrenom":"TOTO","fopIndividuCodeInseeNaissance":"","fopIndividuNir":"185122587878","fopIndividuNomUsage":"TEST AVEC ÀCCENT","fopIndividuDtMajDe":"","fopIndividuEmail":"toto@test.com","fopIndividuCivilite":"M","fopIndividuCommuneNaissance":"PARIS","fopIndividuDtNaissance":"1985-12-25","fopIndividuPaysNaissance":"000","fopIndividuOrigine":"OF","fopIndividuIdDe":"","fopIndividuNomNaissance":"TEST AVEC ÀCCENT"}
2020-03-19 09:08:13,568 DEBUG [com.simplicite.webapp.servlets.api.RESTServlet] SIMPLICITE|https://dev-sim:10423/forpro|/forpro|DEBUG|system|com.simplicite.webapp.servlets.api.RESTServlet|post||Evénement: Scheme : [http]
    Port : [80]
    Hostname : [forpro.dev-sim.cr-bretagne.fr]
    Context path : [/forpro]
    Request URI : [/forpro/api/rest/CrbFopIndividu/]
    Request URL : [http://forpro.dev-sim.cr-bretagne.fr/forpro/api/rest/CrbFopIndividu/]
    Query string : [null]
    Full URL : [http://forpro.dev-sim.cr-bretagne.fr/forpro/api/rest/CrbFopIndividu/]
    Base URL : [http://forpro.dev-sim.cr-bretagne.fr/forpro]
    Method : [POST]
    Request encoding : [UTF-8]
    Request content type : [application/json]
    Request content length : [592]
    Remote address : [127.0.0.1]
    Remote host : [127.0.0.1]
    Session : [7424828D64514E322F40A953BC4D48C8]
    Cookies :
     JSESSIONID = [7424828D64514E322F40A953BC4D48C8]
    Headers :
     accept = [*/*]
     accept-encoding = [gzip, deflate]
     authorization = [Basic ZGVzaWduZXI6NmFjQFBNMzM=]
     cache-control = [no-cache]
     connection = [upgrade]
     content-length = [592]
     content-type = [application/json]
     cookie = [JSESSIONID=7424828D64514E322F40A953BC4D48C8]
     host = [forpro.dev-sim.cr-bretagne.fr]
     postman-token = [cd1962e8-811d-4469-88dd-f6cbf5ee2b8b]
     user-agent = [PostmanRuntime/7.6.0]
     x-forwarded-for = [172.20.7.28]
     x-real-ip = [172.20.7.28] 

Oui c’est un bug socle dans la réponse, l’objet est bien créé.
Il faut que le service prenne “data” comme réponse ou bien directement l’objet retourné, quelque chose comme :

JSONObject o = JSONObject(res);
JSONObject data = o.optJSONObject("data");
if (data==null) data = o;
res = data.toString();

Suivant le paramétrage de l’objet, le service de bas niveau JSONTool.get retourne plus ou moins d’information, il n’y a pas que les metadata dans un “get” complet :

{ data, meta, social, share, msgs }

ou directement data si l’objet est simple (pour être compatible avec des vieilles versions).

Vous devez avoir une différence au niveau de l’objet (social ou autre) ce qui explique la différence de comportement. L’action est bien chez nous pour rendre le code plus robuste à tous les cas.

Voilà, la modification est faite pour retourner l’item simple, ce sera poussé dans la journée.

Maintenant il faut voir s’il y a un besoin de pouvoir tout remonter par REST API.
A mon sens ça ne coute rien de le rendre paramétrable suivant la requête pour récupérer les meta + social + messages + treeview… dans la réponse et pas juste le tuple créé/modifié.

La question est plus globale, comment ouvre-t-on les metadata aux API, via REST, Ajax/json, XML SOAP…

Les APIs REST du endpoint /api/rest doivent ne renvoyer par défaut que les données, pas autre chose. C’est le principe de base du REST.

Mais je suis d’accord il faut qu’il soit possible de demander plus si on le souhaite en ajoutant explicitement des paramètres supplémentaires à l’URL.

C’est déjà le cas pour le GET:

il est possible de récupérer les metadata :


ou les deux (data et metadata) :

Merci! @guithel, tu me diras si ça marche?

Le problème est résolu, merci !