Клиент web-службы, использующий необработанные данные SOAP и протокол передачи гипертекстовых файлов HTTP
Чтобы проиллюстрировать возможности класса SoapHttpClientProtocol, окончательный вариант клиентской программы использует сокеты. Сокеты позволяют отсылать как заголовки протокола передачи гипертекстовых файлов HTTP, так и сами данные в формате SOAP, а также получать ответ от Web-служб. Клиентская программа расположена в подкаталоге RawAddClient каталога SimpleWebService.
Сначала главная (main) функция программы читает файл SoapAdd.txt. Этот файл содержит SOAP-заголовки вызываемой Web-службы. Данная функция возвращает длину содержимого, которое фигурирует в соответствующем заголовке запроса, формируемого методом POST протокола передачи гипертекстовых файлов HTTP.
long contentLength = 0; StringBuilder *contentData = BuildContent( "SoapAdd.txt", ScontentLength); StringBuilder *requestHeader = BuildHeader(contentLength);
Затем клиентская программа устанавливает связь с сервером, отсылает ему данные и получает от сервера ответ, который выводится на консоль.
IPEndPoint *endPoint = new IPEndPoint( dynamic_cast<IPAddress *> (Dns::Resolve(httpServer) › AddressList › get_Item(0)), httpPort); Socket *sock = new Socket( AddressFamily::Internetwork, SocketType::Stream, ProtocolType::Tcp); sock › Connect(endPoint); … sock › Send( header, header › Length, SocketFlags::None); // заголовок, заголовок › Длина sock › Send(// Посылает content, content › Length, SocketFlags::None); // содержание, содержание › Длина … bytes = sock › Receive(// Получить receivedData, receivedData › Length, // Длина SocketFlags::None); Console::WriteLine( ASCII › GetString(receivedData, 0, bytes)); sock › Close(); …
Функция BuildHeader с помощью метода POST протокола передачи гипертекстовых файлов HTTP формирует стандартный запрос, дополненный заголовком SOAPAction.
StringBuilder *sb = new StringBuilder(1024); sb › Append(// Добавить в конец "POST /SimpleWebService/Add.asmx HTTP/1.l\r\n"); sb › Append("Host: localhost\r\n"); // Добавить в конец sb › Append(// Добавить в конец "Content-Type: text/xml; charset=utf-8\r\n"); String *line = // Строка String::Format("Content-Length: {0}\r\n", // Строка:: Формат contentLength.ToString()); sb › Append(line); // Добавить в конец (строка) sb › Append(// Добавить в конец "SOAPAction: \"http://tempuri.org/Add\"\r\n"); sb › Append("\r\n");; // Добавить в конец …