Jump to content
  • 0

Récupérer des données d'un conteneur avec FileMaker Data API


EPI34
 Share

Question

Bonjour à tous,

Je souhaite récupérer les données d'un enregistrement sur un iPad grâce à Filemaker Data API. Pas de soucis pour l'ensemble des rubriques, à l'exception du conteneur. 

J'ai systématiquement le message d'erreur : {"messages":[{"message":"Request validation failed: Parameter (upload) is required","code":"10"}],"response":{}}

J'ai bien vu dans le Guide de l'API qu'un paramètre est nécessaire mais là, je vous avoue mon ignorance. 

Quelqu'un pourrait-il me préciser comment ajouter ce paramètre ?

Merci par avance.  

Capture d’écran 2020-05-24 à 12.14.06.png

Link to comment
Share on other sites

23 answers to this question

Recommended Posts

  • 0

Bonsoir,

Après avoir reçu le fichier en message privé, et après une analyse rapide du problème, pour cela j'ai rajouté la commande cURL --trace-ascii $$trace dans l'action Insérer depuis URL qui doit normalement récupérer l'image. Il s'avère qu'il y a une redirection temporaire des requêtes de votre serveur (et cela doit être dû à l'architecture de FileMaker Cloud), information que l'on voit en lisant le contenu de la variable $$trace 

Citation

0000: HTTP/1.1 302 Moved Temporarily.

Hors, comme je l'ai expliqué précédemment, la récupération d'un fichier via la Data API de FileMaker Server est sécurisé, le lien est entre autre temporaire. Hors comme il y a une redirection de la requête pour récupérer le fichier et que le système veut être sûr que vous êtes bien la personne destinataire dudit fichier il génère un cookie, mais voilà FileMaker ne gère pas les cookies comme un navigateur. Il faut donc dire deux choses à FileMaker dans la requête de récupération de fichier :

  • La première qu'il doit suivre les redirections, le fameux code HTTP 302, et pour cela il faut ajouter la commande cURL -L ;
  • La seconde qu'il doit stocker le cookie du premier serveur pour le retransmettre au second, et pour cela nous allons utiliser une variable temporaire (que je nomme ici $cookie) et utiliser la commande cURL --cookie-jar $cookie

Et nous obtenons donc le script suivant :

Gestion erreurs [ Oui ]
Définir variable [ $login ; Valeur: Base64EncodeRFC ( 4648 ; "LOGIN:MOTDEPASSE" ) ] 
Définir variable [ $url ; Valeur: "https://MONSERVEUR/fmi/data/vLatest/databases/MABASE/" ] 
# 
Définir variable [ $url.endpoint ; Valeur: $url & "sessions/" ] 
Définir variable [ $curl ; Valeur: "-X POST " & "-H " & Citation ( "Authorization: Basic " & $login ) & " " & "-H " & Citation ( "Content-type: application/json" ) & " " & "-d {}" ] 
Insérer depuis URL [ Sélectionner ; Avec boîte de dialogue: Non ; Cible: $resultat ; $url.endpoint ; Options cURL: $curl ] 
# 
Définir variable [ $token ; Valeur: JSONGetElement ( $resultat ; "response.token" ) ] 
# 
Définir variable [ $url.endpoint ; Valeur: $url & "layouts/MONMODELE/records" ] 
Définir variable [ $curl ; Valeur: "-X GET " & "-H " & Citation ( "Authorization: Bearer " & $token ) & " " & "-H " & Citation ( "Content-type: application/json" ) & " " & "-d {}" ] 
Insérer depuis URL [ Sélectionner ; Avec boîte de dialogue: Non ; Cible: $resultat ; $url.endpoint ; Options cURL: $curl ] 
# 
Définir variable [ $image ; Valeur: JSONGetElement ( $resultat ; "response.data[0].fieldData.image" ) ] 
# 
Nouvel enreg./requête
Insérer depuis URL [ Sélectionner ; Avec boîte de dialogue: Non ; Cible: TABLE::Conteneur ; $image ; Options cURL: "-L " & "--cookie-jar $cookie " & "--trace-ascii $$trace" ] 
# 
# Deconnexion
Définir variable [ $url.endpoint ; Valeur: $url & "sessions/" & $token ] 
Définir variable [ $curl ; Valeur: "-X DELETE " ] 
Insérer depuis URL [ Sélectionner ; Avec boîte de dialogue: Non ; Cible: $resultat ; $url.endpoint ; Options cURL: $curl ] 
# 
Fin de script [ Résultat de texte:    ] 

