[英]Send and receive XML via POST on Delphi
我在这里和那里已经看到了一些示例,这些示例如何使用Indy将数据发布到服务器上,但是我的问题是如何查看服务器提供的答案?
这是用户Bruce McGee所拥有的 ,并对自己进行了一些修改:
function ExecuteAPI: string;
var
lHTTP: TIdHTTP;
lParamList: TStringList;
begin
lParamList := TStringList.Create;
lParamList.Add('<input type=text name=StoreName value="Hálitopuro Produtos">');
lParamList.Add('<input type=text name=StoreID value="123456"> ');
lParamList.Add('<input type=text name=Username value="Admin"> ');
lParamList.Add('<input type=password name=Password value="Password123">');
lParamList.Add('<input type=text name=method value="ReportView">');
lParamList.Add('<input type=text name=ObjectID value="425">');
lParamList.Add('<input type=text name=Par1 value="Category name">');
lParamList.Add('<input type=text name=Par2 value="Ref/Name/Descr"> ');
lParamList.Add('<input type=text name=Par3 value="false"> ');
lParamList.Add('<input type=text name=Par4 value="false"> ');
lHTTP := TIdHTTP.Create(nil);
try
Result := lHTTP.Post('https://www.rumo.com.br/sistema/adm/APILogon.asp', lParamList);
finally
lHTTP.Free;
lParamList.Free;
end;
end;
API指出,无论请求或结果是什么,服务器都将返回XML,但是如何查看它呢? 例如,通过填充TMemo?
我在这里和那里已经看到了一些有关如何使用Indy将数据发布到服务器的示例
您没有正确填充TStringList
。 不要在其中存储实际的HTML标记,仅存储它们的name=value
对,例如:
lParamList.Add('StoreName=Hálitopuro Produtos');
lParamList.Add('StoreID=123456');
lParamList.Add('Username=Admin');
lParamList.Add('Password=Password123');
lParamList.Add('method=ReportView');
lParamList.Add('ObjectID=425');
lParamList.Add('Par1=Category name');
lParamList.Add('Par2=Ref/Name/Descr');
lParamList.Add('Par3=false');
lParamList.Add('Par4=false');
如何查看服务器提供的答案?
TIdHTTP.Post()
将服务器的响应返回给您。 为此,有两个Post()
重载版本-一个以String
返回响应,另一个以原始响应字节填充TStream
。 您正在调用第一个,因此请根据需要使用String
,例如:
var
XML: string;
begin
XML := ExecuteAPI;
// use XML as needed, for example:
// Memo1.Text := XML;
end;
话虽这么说...
API指出,无论请求或结果是什么,服务器都会返回XML。
XML不是文本数据,它是其中包含文本元素的二进制数据。 将XML视为二进制对于正确处理非ASCII字符的字符集很重要。 您应该使用Post()
的TStream
版本,然后将原始数据加载到实际的XML解析器中以进行进一步处理(因为我确定您最终将希望根据响应的内容实际做一些事情,而不仅仅是看它),例如:
procedure ExecuteAPI(Response: TStream);
var
lHTTP: TIdHTTP;
lParamList: TStringList;
begin
lParamList := TStringList.Create;
try
lParamList.Add('StoreName=Hálitopuro Produtos');
lParamList.Add('StoreID=123456');
lParamList.Add('Username=...');
lParamList.Add('Password=...');
lParamList.Add('method=ReportView');
lParamList.Add('ObjectID=425');
lParamList.Add('Par1=Category name');
lParamList.Add('Par2=Ref/Name/Descr');
lParamList.Add('Par3=false');
lParamList.Add('Par4=false');
lHTTP := TIdHTTP.Create(nil);
try
lHTTP.Post('https://www.rumo.com.br/sistema/adm/APILogon.asp', lParamList, Response);
finally
lHTTP.Free;
end;
finally
lParamList.Free;
end;
end;
var
XML: TMemoryStream;
Doc: IXMLDocument;
begin
XML := TMemoryStream.Create;
try
ExecuteAPI(XML);
XML.Position := 0;
{Memo1.Lines.LoadFromStream(XML);
XML.Position := 0;}
Doc := TXMLDocument.Create(nil);
Doc.LoadFromStream(XML);
finally
XML.Free;
end;
// use Doc as needed...
end;
如果让TIdHTTP.Post()
以String
返回XML,则TIdHTTP
将尝试通过分析HTTP Content-Type
标头(可能还有XML自己的序言声明)来找出XML的字符集,然后将原始数据解码为Unicode根据该字符集,然后将Unicode数据重新编码为String
(根据您的Delphi版本,该String
将为Ansi或Unicode)。 第一步很容易出错,并且可能导致数据丢失,例如,如果HTTP服务器配置错误。 最好让TIdHTTP.Post()
返回原始XML数据,并让XML解析器处理字符集解码。 毕竟,这是其工作的一部分。
我如何查看它,例如,通过填充TMemo?
要在备注控件中查看文本,请分配给Text
属性:
Memo1.Text := ExecuteAPI;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.