etalab / doc.data.gouv.fr

Documentation du site data.gouv.fr.
https://doc.data.gouv.fr
MIT License
7 stars 53 forks source link

Problème appel endpoint /datasets/{dataset} #118

Open stevenkalwant opened 1 year ago

stevenkalwant commented 1 year ago

Bonjour,

Je rencontre un souci de parsing quand j'appelle l'endpoint /datasets/{dataset} dans mon application java .

En effet j'ai l'erreur suivante :

org.springframework.web.client.RestClientException: Error while extracting response for type [class fr.gouv.stopc.datagouv.model.Dataset] and content type [application/json]; nested exception is org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Could not resolve type id 'User' as a subtype offr.gouv.stopc.datagouv.model.UserReference: known type ids = [DatasetReference, OrganizationReference, ReuseReference, UserReference] (for POJO property 'owner'); nested exception is com.fasterxml.jackson.databind.exc.InvalidTypeIdException: Could not resolve type id 'User' as a subtype offr.gouv.stopc.datagouv.model.UserReference: known type ids = [DatasetReference, OrganizationReference, ReuseReference, UserReference] (for POJO property 'owner') at [Source: (org.springframework.util.StreamUtils$NonClosingInputStream); line: 1, column: 506] (through reference chain: fr.gouv.stopc.datagouv.model.Dataset["owner"])

En faisant l'appel depuis postman je remarque que l'attribut "class" du champ "owner" est "User" au lieu de "UserReference"

"owner": { "avatar": null, "avatar_thumbnail": null, "class": "User", "first_name": "xxxxx", "id": "xxxxx", "last_name": "xxxxx", "page": "xxxxxx", "slug": "xxxxx", "uri": "xxxxxxx" },

Est-ce que vous sauriez si c'est normal ? Merci beaucoup !

maudetes commented 1 year ago

Bonjour,

Parlez-vous d'un appel POST pour la modification d'un jeu de données? Ou d'un GET en lecture seulement? Dans le cas d'une modification, vous pouvez regarder du côté de cet exemple https://doc.data.gouv.fr/api/dataset-workflow/#mise-%C3%A0-jour-des-metadonn%C3%A9es-de-la-fiche. Vous n'avez pas besoin de spécifier l'ensemble des champs du modèle, uniquement ceux que vous souhaitez modifier. Les références à des modèles extérieurs (user, orga) ne seront pas modifiées.

Pour le cas d'une incompréhension sur le retour de l'api, en effet les modèles de type XXReference ont un champ class qui vaut le nom du modèle référencé, qui est donc User ici. C'est le cas pour l'ensemble des modèles de type référence, OrganizationReference, DatasetReference, etc.

stevenkalwant commented 1 year ago

Bonjour,

Oui j'ai oublié de préciser qu'il s'agit d'un appel GET sur /datasets/{dataset} Dans le JSON de retour j'ai "User" comme valeur pour la classe du champ "owner" au lieu de "UserReference" comme indiqué sur la documentation de l'API

openapi

maudetes commented 1 year ago

Bonjour, Le champ owner est bien de type UserReference, or un champ UserReference a plusieurs attributs, dont les champs id et class (qui lui viennent de BaseReference), avec class qui pointe vers la classe référencée, ici User. Mais le retour est bien un UserReference. Exemple de retour sur https://www.data.gouv.fr/api/1/datasets/metadonnee-des-photos-aeriennes-anciennes-de-lign/: image

Cela correspond bien à la définition de UserReference: image

stevenkalwant commented 1 year ago

Bonjour,

Les champs retournés correspondent bien aux champs attendus pour l'objet UserReference mais pour les champs id et class, est-ce que la valeur ne devrait pas être UserReference au lieu de User ? D'après l'erreur que j'ai en faisant un appel depuis mon code java : com.fasterxml.jackson.databind.exc.InvalidTypeIdException: Could not resolve type id 'User' as a subtype of fr.gouv.stopc.datagouv.model.UserReference: known type ids = [DatasetReference, OrganizationReference, ReuseReference, UserReference] (for POJO property 'owner')