Les puristes me pardonnerons mes approximations…

Link to comment
Share on other sites

  • 1
il y a 11 minutes, Jérémie Gimenez a dit :

Salut @David Julot,

Dis, comment ton message est-il arrivé en "Solution", avec un beau cadre vert, un ombrage et tout ?? C'est bien joli, cette option secrète…   🧐

Bonjour @Jérémie Gimenez en cliquant sur la coche

201589261_Capturedcran2021-05-1313_25_17.png.d33edf3acefcfc885b909c8ae4a40470.png

 

il y a 12 minutes, gpto a dit :

merci David

concernant la 2eme, via un de nos serveurs, j'ai droit a un 503 dans tous les cas 🙂

Sinon elle est directement accessible depuis le dossier où est installé FileMaker Server : FileMaker Server>Documentation>Data API Documentation>index.html

Link to comment
Share on other sites

  • 0

Hello, 

Je me débats toujours avec mon problème.

A ce stade j'arrive à interroger mon FileMaker server et j'obtiens un JSON dans lequel je vois ma rubrique conteneur.

J'ai mis le contenu de cette rubrique dans une variable  : Définir variable [$upload ; Valeur : JSONGetElement ( $affaires ; "response.data["& $i & "]fieldData.Conteneur")].

$i est le décompte de ma boucle.

Cette variable est ensuite utilisée pour définir le paramètre de ma requête visant à uploader l'image du conteneur vers l'iPad.

Je pensais y arriver mais ... nouveau message d'erreur {"messages":[{"message":"Multipart: Boundary not found","code":"1630"}],"response":{}}

Quelqu'un a-t-il une idée ? Ou même un guide (anglais ou français) sur comment procéder ?

Merci par avance. 

Link to comment
Share on other sites

  • 0

Bonjour,

FileMaker Pro ou FileMaker Go  -> FileMaker Server

Pour envoyer un fichier contenu dans une rubrique conteneur vers la Data API de FileMaker Server vous devez utiliser les commandes cURL suivantes :

"-X POST " &
"-H " & Citation ( "Authorization: Bearer " & $token ) & " " &
"-H " & Citation ( "Content-type: multipart/form-data" ) & " " &
"-F " & Citation ( "upload=@$data;filename=" & ObtenirAttributConteneur ( local::image ; "filename" ) ) 

Où vous aurez mis au préalable le contenu de la rubrique conteneur dans la variable $data. Et on envoi le tout avec l'action Insérer depuis URL à l'URL suivante :
https://serveur
/fmi/data/vLatest/databases/nom-base/layouts/nom-modèle/records/id-enregistrement/containers/nom-rubrique/1

 

FileMaker Server  -> FileMaker Pro ou FileMaker Go

Si c'est pour récupérer le contenu d'une rubrique conteneur d'une base se trouvant sur FileMaker Server via la Data API, on récupère l'url du contenu de la rubrique conteneur et on utilise ensuite l'action Insérer depuis URL.

Link to comment
Share on other sites

  • 0

Merci beaucoup pour cette réponse. très précieuse.

Cela fonctionne dans le sens FileMaker Go  -> Data API. En revanche, dans le sens inverse, cela bloque.

Je récupère bien l’url de mon conteneur dans une variable.

Définir Variable ($data ; JSONGetElement ( $affaires ; "response.data["& $i & "]fieldData.Conteneur") )

Par contre je trouve le contenu de ma variable assez bizarre.

https://mon serveur/Streaming_SSL/Secure/2F8D5FBE482BCBCBE441A1D21B1CC0485E81042C9A4F57209BB0526C1F444B79.jpg?RCType=EmbeddedRCFileProcessor

Si je retouche manuellement ma variable en retirant « RCType=EmbeddedRCFileProcessor », je récupère bien un fichier JPEG dans mon conteneur mais celui-ci est inexploitable. Faut-il décrypter la variable ? Comment faire ?

