SOAP запрос без WSDL файла

PLATONOVDMITRIY
Дата: 16.12.2019 08:35:30
Как можно обработать SOAP-запрос без WSDL-файла?

Например, есть запрос:
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<LastUpdate xmlns="http://web.cbr.ru/" />
</soap:Body>
</soap:Envelope>

Это запрос LastUpdate для получения даты последнего обновления базы по КО, взятый с сайта ЦБ РФ (https://www.cbr.ru/CreditInfoWebServ/CreditOrgInfo.asmx). Предположим, что самого WSDL нет. Как в таком случае можно обработать запрос?
PLATONOVDMITRIY
Дата: 16.12.2019 09:04:32
Точнее как отправить этот запрос, чтобы сервер его обработал?
MaratIsk
Дата: 16.12.2019 09:12:15
PLATONOVDMITRIY
Точнее как отправить этот запрос, чтобы сервер его обработал?


написать руками
WSDL всего лишь описание API сервиса
PLATONOVDMITRIY
Дата: 16.12.2019 09:57:41
MaratIsk,

с помощью чего это можно реализовать? Компонента idhttp? Как?
DmSer
Дата: 16.12.2019 12:32:43
PLATONOVDMITRIY
MaratIsk,

с помощью чего это можно реализовать? Компонента idhttp? Как?


Можно и так.
Попробуйте предварительно отладить текст XML с помощью программы SoapUI.
PLATONOVDMITRIY
Дата: 17.12.2019 07:20:25
DmSer,

Использую следующий код:

procedure TForm1.ButtonLastUpdateClick(Sender: TObject);
var
  ResponseOut: TStringStream;
  httpRequest: TStrings;
begin
  ResponseOut := TStringStream.Create;
  httpRequest := TStringList.Create;
  httpRequest.Text :=
  '<?xml version="1.0" encoding="utf-8"?> ' +
  '<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> ' +
  ' <soap:Body> ' +
  '   <LastUpdate xmlns="http://web.cbr.ru/" /> ' +
  ' </soap:Body> '+
  '</soap:Envelope>';
  with IdHTTPLastUpdate do
  begin
    Request.ContentEncoding := 'utf-8';
    Request.ContentType := 'application/xml';
    Request.Accept := 'text/xml';
    Request.ContentLength := length(httpRequest.Text);
    Request.ContentType := 'application/soap/xml; charset=utf-8';
    Post('http://www.cbr.ru/CreditInfoWebServ/CreditOrgInfo.asmx', httpRequest,
      ResponseOut);
  end;
  EditResult.Text := ResponseOut.DataString;
end;


Выдаёт ошибку: HTTP/1.1 500 Internal Server Error
С помощью SoapUI получаю верные данные:
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
   <soap:Body>
      <LastUpdateResponse xmlns="http://web.cbr.ru/">
         <LastUpdateResult>2019-12-16T23:27:10.043</LastUpdateResult>
      </LastUpdateResponse>
   </soap:Body>
</soap:Envelope>


Что в исходном коде неверно?
DmSer
Дата: 17.12.2019 08:41:49
Попробуйте: Content-Type: text/xml;charset=UTF-8
DmSer
Дата: 17.12.2019 08:42:56
В SoapUI на вкладке Raw можно увидеть используемые заголовки http-запроса.
PLATONOVDMITRIY
Дата: 17.12.2019 09:39:37
DmSer
В SoapUI на вкладке Raw можно увидеть используемые заголовки http-запроса.


Содержимое вкладки RAW:
POST http://www.cbr.ru/CreditInfoWebServ/CreditOrgInfo.asmx HTTP/1.1
Accept-Encoding: gzip,deflate
Content-Type: text/xml;charset=UTF-8
SOAPAction: "http://web.cbr.ru/LastUpdate"
Content-Length: 214
Host: www.cbr.ru
Connection: Keep-Alive
User-Agent: Apache-HttpClient/4.1.1 (java 1.5)


Заменил в коде на:
with IdHTTPLastUpdate do
  begin
    Post('http://www.cbr.ru/CreditInfoWebServ/CreditOrgInfo.asmx', httpRequest,
      ResponseOut);
    Request.AcceptEncoding := 'gzip, deflate';
    Request.ContentType := 'text/xml;charset=UTF-8';
    HTTPReqRespLastUpdate.SoapAction := 'http://web.cbr.ru/LastUpdate';
    Request.ContentLength := length(httpRequest.Text);
    Request.Host := 'www.cbr.ru';
    Request.Connection := 'Keep-Alive';
    Request.UserAgent := 'Apache-HttpClient/4.1.1 (java 1.5)';
  end;


Ошибка осталась прежней.
makhaon
Дата: 17.12.2019 11:29:53
PLATONOVDMITRIY,

автор
С помощью SoapUI получаю верные данные:


смотри как именно этот soapui обращается к серверу - и сам запрос и заголовки. ну и максимально нужно повторить у себя. смотри, что твой клиент реально передает серверу. не только в коде.