在运行时为SMS Web服务交付设置主机和端口时TIdHTTP出错

时间:2013-06-06 15:49:33

标签: web-services delphi http indy delphi-xe3

我正在尝试从http://www.human.com.br为Delphi使用SMS API,但是当组件在创建Indy的{{1}实例后尝试设置web服务的主机和端口时,我收到“访问冲突”错误}}

TIdHTTP

原始组件是在Indy60中创建的,我有Indy170,所以host := TidHTTP.Create; host.Socket.Port := 80; // error right here! host.Socket.Host := 'system.human.com.br'; uri := TidURI.Create(); Socket之间没有host,我不得不把它放进去。

有什么问题?我试图将组件直接放在表单上,​​在按钮代码中我做了套接字设置,我也得到了同样的错误!


他们使用的发送方法是:

Port

1 个答案:

答案 0 :(得分:2)

Socket属性是一个特殊属性,当当前IOHandler属性值指向TIdIOHandlerSocket后代组件时,可以更轻松地访问特定于套接字的功能。否则为nil。您不应该直接设置Socket.HostSocket.Port属性。 TIdTCPClient.Connect()为您内部处理。要设置主机/端口,您需要使用TIdTCPClient.HostTIdTCPClient.Port属性。但是,TIdHTTP是该规则的一个例外,因为TIdHTTP会根据您传递给它的URL在内部为您设置主机/端口属性,例如:

host := TidHTTP.Create; 
host.Get('http://system.human.com.br/', ...); // <-- sets Host and Port for you!

host := TidHTTP.Create; 
host.Post('http://system.human.com.br/', ...); // <-- sets Host and Port for you!

所以不要手动设置主机/端口属性。在每个具有TIdHTTP组件的Indy版本中,这一直都是如此。

发布TIdMultiPartFormDataStream个对象会强制Content-Type标题为multipart/form-data。你无法覆盖它。尝试使用application/x-www-form-urlencoded发送MIME编码数据是完全错误的。如果您确实要发送application/x-www-form-urlencoded数据,则需要发布TStrings对象,例如:

data := TStringList.Create;
data.Add('name=value');
...
host.Post(strSMStext , data);

发布TIdMultipartFormDataStreamTStrings时,让TIdHTTP.Post()决定使用哪个Content-Type值,不要手动设置。

查看您提供链接的库代码,需要进行以下更改:

  1. http.Port构造函数中删除http.HostTSMSSender属性的分配。

  2. TSMSSender.SimpleSend()中的
  3. ,将所需的主机添加到正在创建的URL中:

    //StrEnvio := '/GatewayIntegration/msgSms.do?dispatch=send' +
    StrEnvio := 'http://system.human.com.br/GatewayIntegration/msgSms.do?dispatch=send' +
    
  4. TSMSSender.MultipleSend()
  5. ,删除http.Request.ContentType属性的分配。