ПредишенСледващото

Странното е, но SOAP (S изпъл О bject ДОСТЪП P rotocol различни платформи, крос-езикови технологии стартиране обекти ..) - това е много лесно, но когато започнах да работя с него в Делфи. Не можах да разбера от коя страна да го подход. В действителност, дизайнът на SOAP приложения, трябва да отговарят на условията, доста малко, а след това всичко ще работи добре, и тези прости условия, и аз ще се опитам да се справи тук.

На първо място, и защо това е сапуна? Основният плюс две: SOAP е обществен стандарт за кръстосано програма взаимодействие и нямат нищо, за да се знае за клиент сървър - нито си език, нито на платформата; SOAP интерфейси са самостоятелно документиране, т.е. сървъра е длъжен да предостави на клиента с подробно описание на интерфейса, неговите функции, входни и изходни параметри.

Главното условие за програмиране SOAP: сървърът трябва да е без гражданство. т.е. резултат на заявката трябва да бъде независим от предишните команди, получени от сървъра. Това означава, че всички параметри на сесията трябва да се съхраняват на клиента и се изпраща на сървъра, като част от заявката (ако е необходимо). Това гарантира висока стабилност и мащабируемост на системата (на клиента може да се превключи на друг сървър, без дори да го осъзнават), въпреки че редица обичайния екстри dvuhzvenki на престава да бъде налице:

  • вие не можете да контролирате изрично сделки с клиента (сървър прави)
  • съответно не може да блокира влизането на редактиране (освен да се приемат специални полеви знамена в ПБ)
  • екип не може да премине параметри, а другият да се разгледа резултатът - той трябва да се проведе в рамките на една команда
  • не можеш да работиш с един куп класически шедьовър (но TClientDataset предвижда този чудесен инструмент: вложени масиви от данни - вложени таблици)
  • Не можете да използвате ClientDataSet.PacketRecords имуществените> 0, тъй като сървър "не помня", че той вече е преминал на клиента, както и че - не, тази функционалност трябва да се прилагат с помощта на допълнителни параметри на заявката,
  • . ако той е забравил нещо - аз ще добавя по-късно

Обикновено SOAP-приложение

Тези примери се разглеждат във всяка литература върху развитието на SOAP в Делфи.
Пусни Delphi и изберете File | Нова | Други. , отидете в раздела и изберете WebServices SoapServer кандидатстване.

Вие ще бъдете помолени да изберете от 5 опции:

  • ISAPI / NSAPI Динамичен Линк Libarry - връзка библиотека за IIS / Netscape сървъри. Всяка заявка се предава като структурата и обработени от отделна нишка.
  • CGI Самостоятелна Изпълнител - приложение за конзолата, която получи искане за стандартния вход, връща отговор на стандартния изход, всяка заявка се обработва от отделен екземпляр на заявлението,
  • Win-CGI Самостоятелна Изпълнител - приложение на Windows. Обменът на данни се осъществява чрез INI-файл (не се препоръчва за употреба като остаряла)
  • Apache Споделено Module (DLL) - връзка библиотека за сървъра Apache. Всяка заявка се предава като структурата и обработени от отделна нишка,
  • WebAppDebugger Изпълнител - връзка библиотека за отстраняване на грешки сървърни кораби с Delphi. защото WebAppDebugger също е на сървъра COM, трябва да се уточни (произволна) CoClass име на обекта, COM, с помощта на които ще бъдат причинени от вашия уеб модул.

Изберете CGI Самостоятелна Изпълнител. като най-простите до отстраняване на грешки формат, а след това на заявлението може лесно да се преобразува в друг. Номерът е, че ако всички логиката на приложението е съсредоточена в модули, написани от вас, вие трябва само да създадете нова молба на необходимия тип, се свържете с nimu техните модули, и тя работи!

След като кликнете OK, новото приложение ще бъде генериран съдържащ WebModule три компонента:

  • THTTPSoapDispatcher - получава входящо SOAP пакети и ги предава към компонент, неговата специфична диспечерски собственост (обикновено THTTPSoapPascalInvoker),
  • THTTPSoapPascalInvoker - получава искане входящо SOAP, намира Призив регистър, наречен метод изпълнява (извиква) той генерира и изпраща отговор го obrabno THTTPSoapDispatcher.
  • TWSDLHTMLPublish - генерира WSDL (W дб S ervices D писание L anguage), данните описание и връзките, поддържани от модула.

Спасете създал приложението, то ще бъде скелета на нашия сървър.

Oddity по-късно забелязах, че WebModule. създаден за WebAppDebugger. малко по-различно от другото приложение опции Онлайн

какво се случва, аз не разбирам, но без да ги prilozhnie под WebAppDebugger-OM не работи.

Нека да го напълни с логика. Тъй като и сървъра и клиента ще се изисква описване структури на предаваните данни и интерфейси, по-добре е да ги направят в отделен модул, както и всички реализацията на сървъра - в другата. За да направите това, да създадете два модула (File | New | единица) и спаси един от тях под CentimeterInchIntf.pas името. а другите - CentimeterInchImpl.pas. Вътре CentimeterInchIntf.pas въведете следното:

