Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Обмен сообщениями в формате XML по протоколу HTTPS [D7, XP]


Страницы:   1 2 3

Igor_VM ©   (2010-05-12 16:19:00) 

Добрый день, возникла необходимость в реализации программы для отправки xml-сообщений (и приёма ответа) по протоколу https через интернет. Предполагается, что взаимодействие происходит посредством вызова методов интерфейса, реализованного в виде Web-сервиса. Для защищенного обмена данными между web-сервисом и предполаемым ПО используется протокол SSL, который обеспечивает аутентификацию web-сервера и аутентификацию клиента (посредством клиентских SSL-сертификатов), а так же шифрование передаваемых данных.
Также из описания:
Доступ к web-сервису осуществляется по протоколам: SOAP 1.1, SOAP 1.2, каждый из которых в качестве базового транспортного уровня использует HTTPS.
Взаимодействие с Web-сервисом http-входа описано согласно спецификации WSDL. В SOAP пакетах должна применяться кодировка UTF-8.
Интерфейс http-входа поддерживает один метод Transaction. Методу передается XML, содержащий элемент ... с атрибутом ... и т.д.

Т.е. сам веб-сервис уже функционирует. Моя проблема это отправлять туда xml-сообщения с помощью модуля, которые предстоит написать.

Просьба кто сталкивался с подобными разработками поделиться соображениями, с чего начать, какие компоненты использовать и др. информацию. Заранее спасибо.


Igor_VM   (2010-06-21 12:50:00) [1]

Подскажите правильно ли я понял, что нужно использовать IdHTTPRio? Если так, то я скачал целиком indy10 и начал последовательно подкладывать в каталог с приложением те pas-файлы, на которые ругается/ссылается при компиляции. Но сейчас не могу скомпилить проект полностью, ругается на один из модулей indy:
 [Error] IdStackConsts.pas(124): Identifier expected but 'TYPE' found
 [Error] IdStackConsts.pas(137): Undeclared identifier: 'TSocket'
 [Error] IdStackConsts.pas(246): Undeclared identifier: 'PF_INET'
 [Error] IdStackConsts.pas(247): Undeclared identifier: 'PF_INET6'
 [Error] IdStackConsts.pas(276): Identifier expected but 'CONST' found
 [Error] IdStackConsts.pas(299): Undeclared identifier: 'TIdSocketType'
 [Error] IdStackConsts.pas(300): Undeclared identifier: 'SOCK_STREAM'
 [Error] IdStackConsts.pas(301): Undeclared identifier: 'SOCK_DGRAM'
 [Error] IdStackConsts.pas(302): Undeclared identifier: 'SOCK_RAW'
 [Error] IdStackConsts.pas(304): Undeclared identifier: 'SOCK_RDM'
 [Error] IdStackConsts.pas(306): Undeclared identifier: 'SOCK_SEQPACKET'
 [Error] IdStackConsts.pas(325): Undeclared identifier: 'IPPROTO_ICMP'
 [Error] IdStackConsts.pas(326): Undeclared identifier: 'IPPROTO_ICMPV6'
 [Error] IdStackConsts.pas(328): Undeclared identifier: 'IPPROTO_IDP'
 [Error] IdStackConsts.pas(330): Undeclared identifier: 'IPPROTO_IGMP'
 [Error] IdStackConsts.pas(332): Undeclared identifier: 'IPPROTO_IP'
 [Error] IdStackConsts.pas(333): Undeclared identifier: 'IPPROTO_IPV6'
 [Error] IdStackConsts.pas(335): Undeclared identifier: 'IPPROTO_PUP'
 [Error] IdStackConsts.pas(336): Undeclared identifier: 'IPPROTO_RAW'
 [Error] IdStackConsts.pas(337): Undeclared identifier: 'IPPROTO_TCP'
 [Error] IdStackConsts.pas(338): Undeclared identifier: 'IPPROTO_UDP'
 [Error] IdStackConsts.pas(339): Undeclared identifier: 'IPPROTO_MAX'
 [Error] IdStackConsts.pas(365): Undeclared identifier: 'SOL_SOCKET'
 [Error] IdStackConsts.pas(380): Undeclared identifier: 'SO_BROADCAST'
 [Error] IdStackConsts.pas(381): Undeclared identifier: 'SO_DEBUG'
 [Error] IdStackConsts.pas(382): Undeclared identifier: 'SO_DONTROUTE'
 [Error] IdStackConsts.pas(383): Undeclared identifier: 'SO_KEEPALIVE'
 [Error] IdStackConsts.pas(384): Undeclared identifier: 'SO_LINGER'
 [Error] IdStackConsts.pas(385): Undeclared identifier: 'SO_OOBINLINE'
 [Error] IdStackConsts.pas(386): Undeclared identifier: 'SO_RCVBUF'
 [Error] IdStackConsts.pas(387): Undeclared identifier: 'SO_REUSEADDR'
 [Error] IdStackConsts.pas(388): Undeclared identifier: 'SO_SNDBUF'
 [Error] IdStackConsts.pas(389): Undeclared identifier: 'SO_TYPE'
 [Error] IdStackConsts.pas(441): Undeclared identifier: 'SO_RCVTIMEO'
 [Error] IdStackConsts.pas(442): Undeclared identifier: 'SO_SNDTIMEO'
 [Error] IdStackConsts.pas(450): Undeclared identifier: 'IP_TTL'
 [Error] IdStackConsts.pas(461): Undeclared identifier: 'INADDR_ANY'
 [Error] IdStackConsts.pas(463): Undeclared identifier: 'INADDR_NONE'
 [Error] IdStackConsts.pas(472): Undeclared identifier: 'TCP_NODELAY'
 [Error] IdStackConsts.pas(473): Undeclared identifier: 'INVALID_SOCKET'
 [Error] IdStackConsts.pas(474): Undeclared identifier: 'SOCKET_ERROR'
 [Fatal Error] IdStack.pas(143): Could not compile used unit 'IdStackConsts.pas'

