Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2010.09.12;
Скачать: CL | DM;

Вниз

Обмен сообщениями в формате XML по протоколу HTTPS   Найти похожие ветки 

 
Igor_VM   (2010-05-12 16:19) [0]

Добрый день, возникла необходимость в реализации программы для отправки 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-сообщения с помощью модуля, которые предстоит написать.

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


 
Плохиш ©   (2010-05-12 16:27) [1]


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

С чтения "Developer guide" раздел про разработку web-services.


 
Dennis I. Komarov ©   (2010-05-12 17:44) [2]


> Плохиш ©   (12.05.10 16:27) [1]

Дык, он вроде как уже фунцикулирует...


> Igor_VM   (12.05.10 16:19)  

ИМХО начать с изучения транспорта, т.е. HTTP, SSL, HTTPS


 
Медвежонок Пятачок ©   (2010-05-12 17:50) [3]

ИМХО начать с изучения транспорта

А может тогда уж начать с изучения что такое электрический ток и как он течет по проводам?

:)

PS
посетить страницу описания сервиса.
взять шаблон xml запроса.
заполнить его данными.
создать экземпляр xmlhttprequest"a
выполнить send, получить и разобрать респонс.


 
Igor_VM   (2010-05-12 18:04) [4]

А можно с этого места по-подробнее:
"...создать экземпляр xmlhttprequest"a
выполнить send, получить и разобрать респонс" ? :) Шаблон xml-запроса у меня есть и заполнить данными не проблема.


 
Медвежонок Пятачок ©   (2010-05-12 18:15) [5]

uses MSXML2_TLB;
....

var xmlhttp : IXMLHTTPRequest;
   xResp   : IXMLDOMDOcument2;  
