[Gelöst] PDF im BODY eines HTTP Requests senden

19. Juli 2022 09:32

Hallo zusammen,

ich sitze in den letzten Tage an einer Aufgabe, die ich bisher alleine nicht gelöst bekomme, daher mein Ersuchen nach Hilfe :-)

Derzeit entwickle ich eine Schnittstelle aus NAV an ein Telemetriksystem. Dabei erstelle ich XMLs und sende diese an einen Webservice, das funktioniert so weit alles. Die Technik, die ich dazu nutze, habe ich mir hier abgeschaut.

In einem zweiten Schritt möchte ich einen Anhang (Lieferschein als PDF - aus einem NAV Report erstellt) an eine .../file_storage/upload_file.php?... URL senden, die Methode muss dabei 'POST' sein. Auch bis hierhin noch kein Problem, dafür kann ich die webClient.UploadFile(url, 'POST', fileName) nehmen. Zurück kommt laut Schnittstellenbeschreibung eine JSON, die wie folgt aufgebaut ist:
[
{
"name": "file.png",
"status": "OK",
"uuid":"08910afd0bfcc7aa193d40c486ca156a"
}
]

Nun habe ich jedoch keine Ahnung, wie ich die Antwort "einfange" und dann die UUID auslesen kann. Der Rückgabewert von webCient.UploadFile ist ein Byte Array, wo nun meine JSON drin steckt. Nur weiß ich nun nicht, wie ich das lesbar mache, so dass ich mir die UUID in NAV wegschreiben kann. Muss dazu sagen, dass ich nur Low Code und C/AL (und ein wenig AL) programmiert habe und kein gelernter Entwickler bin, deswegen oft bei den DotNet-Geschichten an meine Grenzen stoße.

Mein Code sieht (jetzt gerade - nach diversen trial and error) so aus:

System.Net.WebClient.'System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'
System.Net.WebResponse.'System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'


Code:
// dotnet webclient Instanz erzeugen
webClient := webClient.WebClient();

// temporäre Datei erzeugen und den namen merken
locFile.CREATETEMPFILE; 
fileName := locFile.NAME;
locFile.CLOSE;

IF locReport.SAVEASPDF(fileName) THEN BEGIN
  // eigentliches uploaden
  WebResponse := webClient.UploadFile(url, 'POST', fileName);
  txt := WebResponse.ToString; 
  MESSAGE(txt);
  // nach dem upload Datei wieder löschen
  ERASE(fileName);
  EXIT(TRUE)
END ELSE
  EXIT(FALSE);


Da kommt dann aber nur ein "Byte[]" raus. Mir ist klar, dass der Code so nicht funktionieren kann, da nach der Zuweisung der Antwort irgendeine Art von Konvertierung fehlt. Aber wie?

Bin für jede Hilfestellung danbkar.

MfG
fips
Zuletzt geändert von fips am 4. August 2022 08:28, insgesamt 2-mal geändert.

Re: UUID aus JSON auslesen

19. Juli 2022 13:00

Hallo,

du könntest mal prüfen, ob eine der Funktionen aus der Codeunit 5459 "JSON Management" dir beim Ermitteln der UUID helfen.

Re: UUID aus JSON auslesen

19. Juli 2022 13:56

Vielen Dank für deine Antwort.

Hilft mir das weiter? Jain.

Wenn ich eine "gefüllte" Instanz JsonArray/JsonObject hätte, dann kann ich mit der CU 5459 den entsprechenden Knoten auslesen. Auf jeden Fall gut zu wissen, dass es eine solche Codeunit gibt.

Mir gelingt aber der Weg vom Ruckgabewert der Funktion [ Dotnet := ] WebClient.UploadFile zur JArray/JObject-Instanz nicht.

Ich bekomme dann die Meldung: "Object serialized to Bytes. JArray instance expected". Da muss ich vermutlich mit einem Convert- oder Deserialize-Befehl (?) arbeiten.

Hat dazu jemand eine Idee?