Подскажите правильно ли я делаю и как исправить ошибку? Спасибо.


Igor_VM   (2010-06-09 12:50:00) [2]

Последний вопрос всё ещё актуален - подскажите как использовать сертификаты?


Igor_VM   (2010-06-04 15:56:00) [3]

Извиняюсь за навязчивость, а как использовать сертификаты - теперь ругается "A certificate is required to complete client authentification - URL:https:/...". Сами сертификаты были ранее подгружены.


Плохиш   (2010-06-04 13:57:00) [4]


> Igor_VM   (04.06.10 11:00) [36]
>
> Подскажите почему не компилится получившейся после импорта
> wsdl модуль, ругается на "    FtermType: termType;" - [Error]
> gateway.pas(49): Undeclared identifier: 'termType'? Подскажите
> как исправить ошибку?

Или они опубликованы в другом интерфейсе этой страницы или описывать их надо ручками.


Медвежонок Пятачок   (2010-06-04 11:05:00) [5]

читай комент к полученному модулю

The following types ....


Igor_VM   (2010-06-04 11:00:00) [6]

Подскажите почему не компилится получившейся после импорта wsdl модуль, ругается на "    FtermType: termType;" - [Error] gateway.pas(49): Undeclared identifier: 'termType'? Подскажите как исправить ошибку? Код:

// ************************************************************************ //
// The types declared in this file were generated from data read from the
// WSDL File described below:
// WSDL     : https:/.../gateway.wsdl
// Encoding : utf-8
// Version  : 1.0
// (03.06.2010 16:04:24 - 1.33.2.5)
// ************************************************************************ //

unit gateway;

interface

uses InvokeRegistry, SOAPHTTPClient, Types, XSBuiltIns;

