在线求教:IdHTTP如何通过HTTP协议将一个xml文件post到服务器上,并把返回的XML数据显示出来?(200分)

  • 主题发起人 主题发起人 fu0912shun
  • 开始时间 开始时间
F

fu0912shun

Unregistered / Unconfirmed
GUEST, unregistred user!
[:)]有哪位大虾出招,我愿意再加200分,并真挚感谢!
在线求教:IdHTTP如何通过HTTP协议将一个xml文件post到服务器上,并把返回的XML数据显示出来?
XML文件内容如下,中间略:
POST http://xxx.xxx.xxx.xxx HTTP/1.1
Host: xxx.xxx.xxx.xxx
Content-Length: 959
<html>
<head><title>test</title></head>
<Envelope>
<body>
<?xml version="1.0" encoding="GB2312"?>
<!DOCTYPE REQ SYSTEM "LOCREQ.DTD">
<REQ>
........
</REQ>
</body>
</Envelope>
</html>
 
HTTP文件上传,用第三方控件。TACHTTP
或者加我QQ。我这里有一个第三文件控件。经过压力测试的。非常稳定。
 
这样提问有点笼统。
1.客户端发送数据的格式取决于服务器端对数据的解析方法,
如果服务器端是需要整个 XML 文件,那么客户端载入整个 XML 文件,
把这个文件当成一个字符串来发送就可以了,
如果服务器端需要的仅仅是 XML 文件里面包含的数据,那么可以把需要的数据取出来,
然后再重新打包发送,这样可以减少数据流量。
2.客户端显示服务器端返回的 XML 数据,那主要取决于返回的数据的格式,
以及客户端对于这些数据在显示上的要求,用文本形式?用 Tree 形式?
 
非常抱歉没有说清楚是这样的:
通过自己写的客户端发送一个HTTP POST请求给服务器,语法为:POST host HTTP/1.1 ,请求必须将实体标头内容长度字段作为请求的一部分。请求的消息部分应该包括XML格式下的请求,长度应该等于客户端在内容长度字段中规定的长度值(这个值已经有了)。对信息的所有请求都公布到相同的URI上。URI的实例如下所示:
http://host:port/LcsInterface/ ,返回内容同样是定义好的XLM文件格式,只需要显示出来就行,请求格式如下所示:
POST http://xxx.xxx.xxx.xxx HTTP/1.1
Host: xxx.xxx.xxx.xxx
Content-Length: 959
<html>
<head><title>test</title></head>
<Envelope>
<body>
<?xml version="1.0" encoding="GB2312"?>
<!DOCTYPE REQ SYSTEM "LOCREQ.DTD">
<REQ>
........
</REQ>
</body>
</Envelope>
</html>
 
不是很复杂吧

直接把需要Post的XML文件读出来作为字符串Post

然后IDHTTP的返回数据就是你要的XML结果了

客户端处理一下就OK了
 
//不知道是不是你需要的
var
sXML: TStringList;
sText: String;
sStream: TStringStream;
begin
IdHTTP1.Port := 1234;
sXML := TStringList.Create;
sXML.LoadFromFile('c:/1.xml');
sText := 'Content-Length=959'#13#10'<html><head><title>test</title></head>' +
'<Envelope><body>' + sXML.Text + '</body></Envelope></html>';
sXML.Free;
IdHTTP1.Request.CustomHeaders.Text := sText;
sStream := TStringStream.Create('');
IdHTTP1.Post('http://xxx.xxx.xxx.xxx/LcsInterface/',sStream);
Memo1.Text := sStream.DataString;
sStream.Free;
end;
 
非常感谢楼上提供的代码,但在测试的过程中发现运行到
IdHTTP1.Post('http://xxx.xxx.xxx.xxx/LcsInterface/',sStream);
这行时,返回信息为:网关超时.我用telnet去ping服务器的2000端口一直是通的,
就不知这又是什么原因,再请指教,谢谢!
 
我的网络情况跟楼主的不同,这很难说明你的问题所在的。
能够 Ping 成功,只能表明客户端与服务器之间的线路连接是通的。
可能的话去确认一下服务器端是否收到这个 HTTP 请求,再分析出问题的地方吧。
 
上面的代码还存在另一个问题,就是把XML文件打开后,
文件中的回车和空格全变成了'#$D#$A',请问楼上如何去掉这些,感谢!
 
问题存在于待发送的 XML 文件?还是服务器端返回的 XML 文件?
 
肯定是待发送的XML文件呀,有返回XML文件那就爽了,
不管是什么至少成功大半了,
还有我想把最后的二进制文件流截取出来与规定的格式对比一下,
就知道问题所在了,
但不知如何截取出来,
还请高手献策,谢谢!
 
请大虾出招,感谢
PROCEDURE TForm1.Button1Click(Sender: TObject);
VAR
myParams: TStringList;
ret: TStringStream;
PostDataStream: TStringStream;
ParamData: TStringStream;
i: integer;
sXML: TStringList;
sText: STRING;
BEGIN
IdHTTP1.ReadTimeout := 10 * 1000; //设置超时时间10seconds
IdHttp1.Request.ContentType := 'application/x-www-form-urlencoded';
idhttp1.ProxyParams.ProxyPort := 2000;
idhttp1.Request.Host := '211.94.133.90';
idhttp1.Request.ContentLength := 959;
IdHTTP1.Request.Accept := 'text/html, */*';
idhttp1.Request.AcceptLanguage := 'en-us';
idhttp1.Request.AcceptEncoding := 'gzip,deflate';
idhttp1.Request.Connection := 'Keep-Alive';
idhttp1.Request.AcceptCharSet := 'ISO-8859-1';
idhttp1.Request.UserAgent :=
'Mozilla/4.0(compatible;MSIE 5.01;Windows NT 5.0;DigExt)';

IdHttp1.HTTPOptions := [hoForceEncodeParams];
ret := tstringstream.Create('');
myParams := tstringlist.Create;
TRY
PostDataStream := TStringStream.Create('');
ParamData := TStringStream.Create('');
sXML := TStringList.Create;
sXML.LoadFromFile('../demo.xml');
sText := sXML.Text;
FINALLY
sXML.Free;
END;

TRY
IdHTTP1.Request.CustomHeaders.Text := sText;
ParamData := TStringStream.Create('');
idhttp1.Post('http://211.94.133.90/LcsInterface', ParamData, ret);
showmessage(ret.DataString); //返回页面源码
showmessage(idhttp1.ResponseText); //返回错误信息
//memo2.Lines.Add('请求成功!');
memo2.Lines.Add(ret.DataString);
EXCEPT
//memo2.Lines.Add('请求失败!');
Label1.Caption := '请重新请求......';
myParams.Free;
ParamData.Free;
END;
idhttp1.Disconnect;
FreeAndNil(idhttp1);
freeAndNil(myparams);
Ret.Position := 0;
memo1.Lines.LoadFromStream(ret);
ret.Free;
form1.Refresh;
END;


XML文件请求内容如下:
POST http://211.94.133.90/a.lif HTTP/1.1
Host: 211.94.133.90
Content-Length: 959
Content-Type:text/xml
<html>
<Envelope>
<body>
<?xml version="1.0" encoding="GB2312"?>
<!DOCTYPE REQ SYSTEM "LOCREQ.DTD">
<REQ>

</REQ>
</body>
</Envelope>

以上是请求的代码,请求后返回信息如下,不知问题出在哪里,请指教,谢谢!
Socket Error #10054
Connection reset by peer;
 
终于调通了,非常感谢各位对我的支持,特别感谢liyinwei,祝大家工作顺利.
 
后退
顶部