По този начин ние сме идентифицирали ICmInch интерфейс. предоставя две функции: конвертиране на сантиметри в инчове и сантиметри до сантиметър, и то регистриран в InvokeRegistry.

Занимаваме се с изпълнението. В CentimeterInchImpl.pas определи потомък TInvokableClass. реализираме ICmInch интерфейс.

Както можете да видите, ние сме внедрили в TCmInch двете функции ICmInch интерфейс. и също регистрира новата ни invokable клас в InvokeRegistry (по принцип, всичко, което ще се предава по мрежата трябва да бъдат вписани в него, с изключение на скаларни типове).

Създаване на ново заявление (конвенционален тип), въведете в нашия раздел използва CentimeterInchIntf на интерфейсен модул. поставете върху основната форма два бутона, полета за въвеждане и двукомпонентен THTTPRIO с WebServices палитра.

Сега, когато компилирате и стартирате приложението, можете да конвертирате см в инча и обратно.

Q: Какво да правим, ако сървърът за SOAP е написана от някой друг и ние нямаме модула интерфейс?
A: Тогава ние трябва да се възползваме от Web Service вносител. което е във файла | Нова | Други. , в раздела WebServices. Този помощник генерира WSDL интерфейсен модул за обслужване.

Прехвърляне на сложни видове

Нашата компонент THTTPSOAPPascalInvoker вече знае как да предаде скаларни типове и динамични масиви (последните трябва да бъдат предварително регистрирани в InvokeRegistry. Cm. По-долу), но и за превоза на сложни видове, като например статичен масив. интерфейс. запис. зададете или клас. първо трябва да ги опише като потомци TRemotable клас. като по време на работа Тип Информация (RTTI). Например, ако искаме да декларираме клас, който се връща в размер на валутата и името му, нашата интерфейсен модул ще изглежда така:

Тук ние оповестен допълнително динамичния масив TCurrencyArray. в случай, че искате да премине (обърнете внимание на разликата в отбора класа и регистрационни масив).
В действителност, пълна регистрация клас синтаксис на командите е малко по-широк, посетителите могат да четат за това в документацията за Delphi.

Забележка: Ако има вид, че документ, WSDL е скаларна, но няма пряка кореспонденция в обекта Pascal (например, DateTime), както на базовия клас да бъдат използвани TRemotableXS. съобщава, че два метода XSToNative NativeToXS и да я превърне в представителството на низ в обекта Pascal и обратно (тези методи е необходимо, разбира се, изпълнение).
Като част от Delphi идва XSBuiltIns модул. в която много полезни функции са реализирани (но версия 6.0 е имало грешки при обработката на датата, ако регионалните настройки в системата не са на английски език).

Интересен въпрос по създаването-разрушаването на обектите подават като параметри. Ето какво пише в документацията за TRemotable:
"От потомците TRemotable сървър. Входове се създават автоматично по време на разопаковането (unmarshal) метод повикване и изтриват автоматично след опаковането (бойните) изходни параметри за предаване на клиента.
Потомците TRemotable. е създаден в рамките на метода, ползвана от invokable интерфейс. Те се изтриват автоматично, след като те са опаковани стойност (маршал) за предаване на клиента.
Клиент причинявайки invokable интерфейс. Той е отговорен за създаване на обекти, които се използват като входни параметри и за унищожаването на всички потомци на TRemotable. той е създаден, както и в резултат от викането на метода ".

Трансфер Dataset-а

Тук всичко е съвсем проста. Докато прилагането Сапун сървър на проекта. Изберете менюто File | Нова | Други. , отидете в раздела и изберете WebServices SoapServer Модул данни. По-нататъшното развитие не се различава от конвенционалното приложение MIDAS, с две функции: сървърът трябва да е без гражданство - постъпилите заявки, аз казах забравил (например, CGI модул буквално след всяко повикване е завършена) и да има не повече от един SoapDataModule.
Поставете получените компоненти за достъп до модула за данни (например, TClientDataset), те определят всички необходими качества, за да работят. Сложете TDataSetProvider. го свържете към компонента за достъп до данни.

Skompilliruyte заявление и го поставете където тя може да работи на уеб-сървъра (по някаква причина не можах да го пуснете под WebAppDebugger. Аз може би използвали неправилно WebModule. Cm. Имайте предвид, по-горе).

Клиентското приложение постави на формата и TSoapConnection TClientDataset. SoapConnection.URL да въведете пътя до интерфейса на вашия сървър:

SoapDataModule да използвате конкретна интерфейс. и може да бъде по-общо - IAppServer. В TClientDataset.RemoteServer точка до TSoapConnection. Сега, поставяйки TClientDataset.Active:=true. Получаваме данни на клиента.

Когато изкопаване набор от данни на сървъра се нуждае от някои параметри, ще бъде удобно вместо Active Setup: = искане вярно употреба DataRequest (не забравяйте, че за SOAP приложения, всички параметри трябва да бъдат предадени в рамките на една заявка, която не може да бъде първоначално се определят параметрите, и след това да задава въпроси на данните, тъй като най-вероятно второто искане отива на друг сървър например). Тя изглежда по този начин.
На клиента.