Hab zuletzt so etwas versucht:
Code:
WebResponse := webClient.UploadFile(url, 'POST', fileName);
JsonObject := JsonObject.FromObject(WebResponse);

Re: UUID aus JSON auslesen

19. Juli 2022 14:48

Hier wird Codeunit 1237 Get JSON Structure erweitert, um Werte aus der JSON auszulesen:
https://forum.mibuso.com/discussion/comment/325897
Andere Methode: Über eine eigene .dll, wie hier beschrieben:
https://www.kauffmann.nl/2015/12/03/web-services-examples-part-2-verify-e-mail-address/

Re: UUID aus JSON auslesen

19. Juli 2022 15:03

Vielen Dank, Kowa. Die Links sind mir bekannt :-).

Leider ist das Auslesen selbst nicht mein Problem. Selbst wenn ich Text als Parameter hätte, käme ich schon weiter. Oder ich verstehe etwas grundsätzliches nicht.

Ich verstehe nicht, wie ich den Rückgabewert (DotNet) von Webclient.UploadFile "greifen" kann und in eine JObject/JArray/JsonReader o.ä. überführen kann.

Also im Grunde suche ich eine Methode um aus dem ByteArray, was zurückommt eine Txt/Json/XML - Instanz oder irgendwas lesebares zu machen, mit der ich dann umgehen kann.

Re: UUID aus JSON auslesen

20. Juli 2022 10:37

Hallo,
warum so kompliziert? Dynamics NAV bringt doch alles mit. Den DotNet-Datentyp WebClient solltest du übrigens nicht mehr verwenden, da obsolet.
Du könntest mit der Codeunit 1297 Http Web Request Mgt. und der Tabelle 1236 JSON Buffer arbeiten. Die nehmen dir vieles ab. Der JSON Buffer ist sowas wie der Excel-Buffer, nur halt für JSON.

Hier ist ein wenig ungetesteter Beispielcode. Das Lesen deiner PDF-Datei musst du sicherlich anpassen. Ggf. mit dem File Management arbeiten. Aber prinzipiell ist das die Vorgehensweise. Wenn du nicht mit dem JSON Buffer arbeiten möchtest, hast du so immerhin dein zurückgegebenes JSON in Textform - die eigentliche Lösung für deine Frage :)
Name DataType Subtype Length
TempBlob Record TempBlob temporary
TempJSONBuffer Record JSON Buffer temporary
HttpWebRequestMgt Codeunit Http Web Request Mgt.
ResponseJsonText Text
Txt Text 100
NumRead Integer
f File
ins InStream
outs OutStream
HttpStatusCode DotNet System.Net.HttpStatusCode.'System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'
ResponseHeaders DotNet System.Collections.Specialized.NameValueCollection.'System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'
Code:
IF NOT f.OPEN('C:\Temp\Test.pdf') THEN
  EXIT;
 
CLEAR(HttpWebRequestMgt);
HttpWebRequestMgt.Initialize('http://myurl.com');
HttpWebRequestMgt.SetMethod('POST');
HttpWebRequestMgt.SetContentType('application/octet-stream');
HttpWebRequestMgt.SetContentLength(f.LEN());
HttpWebRequestMgt.SetUserAgent('Dynamics NAV 2018 Client');
 
f.CREATEINSTREAM(ins);
CLEAR(TempBlob);
TempBlob.Blob.CREATEOUTSTREAM(outs);
COPYSTREAM(outs, ins);
HttpWebRequestMgt.AddBodyBlob(TempBlob);
 
f.CLOSE();

CLEAR(ins);
 
IF NOT HttpWebRequestMgt.GetResponse(ins, HttpStatusCode, ResponseHeaders) THEN
  EXIT;

// TODO: StautsCode ggf. abfragen

CLEAR(ResponseJsonText);
WHILE NOT ins.EOS() DO BEGIN
  NumRead := ins.READTEXT(Txt, 100);
  IF NumRead > 0 THEN
    ResponseJsonText := ResponseJsonText + Txt;
END;

