使用IdHTTP发出POST请求

时间:2015-05-25 17:46:14

标签: 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>

问题在于我没有返回相应的回复表格,这让我回来的是空表,好像他错了一样

我做错了什么?

2 个答案:

答案 0 :(得分:8)

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

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

Referer

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

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

  2. 服务器发送带有初始HTML的cookie,然后通过webform提交将其发送回服务器。有时,Web服务器需要这些cookie以确保客户端在提交webform数据之前访问了原始站点。因此,您应该下载初始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; 获取任何必要的cookie,以便将它们发送回服务器。

  3. 以下代码也适用于我,收到包含IP地址查找结果的相同HTML响应:

    s = df_string.sum(axis=1)
    

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

答案 1 :(得分:1)

我再次检查了代码,看起来您不应该将其作为多部分表单数据发送。该网站不接受。使用此

var
  PostData: TStringList;
  res: string;
begin
  PostData:=TStringList.Create;
  try
    PostData.Add('ipaddress='+ip.text);

    res:=IdHTTP1.Post('http://www.melissadata.com/lookups/iplocation.asp', PostData);

    Memo1.Lines.Text:=res;
  finally
    PostData.Free;
  end;
end;