我正在尝试使用TIdHTTP Indy工具访问Delphi中的URL。 我做了以下事情:
http://sms.saicomvoice.co.za:8900/saicom/index.php?action=login&username=SOME_USERNAME&password=SOME_PASSWORD&login=login
Post请求有效,它返回HTML。问题是它没有返回正确的HTML(见下图)。
如果我拿到那个URL(填写用户名和密码)并将其完全粘贴到我的浏览器中,那么我的Delphi应用程序就会登录到正确的网站。但是只要我使用我的Delphi应用程序,它就会返回登录页面的HTML。
该请求应该在Delphi的TTimer中及时执行。
任何人都可以引导我走上正确的道路,或指出我如何解决这个问题吗?
一些其他信息
BtnEndPoll停止计时器
Procedure TfrmMain.TmrPollTimer(Sender: TObject);
Var
ResultHTML: String;
DataToSend: TStringList;
Begin
Inc(Cycle, 1);
LstStatus.Items.Add('');
LstStatus.Items.Add('==================');
WriteStatus('Cycle : ' + IntToStr(Cycle));
LstStatus.Items.Add('==================');
LstStatus.Items.Add('');
DataToSend := TStringList.Create;
Try
WriteStatus('Setting Request Content Type');
HttpRequest.Request.ContentType := 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8';
WriteStatus('Setting Request User Agent');
HttpRequest.Request.UserAgent := 'Mozilla/5.0 (Windows NT 5.1; rv:2.0b8) Gecko/20100101 Firefox/4.0b8';
WriteStatus('Posting Request');
ResultHTML := HttpRequest.Post(FPostToURL, DataToSend);
WriteStatus('Writing Result');
FLastResponse := ResultHTML;
WriteStatus('Cycle : ' + IntToStr(Cycle) + ' -- FINISHED');
LstStatus.Items.Add('');
Except
On E: Exception Do
Begin
MakeNextEntryError := True;
WriteStatus('An Error Occured: ' + E.Message);
If ChkExceptionStop.Checked Then
Begin
BtnEndPoll.Click;
WriteStatus('Stopping Poll Un Expectedly!');
End;
End;
End;
End;
*图片示例*
答案 0 :(得分:4)
HttpRequest.Request.ContentType:= && 39; text / html,application / xhtml + xml,application / xml; q = 0.9,image / webp, / ; q = 0.8&# 39 ;;
这不是有效的ContentType
值。这种值属于Request.Accept
属性。它告诉服务器客户端将在响应中接受哪些ContentType。
ResultHTML:= HttpRequest.Post(FPostToURL,DataToSend);
您发布的是空白TStringList
。将网址放入浏览器的地址栏会发送GET
个请求,而不是POST
个请求,因此您应该使用TIdHTTP.Get()
代替:
ResultHTML := HttpRequest.Get('http://sms.saicomvoice.co.za:8900/saicom/index.php?action=login&username=SOME_USERNAME&password=SOME_PASSWORD&login=login');
如果您想模拟提交给服务器的HTML网络表单(因为它指定TIdHTTP.Post()
),您将使用method=post
,例如:
DataToSend.Add('username=SOME_USERNAME');
DataToSend.Add('password=SOME_PASSWORD');
DataToSend.Add('login=Login');
ResultHTML := HttpRequest.Post('http://sms.saicomvoice.co.za:8900/saicom/index.php?action=login', DataToSend);