TempJSONBuffer.RESET();
TempJSONBuffer.DELETEALL();
TempJSONBuffer.ReadFromText(ResponseJsonText);
IF TempJSONBuffer.FINDSET() THEN
  REPEAT
    // TODO ...
  UNTIL TempJSONBuffer.NEXT() = 0;

Re: UUID aus JSON auslesen

21. Juli 2022 10:11

Hallo Ermac,

vielen, vielen Dank. Das kann mir die Woche noch irgendwie retten ... ;-).

Hab deinen Code (also den Upload-teil) erstmal übernommen, die URL ersetzt und den Filename auf meine PDF gematcht, die ich hochladen möchte. locFile2.OPEN funktioniert auch noch. Leider kommt HttpWebRequestMgt.GetResponse(InStr, HttpStatusCode, ResponseHeaders) immer mit FALSE zurück und ich sehe noch nicht warum.

Hier mein Code (wird später noch aufgeräumt):

Code:
IF locReport.SAVEASPDF(fileName) THEN BEGIN
    // eigentliches uploaden
    IF NOT locFile2.OPEN(fileName) THEN
      ERROR('File could not be open');

    CLEAR(HttpWebRequestMgt);
    HttpWebRequestMgt.Initialize(url);
    HttpWebRequestMgt.SetMethod('POST');
    HttpWebRequestMgt.SetContentType('application/octet-stream');
    HttpWebRequestMgt.SetContentLength(locFile2.LEN);
    HttpWebRequestMgt.SetUserAgent('Dynamics NAV 2018 Client');

    HttpWebRequestMgt.SetReturnType('application/json'); //!
    HttpWebRequestMgt.AddSecurityProtocolTls12; //!

    locFile2.CREATEINSTREAM(InStr);
    CLEAR(TempBlob);
    TempBlob.Blob.CREATEOUTSTREAM(OutStr);
    COPYSTREAM(OutStr, InStr);
    HttpWebRequestMgt.AddBodyBlob(TempBlob);
 
    locFile2.CLOSE();

    CLEAR(InStr);
   
    IF NOT HttpWebRequestMgt.GetResponse(InStr, HttpStatusCode, ResponseHeaders) THEN
      ERROR('Cannot get response.');

    //CheckStatusCode
    //...


Woran kann das liegen?

mfG fips


EDIT* Hab nun noch den ReturnType auf "application/json" gesetzt, leider weiterhin ohne Erfolg.
EDIT** HttpWebRequestMgt.AddSecurityProtocolTls12 ergänzt, kein anderes Ergebnis
EDIT*** Eben erfahren, dass schon der Upload nicht funktioniert hat. Das Verzeichnis, in das die PDFs hochgeladen werden, ist leer. Aber das liegt vermutlich an dem Rollback nach Fehler, ist ja alles eine Transaktion.

Re: UUID aus JSON auslesen

22. Juli 2022 11:47

Hallo nochmal,

in der Hoffnung, dass vielleicht noch jemand eine Idee hat.
Ich weiß mittlerweile, an welcher Stelle im Code NAV auf den Fehler läuft:

Codeunit 1299 Web Request Helper:

Code:
[TryFunction] GetWebResponse(VAR HttpWebRequest : DotNet "System.Net.HttpWebRequest";VAR HttpWebResponse : DotNet "System.Net.HttpWebResponse";VAR ResponseInStream : InStream;VAR HttpStatusCode : DotNet "System.Net.HttpStatusCode";VAR ResponseHeaders

IF ProgressDialogEnabled THEN
  ProcessingWindow.OPEN(ProcessingWindowMsg);

CLEARLASTERROR;
HttpWebResponse := HttpWebRequest.GetResponse;
HttpWebResponse.GetResponseStream.CopyTo(ResponseInStream); //fails <---!!!---
HttpStatusCode := HttpWebResponse.StatusCode;
ResponseHeaders := HttpWebResponse.Headers;

IF ProgressDialogEnabled THEN
  ProcessingWindow.CLOSE;


Leider kann ich da dann nicht mehr weiter reinschauen/debuggen.

mfG fips

Re: UUID aus JSON auslesen

22. Juli 2022 13:41

aber du bekommst doch sicherlich eine Fehlermeldung, oder?

Re: UUID aus JSON auslesen

22. Juli 2022 13:45

Hab nun ein ERROR(GETLASTERRORTEXT) eingebaut, das gibt mir nun "Variable Microsoft.Dynamics.Nav.Runtime.NavInstream nicht initialisiert."

Re: UUID aus JSON auslesen

22. Juli 2022 14:08

Hallo,

hast du denn ResponseInStream vor dem Aufruf der Funktion initialisert?

Gruß Fiddi

Re: UUID aus JSON auslesen

22. Juli 2022 15:14

Hallo nochmal,

habe ich nun gemacht (glaube ich). Jetzt bekomme ich auch aus der Antwort "ERROR:MISSING_FILE". Das ist auch schon eine Antwort vom Server, den ich anspreche.

Mein Code sieht nun wie folgt aus:
Code:
  IF locReport.SAVEASPDF(fileName) THEN BEGIN
    // eigentliches uploaden
    IF NOT locFile2.OPEN(fileName) THEN
      ERROR('File could not be opened');

    CLEAR(HttpWebRequestMgt);
    HttpWebRequestMgt.Initialize(url);
    HttpWebRequestMgt.SetMethod('POST');
    //HttpWebRequestMgt.SetContentType('multipart/form-data');
    HttpWebRequestMgt.SetContentType('application/octet-stream');
    HttpWebRequestMgt.SetContentLength(locFile2.LEN);
    HttpWebRequestMgt.SetUserAgent('Dynamics NAV 2018 Client');
    HttpWebRequestMgt.SetReturnType('application/json'); //!!!
    HttpWebRequestMgt.AddSecurityProtocolTls12; //!!!
    HttpWebRequestMgt.DisableUI; //!!!
   

    locFile2.CREATEINSTREAM(InStr);
    CLEAR(TempBlob);   
    TempBlob.Blob.CREATEOUTSTREAM(OutStr);
    COPYSTREAM(OutStr, InStr);
    HttpWebRequestMgt.AddBodyBlob(TempBlob);
   
    locFile2.CLOSE();
   
    CLEAR(InStr);
   
    HttpWebRequestMgt.CreateInstream(InStr);  //<--Initialisieren-->?
    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);
   
    // nach dem upload Datei wieder löschen
    ERASE(fileName);
    EXIT(TRUE)
  END ELSE
    EXIT(FALSE);


Nun geht es also noch darum, warum er die PDF nicht erkennt.

Ich hatte die Fehlermeldung schon einmal, als ich den Request über die Postman App versucht habe zu senden. Da war der Grund, dass ich die Datei versucht habe als binary mitzusenden statt als FormData. Damit hat es dann aber funktioniert.

Kann das der Grund sein? Ist die Initialisierung (im Code gekennzeichnet) richtig?

Re: UUID aus JSON auslesen

22. Juli 2022 15:15

genau das konnte ich mir denken :)
schau mal hier
https://forum.mibuso.com/discussion/68873/outstream-initialize-error

Re: UUID aus JSON auslesen

22. Juli 2022 15:31

Hallo sweikelt,

war das die Antwort auf meinen letzten Beitrag?

Es werden doch nun beide initialisiert, oder sehe ich das falsch? Vielleicht hab ich auch nun zu lange auf den gleichen Code geschaut, das mag ich nicht ausschließen.. :-?

Re: UUID aus JSON auslesen

22. Juli 2022 19:42

Hi,
das war leider zu spät von mir gesendet - sollte auf das Init des Stream kommen (direkt nach Kowa).

Welche Fehlermeldung und vor allem an welcher Codestelle kommt?

Re: UUID aus JSON auslesen

25. Juli 2022 07:43

fips hat geschrieben:Hallo nochmal,

habe ich nun gemacht (glaube ich). Jetzt bekomme ich auch aus der Antwort "ERROR:MISSING_FILE". Das ist auch schon eine Antwort vom Server, den ich anspreche.