type

 // ************************************************************************ //
 // The following types, referred to in the WSDL document are not being represented
 // in this file. They are either aliases[@] of other types represented or were referred
 // to but never[!] declared in the document. The types from the latter category
 // typically map to predefined/known XML or Borland types; however, they could also
 // indicate incorrect WSDL documents that failed to declare or import a schema type.
 // ************************************************************************ //
 // !:termType        - "https:/../"
 // !:termID          - "https:/../"
 // !:reqNum          - "https:/../"
 // !:reqDateTime     - "https:/../"
 // !:merchantCode    - "https:/../"
 // !:reqID           - "https:/../"
 // !:sum             - "https:/../"
 // !:currency        - "https:/../"
 // !:merchantData    - "https:/../"
 // !:paymentName     - "https:/../"
 // !:paymentID       - "https:/../"
 // !:respCode        - "https:/../"
 // !:confirm         - "https:/../"

 HostRequestType      = class;                 { "https:/../" }
 HostResponseType     = class;                 { "https:/../" }

 // ************************************************************************ //
 // Namespace : https:/../
 // ************************************************************************ //
 HostRequestType = class(TRemotable)
 private
   FtermType: termType;
   FtermID: termID;
   FreqNum: reqNum;
   FreqDateTime: reqDateTime;
   FmerchantCode: merchantCode;
   FreqID: reqID;
   Fsum: sum;
   Fcurrency: currency;
   FmerchantData: merchantData;
   FpaymentName: paymentName;
   FpaymentID: paymentID;
 published
   property termType: termType read FtermType write FtermType;
   property termID: termID read FtermID write FtermID;
   property reqNum: reqNum read FreqNum write FreqNum;
   property reqDateTime: reqDateTime read FreqDateTime write FreqDateTime;
   property merchantCode: merchantCode read FmerchantCode write FmerchantCode;
   property reqID: reqID read FreqID write FreqID;
   property sum: sum read Fsum write Fsum;
   property currency: currency read Fcurrency write Fcurrency;
   property merchantData: merchantData read FmerchantData write FmerchantData;
   property paymentName: paymentName read FpaymentName write FpaymentName;
   property paymentID: paymentID read FpaymentID write FpaymentID;
 end;

 // ************************************************************************ //
 // Namespace : https:/../
 // ************************************************************************ //
 HostResponseType = class(TRemotable)
 private
   FtermType: termType;
   FtermID: termID;
   FreqNum: reqNum;
   FreqDateTime: reqDateTime;
   FmerchantCode: merchantCode;
   FrespCode: respCode;
   Fconfirm: confirm;
   FmerchantData: merchantData;
 published
   property termType: termType read FtermType write FtermType;
   property termID: termID read FtermID write FtermID;
   property reqNum: reqNum read FreqNum write FreqNum;
   property reqDateTime: reqDateTime read FreqDateTime write FreqDateTime;
   property merchantCode: merchantCode read FmerchantCode write FmerchantCode;
   property respCode: respCode read FrespCode write FrespCode;
   property confirm: confirm read Fconfirm write Fconfirm;
   property merchantData: merchantData read FmerchantData write FmerchantData;
 end;

 // ************************************************************************ //
 // Namespace : https:/../
 // soapAction: https:/../
 // transport : https:/../
 // binding   : Gateway_x0020_ServiceSoap
 // service   : Gateway_x0020_Service
 // port      : Gateway_x0020_ServiceSoap
 // URL       : https:/...
 // ************************************************************************ //
 Gateway_x0020_ServiceSoap = interface(IInvokable)
 ['{E7586329-F434-629E-D77C-F83236C6A60F}']
   function  Transaction(const HostRequest: HostRequestType): HostResponseType; stdcall;
 end;

function Gateway_x0020_ServiceSoap(UseWSDL: Boolean=System.False; Addr: string=''; HTTPRIO: THTTPRIO = nil): Gateway_x0020_ServiceSoap;

implementation

function GetGateway_x0020_ServiceSoap(UseWSDL: Boolean; Addr: string; HTTPRIO: THTTPRIO): Gateway_x0020_ServiceSoap;
const
 defWSDL = 'https:/..';
 defURL  = 'https:/..';
 defSvc  = 'Gateway_x0020_Service';
 defPrt  = 'Gateway_x0020_ServiceSoap';
var
 RIO: THTTPRIO;
begin
 Result := nil;
 if (Addr = '') then
 begin
   if UseWSDL then
     Addr := defWSDL
   else
     Addr := defURL;
 end;
 if HTTPRIO = nil then
   RIO := THTTPRIO.Create(nil)
 else
   RIO := HTTPRIO;
 try
   Result := (RIO as Gateway_x0020_ServiceSoap);
   if UseWSDL then
   begin
     RIO.WSDLLocation := Addr;
     RIO.Service := defSvc;
     RIO.Port := defPrt;
   end else
     RIO.URL := Addr;
 finally
   if (Result = nil) and (HTTPRIO = nil) then
     RIO.Free;
 end;
end;

initialization
 InvRegistry.RegisterInterface(TypeInfo(Gateway_x0020_ServiceSoap), 'https:/.../', 'utf-8');
 InvRegistry.RegisterDefaultSOAPAction(TypeInfo(Gateway_x0020_ServiceSoap), 'https:/...');
 RemClassRegistry.RegisterXSClass(HostRequestType, 'https:/.../', 'HostRequestType');
 RemClassRegistry.RegisterXSClass(HostResponseType, 'https:/.../', 'HostResponseType');

end.


Плохиш   (2010-06-03 23:53:00) [7]


> Igor_VM   (03.06.10 12:45) [33]
>
>
> > попросить делфи импорировать wsdl так и не догадались?
>
>
> Если можно подробнее, был бы оч признателен?

