簡體   English   中英

通過DEL上的POST發送和接收XML

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM