Hi,
i am consuming an API, where i need to upload on document(instream).
for uploading, i am running Upload mutation of GraphQL so using multipart/form-data.
But getting few errors:
Error 1: Multipart field missing 'Operation'
Error 2: Misordered multipart fields; files should follow 'map'.
Sample Code :
procedure UploadFile(UploadStream: InStream)
var
TempBlob: Codeunit "Temp Blob";
PayloadOutStream: OutStream;
PayloadInStream: InStream;
CR: Char;
LF: Char;
NewLine: Text;
Content: HttpContent;
ContentHeaders: HttpHeaders;
Client: HttpClient;
Request: HttpRequestMessage;
Response: HttpResponseMessage;
OutputResultJson: Text;
begin
CR := 13;
LF := 10;
NewLine += '' + CR + LF;
Content.GetHeaders(ContentHeaders);
ContentHeaders.Clear();
ContentHeaders.Add('Content-Type', 'multipart/form-data;boundary=boundary');
TempBlob.CreateOutStream(PayloadOutStream);
PayloadOutStream.WriteText('--boundary' + NewLine);
// key1 value1
PayloadOutStream.WriteText('Content-Disposition: form-data; name="operations"' + NewLine);
PayloadOutStream.WriteText(NewLine);
PayloadOutStream.WriteText(' {"query": "mutation($file: Upload!){\n upload(input:{ file: $file}){\n uniqueId\n message\n code\n }\n}"}' + NewLine);
PayloadOutStream.WriteText('--boundary' + NewLine);
// key2 value2
PayloadOutStream.WriteText('Content-Disposition: form-data; name="map"' + NewLine);
PayloadOutStream.WriteText(NewLine);
PayloadOutStream.WriteText('{"0":["variables.file"]}' + NewLine);
PayloadOutStream.WriteText('Content-Type: application/octet-stream' + NewLine);
PayloadOutStream.WriteText(NewLine);
// Copy all bytes from the uploaded file to the stream.
CopyStream(PayloadOutStream, UploadStream);
PayloadOutStream.WriteText(NewLine);
PayloadOutStream.WriteText('--boundary');
// Copy all bytes from the write stream to a read stream.
Tem PayloadOutStream.WriteText('--boundary' + NewLine);
// file1
PayloadOutStream.WriteText('Content-Disposition: form-data; name="0"; fileName="Test.pdf"' + NewLine);
PpBlob.CreateInStream(PayloadInStream);
PayloadInStream.ReadText(OutputResultJson);
// Write all bytes from the request body stream.
Content.WriteFrom(PayloadInStream);
Request.Content := Content;
Request.SetRequestUri('https://SampleAPIUrl.com/');
Request.Method := 'POST';
Client.Send(Request, Response);
if not Response.IsSuccessStatusCode() then
Message(Response.ReasonPhrase + '\Error Code : ' + format(Response.HttpStatusCode)); //RV
Response.Content().ReadAs(OutputResultJson);
Message(OutputResultJson);
end;