2013-06-06 1 views
1

Я пытаюсь использовать SMS-API для Delphi от http://www.human.com.br, но я получаю ошибку «нарушение прав доступа», когда компонент пытается установить хост и порт веб-сервис после создания экземпляра Indy's TIdHTTP.Ошибка в TIdHTTP при настройке хоста и порта во время выполнения для доставки веб-сервисов SMS

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

оригинальный компонент был создан в Indy60 и я Indy170, так что не было Socket между host и Port, и я должен был поставить его.

Что не так? Я попытался поместить компонент непосредственно в форму и в код кнопки, я сделал настройки Socket, и я тоже получаю ту же ошибку!


Метод отправки они используют это:

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

Почему вы устанавливаете хост или порт вообще? Вы можете указать адрес, когда вы вызываете 'Get' или' Post'. –

+0

Assert (Assigned (Host.Socket)) – bummi

+0

Я не сделал этого кода. Это от human.com.br, как сказано в вопросе. Но они сказали, что не поддерживают нас indy10 или delphi-xe3. – PSyLoCKe

ответ

2

Свойства Socket это особое свойство, что обеспечивает более легкий доступ к функциональным возможностям сокета конкретного, когда ток IOHandler точки значения свойства в компоненте в TIdIOHandlerSocket потомка , В противном случае это nil. Не следует устанавливать свойства Socket.Host и Socket.Port. TIdTCPClient.Connect() обрабатывает это внутренне для вас. Чтобы установить Host/Port, вместо этого вам необходимо использовать свойства TIdTCPClient.Host и TIdTCPClient.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! 

так что не свойства Host/Port вручную. Это всегда верно в каждой версии Indy с компонентом TIdHTTP.

Публикация 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); 

При написании TIdMultipartFormDataStream или TStrings, пусть TIdHTTP.Post() решить, какой Content-Type значение использовать, не устанавливайте его вручную ,

Глядя на код библиотеки вы предоставили ссылку, следующие изменения должны быть сделаны:

  1. Снимите разводка http.Port и http.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 имущества.