begin
xmlhttp := CoXMLHTTP.Create;
xmlhttp.open("POST",<WEB_SERVICE_URL>,False,EmptyParam,EmptyParam);
//опционально изменяем хедер если сервису оно надо
//xmlhttp.setRequestHeader(<field_name>,<field_value>);
xmlhttp.send(<XML_REQUEST_BODY>);
xResp := CoDomDocument.Create;
xResp.async := false;
if xResp.LoadXml(xmlhttp.responseText) then  
 ShowMessage("вуаля"#13#10 + xResp.xml);
end;


 
Плохиш ©   (2010-05-12 23:21) [6]


> Dennis I. Komarov ©   (12.05.10 17:44) [2]
>
>
> > Плохиш ©   (12.05.10 16:27) [1]
>
> Дык, он вроде как уже фунцикулирует...

Вообще-то там описано и создание клиентов, да и совсем удивительная вещь, для некоторых, как импортировать в свой проект wsdl.
Но потратить полчаса на беглый просмотр не по пацански, интересней часами на форуме сидеть, может и задача сама рассосётся...


 
Igor_VM   (2010-06-01 10:48) [7]

Добрый день, пока возникает except на отправке xmlhttp.send(<XML_REQUEST_BODY>); - "системная ошибка -2146697208". Предполагаю, что из-за того, что не подгружен файл сертификата (*.pfx). Подскажите, плз, как его использовать? Спасибо.


 
Palladin ©   (2010-06-01 12:11) [8]

правой кнопкой в проводнике его использовать...

...эти люди, ЧП, пишут такие серьезные вещи, к которым их и на километр подпускать нельзя...


 
Медвежонок Пятачок ©   (2010-06-01 12:15) [9]

Предполагаю, что из-за того, что не подгружен файл сертификата (*.pfx).

Предполагаю, что это ошибочное предположение.
xmlhttp работает так же как и ие.
Для ие сертификат должен быть в системном хранилище и должен быть связан со своим приватным контейнером.
А связанным он может быть только будучи в системном хранилище.


 
Igor_VM   (2010-06-01 13:44) [10]

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


 
Igor_VM   (2010-06-01 13:57) [11]

Если я отправляю xmlhttp.send(null); с пустыми параметрами, то получаю ответ. Видимо, сертификат ни при чём.


 
Медвежонок Пятачок ©   (2010-06-01 15:43) [12]

Ты: Предполагаю, что из-за того, что не подгружен файл сертификата (*.pfx).

Я : Предполагаю, что это ошибочное предположение.

Снова ты: Видимо, сертификат ни при чём.


 
Igor_VM   (2010-06-01 16:07) [13]

Да, спасибо. На пустой запрос приходит ответ "
<?xml version="1.0"?>
<...Server was unable to process request. ---> Root element is missing...".

На непустой системная ошибка. Код ниже:


var
  xmlhttp : IXMLHTTPRequest;
  xReq    : IXMLDOMDOcument;
  xResp   : IXMLDOMDOcument;
begin

 xReq := CoDomDocument.Create;
 xReq.async := false;
 xReq.LoadXML("C:\...\filename.xml");

 xmlhttp := CoXMLHTTP.Create;
 xmlhttp.open("POST","web_service_url",False,EmptyParam,EmptyParam);

 try
   xmlhttp.send(xReq);
//    xmlhttp.send(null);
  except
   ShowMessage("Err!");
 end;

 xResp := CoDomDocument.Create;
 xResp.async := false;

 if xResp.LoadXml(xmlhttp.responseText) then
   ShowMessage(xResp.xml);

 xmlhttp.abort;

end;


Как можно определить из-за чего появляется системная ошибка?


 
Медвежонок Пятачок ©   (2010-06-01 16:09) [14]

Root element is missing.....


 
Медвежонок Пятачок ©   (2010-06-01 16:25) [15]

xReq    : IXMLDOMDOcument;
....
xmlhttp.send(xReq);

Интересно, зачем посылать серверу экземпляр IXMLDOMDOcument?
Оно ему надо?


 
Igor_VM   (2010-06-02 14:43) [16]

Понял. Я по всякому пробовал - создавал XMLDocument  и отправлял:
xmlhttp.send(XMLDocument.XML.CommaText);
, а также прописывал в коде саму xml-ку внутри функции. Результат был такой же. А как корректно, есть какой-нить пример (на форуме я похожего не обнаружил)?


 
Медвежонок Пятачок ©   (2010-06-02 15:53) [17]

какой в задницу комматекст?

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


 
Медвежонок Пятачок ©   (2010-06-02 15:54) [18]

xReq.xml и все.


 
Igor_VM   (2010-06-02 16:30) [19]

:) спасиб, теперь отправляется xmlhttp.readyState = 4, но статус 400, т.е. видимо ошибка загрузки документа, соответственно ответа не получаю.


 
Медвежонок Пятачок ©   (2010-06-02 16:48) [20]

0 - Unitialized
1 - Loading
2 - Loaded
3 - Interactive
4 - Complete


 
Медвежонок Пятачок ©   (2010-06-02 16:49) [21]

а что возвращено в statusText?


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

Bad Request


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

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


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

Я узнавал, что видят в логах в моих запросах - как оказалось пустые запросы. Можно ли проверить корректность 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 18:09) [25]

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


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

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

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

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

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

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

"c:\myfolder\myfile.txt"

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


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

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

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


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

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


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

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

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


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

<?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:14) [31]

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

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

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


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

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


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


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

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


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

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

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


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


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

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

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

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


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

Подскажите почему не компилится получившейся после импорта 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-04 11:05) [37]

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

The following types ....


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


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

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


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

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


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

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



Страницы: 1 2 вся ветка

Текущий архив: 2010.09.12;
Скачать: CL | DM;

Наверх




Память: 0.59 MB
Время: 0.015 c
2-1276805385
DiamondeX
2010-06-18 00:09
2010.09.12
Открытие диалога из формы наследника


15-1276679561
vajo
2010-06-16 13:12
2010.09.12
диски для raid


15-1276585131
brother
2010-06-15 10:58
2010.09.12
Любителям zx-spectrumа: видео...


15-1276664088
И. Павел
2010-06-16 08:54
2010.09.12
Самоучители/документация по ABAP и SAP


6-1225222273
SKIPtr
2008-10-28 22:31
2010.09.12
Изменения файла в интернете