Mein Code sieht nun wie folgt aus:
Code:
  IF locReport.SAVEASPDF(fileName) THEN BEGIN
    // eigentliches uploaden
    IF NOT locFile2.OPEN(fileName) THEN
      ERROR('File could not be opened');

    CLEAR(HttpWebRequestMgt);
    HttpWebRequestMgt.Initialize(url);
    HttpWebRequestMgt.SetMethod('POST');
    //HttpWebRequestMgt.SetContentType('multipart/form-data');
    HttpWebRequestMgt.SetContentType('application/octet-stream');
    HttpWebRequestMgt.SetContentLength(locFile2.LEN);
    HttpWebRequestMgt.SetUserAgent('Dynamics NAV 2018 Client');
    HttpWebRequestMgt.SetReturnType('application/json'); //!!!
    HttpWebRequestMgt.AddSecurityProtocolTls12; //!!!
    HttpWebRequestMgt.DisableUI; //!!!
   

    locFile2.CREATEINSTREAM(InStr);
    CLEAR(TempBlob);   
    TempBlob.Blob.CREATEOUTSTREAM(OutStr);
    COPYSTREAM(OutStr, InStr);
    HttpWebRequestMgt.AddBodyBlob(TempBlob);
   
    locFile2.CLOSE();
   
    CLEAR(InStr);
   
    HttpWebRequestMgt.CreateInstream(InStr);  //<--Initialisieren-->?
    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);
   
    // nach dem upload Datei wieder löschen
    ERASE(fileName);
    EXIT(TRUE)
  END ELSE
    EXIT(FALSE);


Nun geht es also noch darum, warum er die PDF nicht erkennt.

Ich hatte die Fehlermeldung schon einmal, als ich den Request über die Postman App versucht habe zu senden. Da war der Grund, dass ich die Datei versucht habe als binary mitzusenden statt als FormData. Damit hat es dann aber funktioniert.

Kann das der Grund sein? Ist die Initialisierung (im Code gekennzeichnet) richtig?



Hi zusammen,

also wie schon am Freitag geschrieben gibt es keinen "harten" Error mehr sondern er geht tatsächlich an der MESSAGE(ResponseJsonText) raus mit der Antwort der Gegenstelle, aber halt "ERROR:MISSING_FILE" (siehe zitierter Beitrag).

Es scheint also etwas mit dem Anhängen der PDF an den Request noch nicht zu funktionieren. Ermac meinte ja auch, dass ich das einlesen vermutlich nochmal anschauen muss. Bin weiterhin für jeden Hinweis dankbar.

Danke und guten Start in die Woche :-)

Re: UUID aus JSON auslesen

26. Juli 2022 11:25

Hat noch irgendwer eine Idee? Ich habe das Gefühl, dass nicht mehr viel fehlt. Ich bekomme ja bereits eine Antwort zu der Request, aber halt ERROR:MISSING_FILE.
Das hinzugefügte BLOB wird aus irgendeinem Grund nich erkannt, obwohl es nichtleer ist. An der PDF selbst liegt es nicht, ich konnte dieselbige via Postman App erfolgreich hochladen. Ich vermute, dass ich das über den ContentType steuern muss, aber habe schon alles ausprobiert, was mir einfällt.

Hier mein aktueller Stand an Code:

