HTTPRequest от NAV C/AL — добавленный BLOB не распознается URL-адресом файлового хранилища
Я пытаюсь отправить файл PDF, сгенерированный отчетом NAV (MS Dynamics NAV 2018), через httprequest, сделанный в C/AL. Ответ представляет собой JSON, содержащий UUID, который мне нужно прочитать для более поздних целей. Что бы я ни пытался при построении запроса, хранилище не находит мой прикрепленный файл и возвращает "ERROR:MISSING_FILE". К сожалению, я не очень хорошо разбираюсь ни в DotNet Automation, ни в Webrequests, так что до этого момента мне приходилось много проб и ошибок.
Это мой код:
переменные
SalesShipmentHeader Record Sales Shipment Header
locFile File
locFile2 File
fileName Text 200
txt Text
ResponseHeaders DotNet System.Collections.Specialized.NameValueCollection.'System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'
HttpStatusCode DotNet System.Net.HttpStatusCode.'System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'
HttpWebRequestMgt Codeunit Http Web Request Mgt.
FileManagement Codeunit File Management
TempBlob Record TempBlob
TempJSONBuffer Record JSON Buffer
ResponseJsonText Text
NumRead Integer
InStr InStream
OutStr OutStream
Код
// make temp file and remember path
locFile.CREATETEMPFILE;
fileName := locFile.NAME;
locFile.CLOSE;
SalesShipmentHeader.SETFILTER("No.",DocNo);
IF SalesShipmentHeader.FINDFIRST THEN BEGIN
locReport.SETTABLEVIEW(SalesShipmentHeader);
IF locReport.SAVEASPDF(fileName) THEN BEGIN
// check file and build request
IF NOT locFile2.OPEN(fileName) THEN
ERROR('File could not be opened');
CLEAR(HttpWebRequestMgt);
HttpWebRequestMgt.Initialize(url);
HttpWebRequestMgt.DisableUI;
HttpWebRequestMgt.SetMethod('POST');
HttpWebRequestMgt.SetContentType('multipart/form-data; boundary=--123456789');
HttpWebRequestMgt.SetContentLength(locFile2.LEN);
HttpWebRequestMgt.SetUserAgent('Dynamics NAV 2018 Client');
HttpWebRequestMgt.SetReturnType('application/json');
HttpWebRequestMgt.AddSecurityProtocolTls12;
HttpWebRequestMgt.AddHeader('Accept-Encoding','gzip, deflate, br');
FileManagement.BLOBImportFromServerFile(TempBlob,fileName);
HttpWebRequestMgt.AddBodyBlob(TempBlob);
locFile2.CLOSE();
CLEAR(TempBlob);
HttpWebRequestMgt.CreateInstream(InStr); //Initialize
IF NOT HttpWebRequestMgt.GetResponse(InStr, HttpStatusCode, ResponseHeaders) THEN
ERROR(GETLASTERRORTEXT);
//CheckStatusCode
//...
//process JSON
CLEAR(ResponseJsonText);
WHILE NOT InStr.EOS() DO BEGIN
NumRead := InStr.READTEXT(txt, 100);
IF NumRead > 0 THEN
ResponseJsonText := ResponseJsonText + txt;
END;
MESSAGE(ResponseJsonText);
// DELETE FILE AFTER UPLOAD
ERASE(fileName);
EXIT(TRUE)
END ELSE
EXIT(FALSE);
END;
EXIT(FALSE)
Я могу успешно сделать запрос через приложение почтальона:Почтальон Скриншот 1 Почтальон Скриншот 2
Что я упускаю?
1 ответ
Вы пытаетесь отправить пустой файл - это может быть причиной. Попробуйте отправить файл с содержимым.