Un détail qui doit certainement avoir son importance  mon application est hébergée sur FileMaker Cloud.

Encore merci pour le coup de main. 

Link to comment
Share on other sites

  • 0

Bonjour,

La valeur retournée dans la variable ne doit pas être modifiée, elle contient une URL temporaire liée à la requête de récupération de l'enregistrement, pour des raisons de sécurité.

Il suffit simplement de l'utiliser dans l'action Insérer depuis URL, comme dans le script suivant :

Gestion erreurs [ Oui ]
# 
Définir variable [ $login ; Valeur: Base64EncodeRFC ( 4648 ; "LOGIN:MOTDEPASSE" ) ] 
Définir variable [ $url ; Valeur: "https://MONSERVEUR/fmi/data/vLatest/databases/MABASE/" ] 
# 
# 	Authentification
Définir variable [ $url.endpoint ; Valeur: $url & "sessions" ] 
Définir variable [ $curl ; Valeur: "-X POST " & "-H " & Citation ( "Authorization: Basic " & $login ) & " " & "-H " & Citation ( "Content-type: application/json" ) & " " & "-d {}" " ] 
Insérer depuis URL [ Sélectionner ; Avec boîte de dialogue: Non ; Cible: $resultat ; $url.endpoint ; Vérifier les certificats SSL ; Options cURL: $curl ] 
#
# 	Récupération du token
Définir variable [ $token ; Valeur: JSONGetElement ( $resultat ; "response.token" ) ]  
# 
# 	Récupération d'un enregistrement
Définir variable [ $url.endpoint ; Valeur: $url & "layouts/MONMODELE/records" ] 
Définir variable [ $curl ; Valeur: "-X GET " & "-H " & Citation ( "Authorization: Bearer " & $token ) & " " & "-H " & Citation ( "Content-type: application/json" ) & " " & "-d {}" " ] 
Insérer depuis URL [ Sélectionner ; Avec boîte de dialogue: Non ; Cible: $resultat ; $url.endpoint ; Vérifier les certificats SSL ; Options cURL: $curl ] 
#
# 	Récupération de l'URL du fichier contenu dans le conteneur 'Image'
Définir variable [ $image ; Valeur: JSONGetElement ( $resultat ; "response.data[0].fieldData.image" ) ] 
# 	Ajout de l'enregistrement
Nouvel enreg./requête
Insérer depuis URL [ Sélectionner ; Avec boîte de dialogue: Non ; Cible: local::image ; $image ] 
# 
# 	Deconnexion
Définir variable [ $url.endpoint ; Valeur: $url & "sessions/" & $token ] 
Définir variable [ $curl ; Valeur: "-X DELETE " " ] 
Insérer depuis URL [ Sélectionner ; Avec boîte de dialogue: Non ; Cible: $resultat ; $url.endpoint ; Vérifier les certificats SSL ; Options cURL: $curl ] 

 

Link to comment
Share on other sites

  • 0

Désolé de revenir à la charge.

Avant tout, un grand merci pour ce script qui m'aide grandement et qui, j'en suis sûr, pourra servir à d'autres. 

Toutefois, cela ne fonctionne pas chez moi. Voici les soucis que je rencontre. 

Première erreur [1634] Une erreur de vérification du certificat s'est produite -> j'ai donc décoché la case "Vérification du certificat SSL".

Deuxième erreur  [10] Données requises manquantes à l'étape "Insérer depuis URL" qui est censée récupérer mon image. Là, je sèche.

Encore merci pour votre aide. Je ne désespère pas d'y arriver à un moment ou à un autre.🤪

Link to comment
Share on other sites

  • 0

Bonjour,

L'action Insérer depuis URL, comme toutes les actions débutant par Insérer, requiert la présence de la rubrique (dans mon cas local::image) sur le modèle au moment de l'insertion.

Le fait qu'il y ai une erreur lors de la vérification du certificat cela signifie que le certificat n'est pas valide. Utilisez-vous le certificat fournit en standard de FileMaker, si c'est le cas alors effectivement il n'est pas valide.

Link to comment
Share on other sites

  • 0

Merci de continuer à m'assister mais ça ne fonctionne toujours pas. 

La rubrique est bel et bien sur le modèle mais j'ai toujours le même message d'erreur. (cf première copie d'écran).

Lorsque je modifie ma variable $image (exemple ci-dessous) et que je retire la partie RCType=EmbeddedRCFileprocessor, je récupère bien un fichier mais inexploitable.

Le 31/05/2020 à 22:18, EPI34 a dit :

https://mon serveur/Streaming_SSL/Secure/2F8D5FBE482BCBCBE441A1D21B1CC0485E81042C9A4F57209BB0526C1F444B79.jpg?RCType=EmbeddedRCFileProcessor

j'ai bien noté qu'il ne fallait pas modifier la variable mais ça m'interpelle que dans ce cas cela fonctionne ... plus ou moins.

 774593641_Capturedcran2020-06-0215_38_08.thumb.png.1d1c7d9513879cd7999dfac02eb7ef66.png

Link to comment
Share on other sites

  • 0
Le 03/06/2020 à 23:08, EPI34 a dit :

Top merci beaucoup !! Ça fonctionne parfaitement. 

Et donc, c'était ... On veut savoir 😉 ah ah ah

Link to comment
Share on other sites

  • 0
Le 02/06/2020 à 09:18, David Julot a dit :

L'action Insérer depuis URL, comme toutes les actions débutant par Insérer, requiert la présence de la rubrique (dans mon cas local::image) sur le modèle au moment de l'insertion.

mais... et les variables alors ?

Insérer dans une variable avant de définir rubrique évite cette dépendance au modèle.

Link to comment
Share on other sites

  • 0
Le 01/06/2020 à 12:37, David Julot a dit :

Bonjour,

La valeur retournée dans la variable ne doit pas être modifiée, elle contient une URL temporaire liée à la requête de récupération de l'enregistrement, pour des raisons de sécurité.

Il suffit simplement de l'utiliser dans l'action Insérer depuis URL, comme dans le script suivant :


Gestion erreurs [ Oui ]
# 
Définir variable [ $login ; Valeur: Base64EncodeRFC ( 4648 ; "LOGIN:MOTDEPASSE" ) ] 
Définir variable [ $url ; Valeur: "https://MONSERVEUR/fmi/data/vLatest/databases/MABASE/" ] 
# 
# 	Authentification
Définir variable [ $url.endpoint ; Valeur: $url & "sessions" ] 
Définir variable [ $curl ; Valeur: "-X POST " & "-H " & Citation ( "Authorization: Basic " & $login ) & " " & "-H " & Citation ( "Content-type: application/json" ) & " " & "-d {}" " ] 
Insérer depuis URL [ Sélectionner ; Avec boîte de dialogue: Non ; Cible: $resultat ; $url.endpoint ; Vérifier les certificats SSL ; Options cURL: $curl ] 
#
# 	Récupération du token
Définir variable [ $token ; Valeur: JSONGetElement ( $resultat ; "response.token" ) ]  
# 
# 	Récupération d'un enregistrement
Définir variable [ $url.endpoint ; Valeur: $url & "layouts/MONMODELE/records" ] 
Définir variable [ $curl ; Valeur: "-X GET " & "-H " & Citation ( "Authorization: Bearer " & $token ) & " " & "-H " & Citation ( "Content-type: application/json" ) & " " & "-d {}" " ] 
Insérer depuis URL [ Sélectionner ; Avec boîte de dialogue: Non ; Cible: $resultat ; $url.endpoint ; Vérifier les certificats SSL ; Options cURL: $curl ] 
#
# 	Récupération de l'URL du fichier contenu dans le conteneur 'Image'
Définir variable [ $image ; Valeur: JSONGetElement ( $resultat ; "response.data[0].fieldData.image" ) ] 
# 	Ajout de l'enregistrement
Nouvel enreg./requête
Insérer depuis URL [ Sélectionner ; Avec boîte de dialogue: Non ; Cible: local::image ; $image ] 
# 
# 	Deconnexion
Définir variable [ $url.endpoint ; Valeur: $url & "sessions/" & $token ] 
Définir variable [ $curl ; Valeur: "-X DELETE " " ] 
Insérer depuis URL [ Sélectionner ; Avec boîte de dialogue: Non ; Cible: $resultat ; $url.endpoint ; Vérifier les certificats SSL ; Options cURL: $curl ] 

 

Bonjour David et merci pour ces détails.

Je bloquais sur deux points par rapport à la notice filemaker :

- Au niveau de l'encodage du login,  pourquoi mets tu la valeur 4648 ? pourquoi séparez vous par deux points alors que sur la notice c'est une virgule (et en base64) ?

- Au niveau de l'autorisation, vous rajoutez le mot "basic". c'est inscrit quelque part sur la notice ?

Je vous demande ceci parce que c'est ces deux paramètres qui bloquais. J'aurais aimé savoir comment j'aurais pu trouver seul...

merci en tous cas

 

Olivier

Link to comment
Share on other sites

  • 0

Bonjour Olivier,

  • L'encodage 4648 utilisé dans la fonction Base64EncodeRFC permet d'éviter d'ajouter des retours à la ligne intempestifs (cf: https://help.claris.com/fr/pro-help/content/base64encoderfc.html?cshid=HID_Calc_Base64EncodeRFC ).
  • Concernant l'authentification à la DATA API :
    • Dans la première requête on doit envoyer le compte et le mot de passe séparés par : et encodé en base64. Pour indiquer à l'API Rest que l'on envoie un compte et son mot de passe on le précède du mot Basic comme indiqué dans la documentation :
  • Ensuite, pour les appels suivants, comme on transmet le token et non plus le compte / mot de passe, on fait précédé le token par le mot Bearer comme préciser dans la documentation : « Provide a session token as 'Bearer sessionToken'. »

N'oubliez pas que la documentation de la DATA API se trouve sur votre serveur à l'adresse suivante https://votreserveur/fmi/data/apidoc

Link to comment
Share on other sites

  • 0

salut

topic tres interessant 🙂

@David le lien vers la doc API ne fonctionne pas sur nos serveurs, est-ce la meme docs que sur le site Claris?

bonne journée

 

Link to comment
Share on other sites

  • 0

Il existe deux documentations concernant la DATA API de FileMaker Server :

La première documentation explique le fonctionnement de l'API, la seconde contient la documentation sur les méthodes et fonctions disponibles. Elles sont complémentaires.

Link to comment
Share on other sites

  • 0
Le 03/06/2020 à 22:56, David Julot a dit :

Bonsoir,

Après avoir…

Salut @David Julot,

Dis, comment ton message est-il arrivé en "Solution", avec un beau cadre vert, un ombrage et tout ?? C'est bien joli, cette option secrète…   🧐

Link to comment
Share on other sites

  • 0

merci David

concernant la 2eme, via un de nos serveurs, j'ai droit a un 503 dans tous les cas 🙂

Link to comment
Share on other sites

  • 0

merci David 🙂

Concernant la coche tu dois sûrement avoir des supers pouvoirs lol, nous on l'a pas 😉

Link to comment
Share on other sites

  • 0
il y a une heure, gpto a dit :

Concernant la coche tu dois sûrement avoir des supers pouvoirs lol, nous on l'a pas 😉

Je confirme : même sur les sujets que j'ai lancé moi-même, je n'ai pas cette coche.

NB : quand on vote pour un message (avec les flèches haut et bas), ça déplace le message tout en haut, et on perd l'ordre de la conversation 🤨

Link to comment
Share on other sites

  • 0
il y a 57 minutes, Jérémie Gimenez a dit :

Je confirme : même sur les sujets que j'ai lancé moi-même, je n'ai pas cette coche.

NB : quand on vote pour un message (avec les flèches haut et bas), ça déplace le message tout en haut, et on perd l'ordre de la conversation 🤨

Bon ben je crois qu'en tant que moderator j'ai des options suplémentaires…

Link to comment
Share on other sites

  • 0

Hello David et les autres aussi,

Si ma réponse à la demande de Token est ça : {"response":{}}

Alors que tout est ok avec Postman, quoi pourrais-je faire faux dans la transposition ??

Merci de votre compassion 😅

JLuc

Edited by jilc
Trouvé par la Claris Community ! l'URL malgré plusieurs relecture était mal libellée !!
Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
 Share

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...