I can't get this to work in flow. I get bad request. Below is the 400 status code and the header and body I'm sending. { "code": "InvalidObject", "message": "request object is invalid", "errors": [ { "code": "MissingRequiredField", "message": "The RecordId field is required.", "resource": "request", "field": "RecordId" }, { "code": "MissingRequiredField", "message": "The RecordType field is required.", "resource": "request", "field": "RecordType" }, { "code": "MissingRequiredField", "message": "The Title field is required.", "resource": "request", "field": "Title" }, { "code": "MissingRequiredField", "message": "File or Url is required.", "resource": "request", "field": "File" } ] } POST /v4_6_release/apis/3.0/system/documents HTTP/1.1 Content-Type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW Content-Disposition: form-data; name="recordid" 81014 ------WebKitFormBoundary7MA4YWxkTrZu0gW-- Content-Disposition: form-data; name="recordType" Opportunity ------WebKitFormBoundary7MA4YWxkTrZu0gW-- Content-Disposition: form-data; name="title" Test document ------WebKitFormBoundary7MA4YWxkTrZu0gW-- Content-Disposition: form-data; name="url" https:/********************/sites/*************s/************es/SI-160829.pdf ------WebKitFormBoundary7MA4YWxkTrZu0gW--
Solved! Go to Solution.
@gbuhreand @SvenG Rest assured there is a way of doing this.
If you want to post multipart form data with binary content via the HTTP connector you must format the body of the request in a certain way.
What they don't tell you (except in an obscure section of the Azure Logic Apps documentation) is that the HTTP action actually deserialises JSON input and converts it to a multipart string value.
Leave the Headers parameter blank. In this example the API documentation says this:
POST /api/gateway.php/sample/v1/employees/1/files/ HTTP/1.0
Host: api.bamboohr.com
Content-Type: multipart/form-data; boundary=----BambooHR-MultiPart-Mime-Boundary----
Content-Length: 520
------BambooHR-MultiPart-Mime-Boundary----
Content-Disposition: form-data; name="category"
112
------BambooHR-MultiPart-Mime-Boundary----
Content-Disposition: form-data; name="fileName"
readme.txt
------BambooHR-MultiPart-Mime-Boundary----
Content-Disposition: form-data; name="share"
yes
------BambooHR-MultiPart-Mime-Boundary----
Content-Disposition: form-data; name="file"; filename="readme.txt"
Content-Type: text/plain
This is a sample text file.
------BambooHR-MultiPart-Mime-Boundary------
But I want to post a binary file instead of "This is a sample text file", so while the plain text above works as the body of the HTTP action when the file content is only text, for binary to work I make the HTTP body like this.
{
"$content-type": "multipart/form-data",
"$multipart": [
{
"body": "18",
"headers": {
"Content-Disposition": "form-data; name=\"category\""
}
},
{
"body": "@{outputs('Convert_file')['headers']['x-ms-file-name']}",
"headers": {
"Content-Disposition": "form-data; name=\"fileName\""
}
},
{
"body": "yes",
"headers": {
"Content-Disposition": "form-data; name=\"share\""
}
},
{
"body": {
"$content": "@{body('Convert_file')}",
"$content-type": "application/pdf"
},
"headers": {
"Content-Disposition": "form-data; name=\"file\"; filename=\"@{outputs('Convert_file')['headers']['x-ms-file-name']}\""
}
}
]
}
In my example the dynamic content is all from a OneDrive PDF file conversion process, but you can adjust your Flow to suit your needs
Could you please provide a detailed screenshot of your Flow, and any error messages it receives so that we may better assist you? Thanks.
It says request object is invalid
I have updated this request with screen shots
@gbuhre wrote:I have updated this request with screen shots
Sorry. with the URLs blacked out, without expanding the steps there isn't much we can help with, as we have no idea which parameters you're parsing in and/or which fields you're trying to access. Expanding the steps and only blacking out what you absolutely must is preferred. Example:
My guess is that the URI you're parsing in, is likely in the incorrect format. A simple way to check if your formatting is correct is copying the URI path from your Flow's run error message, and pasting it into your browser. If it runs and returns the data as expected, your path is okay... my guess is that it won't.
A 400 error is almost always a path or API issue, which means that other than the path, you may be utilizing a POST request when the API is expecting a GET request, or that you may be referencing the wrong part of the API. Again, I am unsure without seeing the expanded steps.
If this reply has answered your question or solved your issue, please mark this question as answered. Answered questions helps users in the future who may have the same issue or question quickly find a resolution via search. If you liked my response, please consider giving it a thumbs up. THANKS!
Here's the Post request without the URL's balcked out. All I'm trying to do is a send a PDF document to my CRM tool.
I got it to work but now I'm having issues view the PDF file. I get an error when I try and open up the PDF about a decoding issue.
I'm taking a PDF file from sharepoint and trying to save it to ConnectWise our CRM tool. When I try and open the file from the CRM tool it says the files is damaged and could not be repaird. I get a 201 when I submit. Let me know if you need any other screen shots.
1. If you download both the original source PDF and the Flow->HTTP created PDF, are they the same filesize?
2. Do you have access to Acrobat DC or the older Acrobat PRO? Sometimes they are more forgiving with opening different PDF file constructs. If you can get the copied file open in one of those apps, perhaps it may shed some light on why Acrobat Reader can't handle the copied file.
PDFs can be tricky. It could be a limitation of the CRM endpoint, too. If Flow is passing the file content succesfully and all required properties, that's what I would suspect is the case.
If I submit the file via postman it works great no issues. I if I do the same file from Flow I can't open the file.
It has something to do with encoding. I need to send the pdf using To using the ISO 8859-1 encoding type of 28591? is this possiable?
So little more testing and it's defiantly something with how flow is processing the attachment. If I send the same attachment via Postman it works great. If I take that same file and code and try using flow it says successful but can never open up the file. The two screen shots are from the same file but the encoding is difference one is from flow one is from Postman.
@gbuhreDid you ever solve this? I'm having the same challenge
No still an open issue
Same issue here. Trying to POST a PDF file via plain HTTP but no success. It's really weird. No one knows a solution...
@gbuhreand @SvenG Rest assured there is a way of doing this.
If you want to post multipart form data with binary content via the HTTP connector you must format the body of the request in a certain way.
What they don't tell you (except in an obscure section of the Azure Logic Apps documentation) is that the HTTP action actually deserialises JSON input and converts it to a multipart string value.
Leave the Headers parameter blank. In this example the API documentation says this:
POST /api/gateway.php/sample/v1/employees/1/files/ HTTP/1.0
Host: api.bamboohr.com
Content-Type: multipart/form-data; boundary=----BambooHR-MultiPart-Mime-Boundary----
Content-Length: 520
------BambooHR-MultiPart-Mime-Boundary----
Content-Disposition: form-data; name="category"
112
------BambooHR-MultiPart-Mime-Boundary----
Content-Disposition: form-data; name="fileName"
readme.txt
------BambooHR-MultiPart-Mime-Boundary----
Content-Disposition: form-data; name="share"
yes
------BambooHR-MultiPart-Mime-Boundary----
Content-Disposition: form-data; name="file"; filename="readme.txt"
Content-Type: text/plain
This is a sample text file.
------BambooHR-MultiPart-Mime-Boundary------
But I want to post a binary file instead of "This is a sample text file", so while the plain text above works as the body of the HTTP action when the file content is only text, for binary to work I make the HTTP body like this.
{
"$content-type": "multipart/form-data",
"$multipart": [
{
"body": "18",
"headers": {
"Content-Disposition": "form-data; name=\"category\""
}
},
{
"body": "@{outputs('Convert_file')['headers']['x-ms-file-name']}",
"headers": {
"Content-Disposition": "form-data; name=\"fileName\""
}
},
{
"body": "yes",
"headers": {
"Content-Disposition": "form-data; name=\"share\""
}
},
{
"body": {
"$content": "@{body('Convert_file')}",
"$content-type": "application/pdf"
},
"headers": {
"Content-Disposition": "form-data; name=\"file\"; filename=\"@{outputs('Convert_file')['headers']['x-ms-file-name']}\""
}
}
]
}
In my example the dynamic content is all from a OneDrive PDF file conversion process, but you can adjust your Flow to suit your needs
I will give this a try as soon as I can. I will update everyone once I do.
Thanks,
I was able to get it working with the right json syntax. It's really tricky and hard to find. I also created my own API connector and can use it across my Flows.
With the help of swagger and Open API I created a custom connector to the API I use. So now it's working like a charm.
I only can encourage everyone to create a custom connector and use the "swagger editor" switch on top. Now it should be much easier to create the connector with the Open API spec.
Good Luck!
Sven
I will post my swagger spec as follows. I'm connecting to lexoffice API.
swagger: '2.0'
info: {title: lexoffice API, description: 'lexoffice API https://developers.lexoffice.io/',
version: '1.0'}
host: api.lexoffice.io
basePath: /v1/
schemes: [https]
consumes: []
produces: []
paths:
/files:
post:
responses:
default: {description: default}
summary: Upload a file
operationId: FileUpload
description: https://developers.lexoffice.io/docs/#files-endpoint-upload-a-file
consumes: [multipart/form-data]
produces: [application/json]
parameters:
- {name: type, type: string, default: voucher, description: document type, required: true,
in: formData}
- {name: file, in: formData, required: true, type: file, x-ms-summary: File
Content}
definitions: {}
parameters: {}
responses: {}
securityDefinitions:
API-Schlüssel: {type: apiKey, in: header, name: Authorization}
tags: []
security:
- API-Schlüssel: []
Please keep in mind that MS Flow currently only support Open API v2.0 - That's a bit problematic with some authentication types. However, I even got it working with Bearer auth - the parameter value for the Auth key just must be in format "Bearer 1234" - if 1234 is your key.
Hello,
I'm working on the exact same thing you are doing.
Except I am using gis cloud custom connector. I can easily perform all other calls like read, export, delete.
The writing part is different because it requires this format you are working with - multi part form http post.
I'll be using the JSON format mentioned by @WillPage
I'll update when I have solved it for gis cloud at least.