嗨,我正在尝试使用组件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;
Run Code Online (Sandbox Code Playgroud)
表格的代码是这样的:
<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>
Run Code Online (Sandbox Code Playgroud)
问题是我没有返回适当的回复表格,这让我回到了空洞的形式,好像他把一切都搞错了
我究竟做错了什么?
您正在使用a提交webform数据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;
Run Code Online (Sandbox Code Playgroud)
话虽如此,要在政治上正确,还有两个因素需要考虑.如果您使用像Wireshark这样的数据包嗅探器来查看普通Web浏览器提交的内容,您会注意到:
Refererwebform提交上有一个标题,让服务器知道提交的来源.你省略了那个标题.有时Web服务器会验证Referer确保请求实际来自他们自己的站点而不是其他地方,因此您应该Referer在适当的时候提供.
服务器发送带有初始HTML的cookie,然后通过webform提交将其发送回服务器.有时,Web服务器需要这些cookie以确保客户端在提交webform数据之前访问了原始站点.因此,您应下载初始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;
Run Code Online (Sandbox Code Playgroud)
最后,您使用的是基于HTML的查找服务,这不是一个很好的决定.HTML用于呈现供人消费的数据,不适合机器解析.还有许多其他IP查找服务可用于提供更高效的基于REST的API,以便以机器可解析的格式(如XML或JSON)提供结果.您应该认真考虑切换到其中一种服务.
| 归档时间: |
|
| 查看次数: |
12684 次 |
| 最近记录: |