т.е. сървър, можете да прехвърляте всякакви данни (приет с типа - OleVariant) и да се върнат отново данните, всякакъв вид, например datapacket. като в този случай.

Ако промените данните на клиента и искате да ги запазите на сървъра, има няколко начина да направите това. Най-просто - инсталиране TDataSetProvider.ResolveToDataSet: = фалшива и да причини TClientDataset метод ApplyUpdates. Актуализация на искания, дори и ако той образува TDataSetProvider. и контрол (по-скоро слаба, все пак) може да се извърши за формирането на тези заявки, като използват TField.ProviderFlags свойства.

Освен това, можете да инсталирате TDataSetProvider.ResolveToDataSet: = вярно. но в този случай в TDataSetProvider.OnBeforeApplyUpdates на събитието трябва да отворите свързан набор от данни. така че записът е бил зареден в това, което ще се промени. Но сега можете да използвате методи набор от данни BeforeInsert-BeforePost.

И последният вариант: да се използват свой собствен метод, добавен към интерфейса, като преди това е било направено с Cm2Inch, и го изпрати ClientDataset.Delta. или набор от инструкции за актуализиране или нещо, което казва на въображението си на предприемача. Например.

В този пример, методът на SaveChanges отнема datapaket тип Делта и връща масата за грешка, възникнал по време на ъпгрейд.

За любопитните: форматиране на пакети данни е описан в community.borland.com. но в действителност тя е изпратен като двоичен (base64Binary) пакет в същия формат, като (. CD-та *) файла, описанието на този формат не можах да намеря.
За да видите как наистина да изглеждат пакетите, предавани по мрежата, можете да използвате програмата tcpTrace. или WebAppDebugger-дере.

Работа с майстор-подробно

Тук също, всичко е просто, но - малко необичайно, тъй като част трябва да бъде приет като вложено маса в главния набор от данни. както обикновено майстор-подробно на един куп TClientDataSet невъзможно. Ето как.

Модулът за сапун сървър на данни е поставена масиви от данни към главния таблицата за подробности и, както обикновено, са свързани чрез TDataSource. Има също така да сложите един TDatasetProvider. който се свързва с майстор маса. Сървърът е съставен и се поставят, където може да работи уеб-сървър.

Вторият TClientDataSet (това ще бъде наша страна) да определи единен имот: DataSetField (изберете име от списъка за първи набор от данни TDataSetField). Сега, ако ние комбинираме нашите TClientDataSet-и с мрежи. ние виждаме нашето данни - отделен майстор маса и детайли.

Съществува алтернатива: капитанът и детайли се предават отделно TMemTableEh. Заготовката се зарежда изцяло. и да изберете набор от подробни записи, съответстващи на определена линия на майстори, филтриране се използва на клиента, но няма да има проблеми с едновременна актуализация на капитана и детайл.

Преместване в друга вид приложение

Ако вече сте играли достатъчно с WebAppDebugger-ти и CGI, можете да изтрие ", така да се каже, на Шекспир" модул ISAPI / NSAPI.

По принцип, за да се премине от един вид приложение на друго (да речем от WebAppDebugger да CGI) е много проста. Създаване на ново приложение изисква тип, към тях се прибавят всички наши модули и ново приложение се изпълнява! Освен ако, разбира се, че не е пускал във всеки код се генерира автоматично от модули, които аз лично не препоръчвам.

И все пак трябва да се помни за споменатите по-горе разлики WebModule за WebAppDebugger и CGI, както и разликата в CGI и ISAPI приложения: в първия случай, копие от заявлението на връзката (т.е. с всяко приложение има един потребител), а вторият - прилагането един, но всяка връзка в рамките на приложението създава отделна нишка, която изисква внимателно боравене с общи данни, а останалата част - не е проблем.

Забележка: SOAP сървър, съставен в Delphi 7 (а може би и по-висока) Езикова chuvsvitelny на сървъра, на който те работят - се основава на това, те конвертирате български букви от WIN1251 да UTF8. Т.е. в необходимостта да се сложи на страната "България" национални настройки Сървър операционна система, или вместо на българските букви получите kryakozyubry.
или да добавите всяко модул инициализация код низ

която ще доведе до вашето устройство да се използва името на руския кодиране по подразбиране.

Като допълнителна литература съветваме да потърсите:

  1. BizSnap глава на Guide Kylix програмиста (особено части 4-6)
  2. InterBase в Многослойна World а
  3. Проектиране ISAPI приложения за работа с бази данни
  4. . и разбира се - RTFM. но с търсенето в тези секции по някаква причина, голям проблем, но информацията в помощта, има много подробен,
  5. и - тези демонстрационни приложения. които идват с Delphi

Предложения, свързани с развитието на тази статия са добре дошли да. [email protected]

Свързани статии

Подкрепете проекта - споделете линка, благодаря!