Поподробней было в [1]

> Медвежонок Пятачок ©   (03.06.10 13:13) [34]
>
> у него же транспорт другой.
> а пойдешь стандартным и легким - встанет вопрос как прикрутить
> ssl

А что там за проблемы?


Медвежонок Пятачок   (2010-06-03 13:13:00) [8]

у него же транспорт другой.
а пойдешь стандартным и легким - встанет вопрос как прикрутить ssl

хотя импортнуть все же стоит. для посмотреть.


Igor_VM   (2010-06-03 12:45:00) [9]


> попросить делфи импорировать wsdl так и не догадались?

Если можно подробнее, был бы оч признателен?


Плохиш   (2010-06-03 12:15:00) [10]

Хм, т.е. попросить делфи импорировать wsdl так и не догадались? Зачем они нужны лёгкие пути...


Медвежонок Пятачок   (2010-06-03 10:14:00) [11]

тогда все нормально.

было подозрение что там windows-1251 + данные в 1251
в этом случае, так как xmlhttp не в курсе, что посылается xml, рассматривает весь контент как просто строку.
он переколбасит все что в 1251 в утф, а в прологе останется "windows-1251", так как эта строка в латинице.
в результате на сервер придет ерунда.

но здесь очевидно не тот случай.
надо искать 10 отличий между тем что описано в сервисе и тем что ему посылается


Igor_VM   (2010-06-03 10:08:00) [12]

<?xml version="1.0" encoding="utf-8"?><soap:Envelope xmlns:soap="http:/..." xmlns:xsi="http:/..." xmlns:xsd="http:/...">
 <soap:Body>
   <Transaction xmlns="https:/.../">
     <HostRequest operation="auth">
       <termType>2</termType>
       <termID>00012200</termID>
       <reqNum>8980</reqNum>
       <reqDateTime>20100531163000</reqDateTime>
       <merchantCode>MTS</merchantCode>
       <reqID>9160000000</reqID>
       <sum>1</sum>
       <currency>810</currency>
     </HostRequest>
   </Transaction>
 </soap:Body>
</soap:Envelope>


Медвежонок Пятачок   (2010-06-03 10:04:00) [13]

покажи пролог из C:\My_Docs\Tasks\Projects\Web-Client\XML\auth.xml

какая там кодировка?


Igor_VM   (2010-06-03 09:54:00) [14]

Я понял, но системная ошибка всё-равно осталась ("системная ошибка -2146697208"). Эту xml я пробывал открывать через xml-notepad, IE и др. - никаких проблем. Кто-то в курсе что это за ошибка?


АВМ   (2010-06-03 09:29:00) [15]

Надо так:
xReq.load('C:\My_Docs\Tasks\Projects\Web-Client\XML\auth.xml');

А в xReq.loadxml в качестве параметра надо подсовывать содержимое xml-файла


Медвежонок Пятачок   (2010-06-02 18:25:00) [16]

>Из-за чего это может быть?

Вот смотри, я у тебя тоже спрошу:

Имею вот такой код:
ShowMessage('c:\myfolder\myfile.txt');

При этом ожидаю, что на экране выскочит сообщение с текстом, который содержится внутри 'c:\myfolder\myfile.txt'.

но вместо этого почему-то мне выводится мессадж с текстом (буквально таким) :

'c:\myfolder\myfile.txt'

Из за чего это может быть?


Медвежонок Пятачок   (2010-06-02 18:09:00) [17]

Ошибка здесь
xReq.loadxml('C:\My_Docs\Tasks\Projects\Web-Client\XML\auth.xml');


Igor_VM   (2010-06-02 18:08:00) [18]

Я узнавал, что видят в логах в моих запросах - как оказалось пустые запросы. Можно ли проверить корректность xml-загрузки таким образом?:
procedure TMainForm.Button1Click(Sender: TObject);
var
  xReq    : IXMLDOMDOcument;
begin
  xReq := CoDomDocument.Create;
  xReq.loadxml('C:\My_Docs\Tasks\Projects\Web-Client\XML\auth.xml');
  MemoXML.Text := xReq.Text;
end;

Если да, то в мемо действительно пустое. Из-за чего это может быть?


Медвежонок Пятачок   (2010-06-02 17:08:00) [19]

значит серверу не нравится твой запрос. он может быть валидным xml, но не соответсвовать формату. либо он и валидный и соответствует, но послан не туда куда надо


Igor_VM   (2010-06-02 17:04:00) [20]

Bad Request


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо