Jump to content
  • 0

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


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 post
Share on other sites

12 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 post
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 post
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 post
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 post
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 post
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 post
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 post
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 post
Share on other sites
  • 0

Là je ne vois pas… pourriez-vous m'envoyer votre base (en privé) pour que je puisse vérifier ?

Link to post
Share on other sites
  • 0

Top merci beaucoup !! Ça fonctionne parfaitement. 

Link to post
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 post
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 post
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...
  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...