delphi - 带 IdHTTP 的 POST 请求

标签 delphi

您好,我正在尝试使用组件 IdHTTP POST 方法填写表单,我的代码是这样的:

var
  par2: TIdMultiPartFormDataStream;
  rta: string;

begin

    par2 := TIdMultiPartFormDataStream.Create;
    par2.AddFormField('ipaddress', ip.text);
    par2.AddFormField('submit', 'Submit');

    rta := idhttp1.Post
      ('http://www.melissadata.com/lookups/iplocation.asp?ipaddress=', par2);

    memo.Lines.Add(rta);

end;

表单的代码是这样的:

<form method="post" action="iplocation.asp">
<table class="Tableresultborderblue" align="right" border="0" cellpadding="0" cellspacing="0" width="300">
<tbody><tr><td align="center"><span style="font-size:12px;">Your IP Address: 181.92.20.173</span></td></tr>
<tr><td align="center" height="35px"><strong>Enter an IP address</strong></td></tr>
<tr><td align="center"><input id="ipaddress" name="ipaddress" value="" class="inputoff" type="text"></td></tr>
<tr><td height="10"></td></tr>
<tr><td align="center" height="45px"><input title="Click to process Address" class="btn" value="Submit" type="submit"></td></tr>
<tr><td height="10"></td></tr>
</tbody></table>   
</form>

问题是我没有返回适当的回复表单,这让我返回的是空表单,就好像他全错了

我做错了什么?

最佳答案

您正在使用 TIdMultipartFormDataStream 提交网络表单数据,它使用 multipart/form-data 发布数据格式。但是,HTML <form>标签没有 enctype=multipart/form-data属性,因此服务器不期望该格式。它期望使用默认的 application/x-www-webform-urlencoded 提交数据。格式代替。这是通过使用 TStrings 发布数据来完成的。相反,对象。

以下代码对我来说效果很好,它接收一个 HTML 响应,其中包含 IP 地址查找的结果(您必须在接收后解析):

var
  PostData: TStringList;
  rta: string;
begin
  PostData := TStringList.Create;
  try
    PostData.Add('ipaddress='+ip.Text);
    rta := IdHTTP1.Post('http://www.melissadata.com/lookups/iplocation.asp', PostData);
  finally
    PostData.Free;
  end;

  Memo1.Lines.Text := rta;
end;

话虽这么说,为了政治正确,还有两个因素需要考虑。如果您使用像 Wireshark 这样的数据包嗅探器来查看普通网络浏览器提交的内容,您会注意到:

  1. 有一个Referer Web 表单提交上的 header ,让服务器知道提交的来源。您省略了该 header 。有时 Web 服务器会验证 Referer确保请求实际上来自他们自己的网站而不是其他地方,因此您应该提供 Referer在适当的时候。

  2. 服务器发送带有初始 HTML 的 cookie,然后通过 Web 表单提交将其发送回服务器。有时,网络服务器需要这些 cookie 以确保客户端在提交网络表单数据之前访问原始站点。因此,您应该下载初始 HTML 以让 TIdHTTP获取任何必要的 cookie,以便将它们发送回服务器。

以下代码也适合我,接收包含 IP 地址查找结果的相同 HTML 响应:

var
  PostData: TStringList;
  rta: string;
begin
  // Get webform HTML and any cookies that go with it
  IdHTTP1.Get('http://www.melissadata.com/lookups/iplocation.asp');

  // now post the webform data back to the server
  PostData := TStringList.Create;
  try
    PostData.Add('ipaddress=23.241.61.8');
    IdHTTP1.Request.Referer := 'http://www.melissadata.com/lookups/iplocation.asp';
    rta := IdHTTP1.Post('http://www.melissadata.com/lookups/iplocation.asp', PostData);
  finally
    PostData.Free;
  end;

  Memo1.Lines.Text := rta;
end;

最后,您使用的是基于 HTML 的查找服务,这不是一个很好的决定。 HTML 旨在呈现供人类使用的数据,不太适合机器解析。还有许多其他可用的 IP 查找服务,它们提供更高效的基于 REST 的 API,以机器可解析的格式(例如 XML 或 JSON)提供结果。您应该认真考虑改用其中一项服务。

关于delphi - 带 IdHTTP 的 POST 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30443511/

相关文章:

xml - 有没有比 MSXML 更好的 IDOMImplementation?

multithreading - Delphi - 跨线程事件处理

delphi - 如何使用编辑而不是 DBNavigator 将数据添加到 Delphi 中的数据库?

delphi - 如何以编程方式确定 TMemo 中一行文本的高度?

delphi - TCustomAttribute - "Constant expression expected"编译错误

delphi - Delphi 7支持inline关键字吗?

delphi - F2047 圆形单位引用

delphi - TDataSource 后代作为子组件的无效属性路径错误

delphi - Synapse Delphi HTTPS SSL GET 请求

delphi - TScrollbox MouseDown 覆盖