当前位置:  开发笔记 > Android > 正文

通过DEL上的POST发送和接收XML

如何解决《通过DEL上的POST发送和接收XML》经验,为你挑选了1个好方法。

我在这里和那里已经看到了一些示例,这些示例如何使用Indy将数据发布到服务器,但我的问题是如何查看服务器提供的答案?

这是用户Bruce McGee所拥有的,并对自己进行了一些修改:

function ExecuteAPI: string;
var
  lHTTP: TIdHTTP;
  lParamList: TStringList;
begin
  lParamList := TStringList.Create;
  lParamList.Add('');
  lParamList.Add(' ');
  lParamList.Add(' ');
  lParamList.Add('');
  lParamList.Add('');
  lParamList.Add('');
  lParamList.Add('');
  lParamList.Add(' ');
  lParamList.Add(' ');
  lParamList.Add(' ');

  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?



1> Remy Lebeau..:

我在这里和那里已经看到了一些有关如何使用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()为此,有两个重载版本-一个以a形式返回响应String,一个TStream以原始响应字节填充a 。您正在呼叫第一个,因此只需使用所需的即可String,例如:

var
  XML: string;
begin
  XML := ExecuteAPI;
  // use XML as needed, for example:
  // Memo1.Text := XML;
end;

话虽这么说...

API指出,无论请求或结果是什么,服务器都会返回XML。

XML不是文本数据,它是其中包含文本元素的二进制数据。将XML视为二进制对于正确处理非ASCII字符的字符集很重要。您应该使用的TStream版本,Post()然后将原始数据加载到实际的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()将XML返回为StringTIdHTTP将尝试通过分析HTTP Content-Type标头以及XML自身的序言声明来找出XML的字符集,然后根据该字符集将原始数据解码为Unicode,然后重新编码将Unicode数据转换为String(取决于您的Delphi版本,将是Ansi还是Unicode)。第一步很容易出错,并且可能导致数据丢失,例如,如果HTTP服务器配置错误。最好TIdHTTP.Post()返回原始XML数据,并让XML解析器处理字符集解码。毕竟,这是其工作的一部分。

推荐阅读
mobiledu2402851203
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有