我知道如何通过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,但是代码单元没有编译(Automation:= OutStream)。
我正在使用Dynamics NAV 2009 SP1,因此也没有可用的DotNet DataType。
答案 0 :(得分:1)
我通过流juggle工作了
// 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 DataTypes(像我一样),您可以使用ADOStream自动化,并将charset设置为UTF-8,或者使用自己编写的COM对象(就像我一样)