在 Dynamics NAV 2009 SP1 中通过 WinHTTP 5.1 发送 BigText

Send BigText via WinHTTP 5.1 in Dynamics NAV 2009 SP1

我知道如何通过 WinHTTP 5.1 Automation 发送普通文本以及如何将响应流转换为 BigText 对象。

现在我想通过 POST/PUT 发送 BigText 的内容,基本上是这样的:

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

代码单元实际编译并且自动化对象确实将请求发送到服务器,但是请求主体为空。

我尝试使用 OutStream,但代码单元无法编译(自动化 := OutStream)。

我正在使用 Dynamics NAV 2009 SP1,因此也没有可用的 DotNet 数据类型。

我通过流杂耍让它工作

// 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

如果遇到编码问题,请将 ResponsBodyBigText.READ 替换为转换函数和 EOS 循环。如果您不能使用 DotNet Interop DataTypes(像我一样),您可以使用字符集设置为 UTF-8 的 ADOStream 自动化,或者您使用自己编写的 COM 对象(就像我一样)