Code:
IF locReport.SAVEASPDF(fileName) THEN BEGIN
    // eigentliches uploaden
    IF NOT locFile2.OPEN(fileName) THEN
      ERROR('File could not be opened');

    CLEAR(HttpWebRequestMgt);
    HttpWebRequestMgt.Initialize(url);
    HttpWebRequestMgt.SetMethod('POST');
    //HttpWebRequestMgt.SetContentType('multipart/form-data');
    //HttpWebRequestMgt.SetContentType('application/octet-stream');
    HttpWebRequestMgt.SetContentType('application/x-www-form-urlencoded');
    //HttpWebRequestMgt.SetContentType('application/form-data');
    HttpWebRequestMgt.SetContentLength(locFile2.LEN);
    HttpWebRequestMgt.SetUserAgent('Dynamics NAV 2018 Client');
    HttpWebRequestMgt.SetReturnType('application/json');
    HttpWebRequestMgt.AddSecurityProtocolTls12;
    HttpWebRequestMgt.DisableUI;

    FileManagement.BLOBImportFromServerFile(TempBlob,fileName);
    HttpWebRequestMgt.AddBodyBlob(TempBlob);
   
    locFile2.CLOSE();   
   
    CLEAR(TempBlob);
   
    HttpWebRequestMgt.CreateInstream(InStr);  //<--Initialisieren-->?
   
    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); //<---Hier kommt "ERROR:MISSING_FILE
   
    // nach dem upload Datei wieder löschen
    ERASE(fileName);
    EXIT(TRUE)
  END ELSE
    EXIT(FALSE)

Re: UUID aus JSON auslesen

27. Juli 2022 09:13

also ich kein Profi, aber müsstest du nicht
Code:
HttpWebRequestMgt.SendRequestAndReadResponse()

ausführen?
Du machst nur GetResponse, aber da wird doch nix gesendet

Edit - sorry, ich hoffe das gibt es schon in NAV2018 -> hab grad nur in BC18 geschaut

Re: UUID aus JSON auslesen

27. Juli 2022 10:14

Das habe ich mir auch die ganze Zeit gedacht (halt auch kein Profi :wink: ). Bei Postman z.Bb klicke ich ja auch irgendwann auf "Senden". Aber das machen andere - funktionierende - Code Beispiele auch nicht, weder in C# noch in C/AL. Es wird immer nur das BLOB eingefügt und dann die Anwort gefordert.

In NAV18 steht die Funktion auch nicht zur Verfügung. Hast du die Möglichkeit, da reinzuschauen? Macht die denn etwas anderes als mein Code an der Stelle?

Re: PDF im BODY eines HTTP Requests senden

2. August 2022 10:09

Hallo nochmal,

was die Funktion in BC macht, konnte ich nun selbst rausfinden. Leider grundlegend nichts anderes, als was ich hier mache.

Konnte mittlerweile feststellen, dass es ohne Angabe der Boundaries nicht funktioniert. Über Postman App geht es z.b. ohne Angabe von Boundaries auch nicht. Also habe ich diese ergänzt. Weiterhin leider ohne Erfolg, es kommt unten in der Message immer noch "ERROR:Missing_File" als Antwort von der Schnittstelle zurück.

Außerdem habe ich noch den Header aufgehübscht:
HttpWebRequestMgt.AddHeader('Accept-Encoding','gzip, deflate, br');
HttpWebRequestMgt.AddHeader('Content-Encoding','gzip, deflate, br');

Etwas Kosmetik, leider gleiches Ergebnis.

Auf StackOverflow gab es noch die Idee, das ganze base64 zu converten, habe ich ebenfalls ausprobiert. Auch hier unverändertes Ergebnis (hatte ich auch erwartet, Postman macht das z.b. auch nicht und sendet mit Erfolg, war eher aus der Verzweiflung heraus).

Bin leider mit meinem Latein am Ende. Bleibt mir noch beim Telemetrik-Anbieter zu Fragen, ob es andere NAV-Kunden gab, die das erfolgreich umgesetzt haben oder hier auf eine Antwort zu hoffen. Vielleicht sieht ja jemand noch den Denkfehler.

Mein aktueller Code:
Code:
IF SalesShipmentHeader.FINDFIRST THEN BEGIN
  locReport.SETTABLEVIEW(SalesShipmentHeader);
  IF locReport.SAVEASPDF(fileName) THEN BEGIN
    // eigentliches uploaden
    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.SetContentType('multipart/form-data');
    //HttpWebRequestMgt.SetContentType('application/octet-stream);
    //HttpWebRequestMgt.SetContentType('application/x-www-form-urlencoded');
    //HttpWebRequestMgt.SetContentType('application/form-data');
    //HttpWebRequestMgt.SetContentType('application/binary')
    //HttpWebRequestMgt.SetContentType('application/pdf);
    HttpWebRequestMgt.SetContentLength(locFile2.LEN);   
    HttpWebRequestMgt.SetUserAgent('Dynamics NAV 2018 Client');
    HttpWebRequestMgt.SetReturnType('application/json');
    HttpWebRequestMgt.AddSecurityProtocolTls12;
    HttpWebRequestMgt.AddHeader('Accept-Encoding','gzip, deflate, br');
    HttpWebRequestMgt.AddHeader('Content-Encoding','gzip, deflate, br');

    FileManagement.BLOBImportFromServerFile(TempBlob,fileName);
    HttpWebRequestMgt.AddBodyBlob(TempBlob);     
   
    locFile2.CLOSE();   
   
    CLEAR(TempBlob);
   
    HttpWebRequestMgt.CreateInstream(InStr); 
   
    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);
   
    // nach dem upload Datei wieder löschen
    ERASE(fileName);
    EXIT(TRUE)
  END ELSE
    EXIT(FALSE);
END;

EXIT(FALSE)



P.S: Dieser Blog scheint es übrigens gelöst zu haben, leider sind die Screenshots nicht mehr online. Anhand der Kommentare bekomme ich es aber nicht nachvollzogen.

Re: PDF im BODY eines HTTP Requests senden

2. August 2022 12:37

Hallo,
ich hab mir das mal kurz angeschaut. Hast du Zugriff auf den PHP Code, bzw. kannst du diesen teilen?
Die Übergabe funktioniert, allerdings musst du darauf in PHP über $_POST zugreifen und ggf. noch umwandeln, ich denke mal dass hier das Problem liegt.

Re: PDF im BODY eines HTTP Requests senden

2. August 2022 13:03

Hallo und danke!

Das ist ja schonmal gut zu wissen. Die PHP-Datei ist leider vom Drittanbieter, daher hab ich - Stand jetzt - keinen Zugriff bzw. keine Handhabe.

Werde das aber mal anfragen.

Re: PDF im BODY eines HTTP Requests senden

2. August 2022 13:42

Ah okay,
hat bei dir der Code im ersten Beitrag funktioniert? Also wurde dort die Datei abgelegt und nur der Rückgabewert war das Problem?
Dort wird am Ende mit PHP per $_FILES darauf zugegriffen, was einen Unterschied macht.

Re: PDF im BODY eines HTTP Requests senden

2. August 2022 14:11

Du meinst den hier?

Code:
// dotnet webclient Instanz erzeugen
webClient := webClient.WebClient();

// temporäre Datei erzeugen und den namen merken
locFile.CREATETEMPFILE;
fileName := locFile.NAME;
locFile.CLOSE;

IF locReport.SAVEASPDF(fileName) THEN BEGIN
  // eigentliches uploaden
  WebResponse := webClient.UploadFile(url, 'POST', fileName);
  txt := WebResponse.ToString;
  MESSAGE(txt);
  // nach dem upload Datei wieder löschen
  ERASE(fileName);
  EXIT(TRUE)
END ELSE
  EXIT(FALSE);


Hier weiß ich nicht ob der Upload funktioniert hatte, konnte die Rückgabe ja nicht einfangen.

Re: PDF im BODY eines HTTP Requests senden

2. August 2022 14:37

Ja genau,
für den Rückgabewert müsstest du ein DotNet Array erstellen und dann ausgeben.
Bei dir würde das heißen, das WebResponse müsste folgendes sein:
System.Array.'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'

Anschließend erstellst du noch eine neue Variable:
System.Text.Encoding.'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'

Damit kannst du dann die Antwort in einen String umwandeln und dir direkt ausgeben lassen. Das kann dann folgendermaßen aussehen:
Code:
 WebResponse := webClient.UploadFile(url, 'POST', fileName);
 txtstring := txtstring.Default;
 Txt := txtstring.GetString(WebResponse);
 MESSAGE(Txt);


txtstring wäre hier die neue Variable.