在 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 对象(就像我一样)
我知道如何通过 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 对象(就像我一样)