Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2011.12.18;
Скачать: [xml.tar.bz2];

Вниз

Отправка Soap Headers   Найти похожие ветки 

 
Servy ©   (2011-09-05 13:10) [0]

Возникла необходимость написать клиент к одному SOAP-сервису. От авторов сервиса пришел пример, как должен выглядеть запрос, он приведен ниже. Я заменил url сервиса заказчика на "http://serviceurl/", ибо он длинный и не должен быть доступен широкой публике:

<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://serviceurl/" xmlns:ns2="redeemVoucher">
 <SOAP-ENV:Header>
  <ns2:Authorization>Basic b2N0b2JlcjoxMjM0</ns2:Authorization>
 </SOAP-ENV:Header>
 <SOAP-ENV:Body>
  <ns1:redeemVoucher>
  <partner_id>26538</partner_id>
  <voucher_id>9910000000980</voucher_id>
  <timeout>20</timeout>
  <transaction_data>Some data here
  </transaction_data>
  </ns1:redeemVoucher>
  </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

В Делфи я экспортнул wsdl"ку. Header в wsdl"ке не описан. Прочитав:

http://docwiki.embarcadero.com/RADStudio/en/Defining_and_Using_SOAP_Headers

Я написал следующий код:

TAuthHeader = class(TSOAPHeader)
private
 FAuthorization: string;
published
 property Authorization: string read FAuthorization write FAuthorization;
end;

// ...

initialization
 { VoucherService }
 InvRegistry.RegisterInterface(TypeInfo(VoucherService), "http://serviceurl/", "UTF-8"); // сгенерировано делфи
 
 InvRegistry.RegisterHeaderClass(TypeInfo(VoucherService), TAuthHeader, "Authentification", "");
 RemClassRegistry.RegisterSerializeOptions(TAuthHeader, [xoSimpleTypeWrapper]);
 
При вызове передаю заголовок следующим образом:

function SendRedeemVoucherW(PartnerId: PWideChar; VoucherId: PWideChar;
                           Timeout: Integer;
                           TransactionData: PWideChar): HRESULT;
var
 Headers: ISOAPHeaders;
 H: TAuthHeader;
begin
 LogWrite("redeemVoucher has been called", Standart);

 Headers := PartnerVoucherService as ISOAPHeaders;

 H := TAuthHeader.Create;
 H.Authorization := "Basic b2N0b2JlcjoxMjM0";
 Headers.OwnsSentHeaders := True;
 Headers.Send(H);

 Result := PartnerVoucherService.redeemVoucher(PartnerId, VoucherId,
                                               Timeout, TransactionData);
                                               

При этом, Делфи отправляет следующий запрос (я отформатировал xml, чтобы удобнее было читать):

POST / HTTP/1.1
SOAPAction: ""
Content-Type: text/xml; charset="utf-8"
User-Agent: CodeGear SOAP 1.3
Host: localhost:8333
Content-Length: 652
Connection: Keep-Alive
Cache-Control: no-cache

<?xml version="1.0"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
 <SOAP-ENV:Header>
  <NS1:TAuthHeader xmlns:NS1="urn:uVoucher">
   <NS1:Authorization>Basic b2N0b2JlcjoxMjM0</NS1:Authorization>
  </NS1:TAuthHeader>
 </SOAP-ENV:Header>
 <SOAP-ENV:Body>
  <redeemVoucher xmlns="http://services.partnergw.servop.ru/">
   <partner_id xmlns="">26538</partner_id>
   <voucher_id xmlns="">9910000000980</voucher_id>
   <timeout xmlns="">10</timeout>
   <transaction_data xmlns="">Some data</transaction_data>
  </redeemVoucher>
 </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

Сервис возвращает ошибку авторизации. Собственно вопрос - как передать soap-header так, как этого ждет сервис заказчика:

 <SOAP-ENV:Header>
  <ns2:Authorization>Basic b2N0b2JlcjoxMjM0</ns2:Authorization>
 </SOAP-ENV:Header>

А не так, как это происходит при использовании вышеприведенного кода, написанного (ну, я старался ^_^) согласно справке:

 <SOAP-ENV:Header>
  <NS1:TAuthHeader xmlns:NS1="urn:uVoucher">
   <NS1:Authorization>Basic b2N0b2JlcjoxMjM0</NS1:Authorization>
  </NS1:TAuthHeader>
 </SOAP-ENV:Header>


Есть злобный вариант - просто открыть сокет и писать туда все руками так, как этого ждет сервис. Но формирование SOAP запроса руками видится мне костылем, и убивает всю "идею" соапа.

P.S. Мои знания технологии SOAP, и тем более особенностей ее реализации в Делфи далеки до идеала.



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

Форум: "Начинающим";
Текущий архив: 2011.12.18;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.45 MB
Время: 0.003 c
2-1315288804
TrashReg
2011-09-06 10:00
2011.12.18
Ключи реестра Windows


1-1277278827
azatsh
2010-06-23 11:40
2011.12.18
как открыть dll засунутую вexe шник как ресурс


2-1315955658
WorkWork
2011-09-14 03:14
2011.12.18
SQL-запрос с диапозоном даты


15-1314908994
Юрий
2011-09-02 00:29
2011.12.18
С днем рождения ! 2 сентября 2011 пятница


2-1315253407
Captcha
2011-09-06 00:10
2011.12.18
Программный выбор элемента в ComboBox





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский