2017-06-29 65 views
0

我知道如何通過WinHTTP 5.1 Automation發送正常文本,以及如何將響應流轉換爲BigText對象。在Dynamics NAV 2009 SP1中通過WinHTTP 5.1發送BigText

現在我想通過POST/basicly這樣就把發送BigText的內容:

CREATE(bigText); 
bigText.ADDTEXT('...'); 
... 
CREATE(HTTP, TRUE, TRUE); 
HTTP.OPEN('PUT', 'https://...', FALSE); 
HTTP.SetCredentials('...', '...', 0); 
HTTP.SEND(bigText); 

的codeunit實際上編譯和自動化對象不發送請求到服務器上,但空請求主體。

我試圖使用OutStream,但比codeunit不編譯(自動化:= OutStream)。

我正在使用Dynamics NAV 2009 SP1,因此也沒有DotNet DataType。

+0

你也不能發送對象作爲流立即。你需要先序列化它。看到這個答案,我將文件作爲XML節點發送。這不完全是你想要的,但你可以適應它。 https://stackoverflow.com/a/44810162/1820340 –

+0

@MakSim已經嘗試過使用ADOStream:Microsoft.Dynamics.Nav.Runtime.Nav自動化到Microsoft.Dynamics.Nav.Runtime.NavInStream之間的轉換是不可能的,當我想要將ADOStream傳遞給WinHTTP發送 – Ello

回答

1

我得到了它的流工作兼顧

// Variable Declaration: 
// HTTP = Automation WinHTTP Services 5.1 
// TempBlob = Record <TEMPORARY=YES> TempBlob 
// blobOutStream = OutStream 
// RequestBodyBigText = BigText 
// ResponseBodyBigText = BigText 
// RequestInStream = InStream 
// ReponseInStream = InStream 

// create WinHTTP client, force new instance, don't run locally 
CREATE(HTTP, TRUE, FALSE); 
HTTP.Open('PUT', '...', FALSE); 
HTTP.SetCredentials('...', '....', 0); 
// ... 

// create InStream from BigText by the help of Temporary=YES TempBlob Record 
TempBlob.INIT; 
TempBlob."Blob".CREATEOUTSTREAM(blobOutStream); 
// write the content of the reuquest body to the temp blob 
RequestBodyBigText.WRITE(blobOutStream); 
// important, calcfield the temp blob so that we can use the content 
// in a new stream 
TempBlob.CALCFIELDS("Blob"); 
TempBlob."Blob".CREATEINSTREAM(RequestInStream); 

// send the stream 
HTTP.Send(RequestInStream); 

// timeout is in seconds 
IF HTTP.WaitForResponse(30) THEN BEGIN 
    ResponseInStream := HTTP.ResponseStream; 
    CLEAR(ResponseBodyBigText); 
    ReponseBodyBigText.READ(ResponseInStream); 
END; 

// now we have a big text (ResponseBodyBigText) filled with the body of the response 

如果遇到編碼問題,你有皈依功能和EOS循環替換ResponsBodyBigText.READ。如果你不能使用DotNet Interop數據類型(就像我),你可以使用字符集設置爲UTF-8的ADOStream自動化,或者使用自己寫的COM對象(像我一樣)