1

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

host := TidHTTP.Create; 
host.Socket.Port := 80; // error right here!
host.Socket.Host := 'system.human.com.br';
uri := TidURI.Create();

原始组件是在 Indy60 中创建的,而我有 Indy170,所以Socket两者之间没有hostPort我不得不把它放进去。

怎么了?我尝试将组件直接放在表单上,​​并在按钮代码中进行了套接字设置,但我也遇到了同样的错误!


他们使用的发送方法是这样的:

 data := TIdMultiPartFormDataStream.Create;
 host.Request.ContentType := 'application/x-www-form-urlencoded';
 host.Post(strSMStext , data);
4

1 回答 1

3

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

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. 你不能覆盖它。尝试使用发送 MIME 编码的数据application/x-www-form-urlencoded是完全错误的。如果您真的想发送application/x-www-form-urlencoded数据,则需要发布一个TStrings对象,例如:

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

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

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

  1. 从构造函数中移除http.Porthttp.Host属性的赋值。TSMSSender

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

    //StrEnvio := '/GatewayIntegration/msgSms.do?dispatch=send' +
    StrEnvio := 'http://system.human.com.br/GatewayIntegration/msgSms.do?dispatch=send' +
    
  3. 在 中TSMSSender.MultipleSend(),删除http.Request.ContentType属性的赋值。

于 2013-06-06T17:51:04.927 回答