2017-03-16 1 views
1

J'ai une application logique simple. Le déclencheur est sur le nouveau fichier (ex: Dropbox, OneNote, etc.) Je veux passer le nom de fichier et le fileContent à une application API (Web Api). Mais j'ai eu une erreur, ou pire le contenu est nul une fois dans l'API!Comment transmettre un fichier à une API à partir de l'application Azure Logic

L'API est en C#.

Comment passez-vous un fichier (ex: pdf, png) à et API de Logic App

MISE À JOUR:

Dans Logic App ici mon code d'action:

"UploadNewFile": { 
"inputs": { 
    "method": "post", 
    "queries": { 
     "filedata": { 
      "fileName":"@triggerOutputs()['headers']['x-ms-file-name']", 
      "fileContent":"@base64(triggerBody())" 
     } 
    }, 
    "uri": "https://smartuseconnapiapp.azurewebsites.net/api/UploadNewFile" 
}, 
"metadata": { 
    "apiDefinitionUrl": "https://smartuseconnapiapp.azurewebsites.net/swagger/docs/v1", 
    "swaggerSource": "website" 
}, 
"runAfter": {}, 
"type": "Http" 

}

Dans mon application API, si la fonction est déclarée comme ceci filedata est null

[Route("api/UploadNewFile")] 
[HttpPost] 
public HttpStatusCode UploadNewFile([FromBody] string filedata) 

Et si je n'ajoute pas le [FromBody] comme ça j'ai eu une erreur.

[Route("api/UploadNewFile")] 
[HttpPost] 
public HttpStatusCode UploadNewFile(string filedata) 

enter image description here

Répondre

1

J'ai trouvé comment y arriver.

Je devais passer le nom de fichier dans la chaîne de requête et le fichier dans le corps de la requête HTTP. Aujourd'hui, il n'est pas possible de le faire en utilisant la vue de conception, vous devez donc aller en mode Code.

Dans le code App Logic

"queries": { 
    "fileName": "@{triggerOutputs()['headers']['x-ms-file-name']}" 
    }, 
"body": "@triggerBody()" 

Dans l'API Code App

public HttpResponseMessage UploadNewFile([FromUri] string fileName) 
{ 
    var filebytes = Request.Content.ReadAsByteArrayAsync(); 

    [...] 
} 

Une explication plus détaillée se trouve dans ce billet de blog: http://www.frankysnotes.com/2017/03/passing-file-from-azure-logic-app-to.html

2

Oui vous pouvez envoyer du contenu binaire à votre propre API dans quelques méthodes différentes. Nos actions out-of-the-box utilisent également cela.

Si vous voulez envoyer le contenu binaire comme le corps de la requête Par exemple, une demande sortant de l'App Logic pourrait avoir un contenu binaire et un en-tête de type de contenu de image/png

Dans ce cas, les fanfaronnades pour le corps de votre demande doit être binaire - ou:

{ "name": "body", 
    "In": "body", 
    "Schema": { 
    "Type":"string", 
    "Format": "binary" 
    } ... } 

cela devrait dire au concepteur que le corps de la requête est contenu binaire. Si une action précédente ou le déclencheur avaient des données binaires (par exemple: « Lorsqu'un fichier est ajouté à FTP ») et que vous avez utilisé cette sortie dans le corps, il apparaîtra dans vos entrées API personnalisés comme:

"Body": "@triggerBody()" 

Avis il n'y a aucun { et } sur l'expression (interpolations de chaîne) qui convertirait le contenu binaire en chaîne. Cela envoie une requête sortante au connecteur avec le contenu binaire - votre contrôleur doit donc accepter le contenu binaire et respecter l'en-tête de type de contenu si nécessaire.

Si vous voulez envoyer du contenu binaire dans une requête JSON Parfois, vous ne voulez pas envoyer binaire comme la demande complète, mais comme une propriété d'un autre objet. Par exemple, un objet personne peut avoir un nom, une adresse et une image de profil dans le corps de la requête. Dans ce cas, nous vous recommandons d'envoyer le contenu binaire en base64 encodé. Vous pouvez utiliser "format": "base64" dans swagger pour décrire une propriété comme ceci. Dans la vue de code devrait ressembler à quelque chose comme:

"Body": { 
"Name": "@triggerBody()['Name']", 
"ProfilePic": "@base64(body('Dropbox'))" 
} 

Espérons que cela aide. Faites-moi savoir si vous avez des questions - voici également un article on how logic apps preserves content-types.

+0

J'ai essayé ... mais ça ne marche pas. public HttpStatusCode UploadNewFile ([FromBody] string filedata), puis filedata est null. Si je ne mets pas le [FromBody], j'ai une erreur. vérifier la version mise à jour de ma question. –

+0

Vous a envoyé un e-mail - laissez-moi savoir sur ce fil ce que vous trouvez – jeffhollan

+0

Oui, il l'a fait. J'ajoute une nouvelle réponse pour partager un aperçu de la solution et en indiquer une plus détaillée sur un article de blog: http://www.frankysnotes.com/2017/03/passing-file-from-azure-logic-app- to.html –