Как я могу импортировать веб-сервис https (wcf) с Delphi 2010?
У меня есть проблема, поэтому я хочу помочь тебе. Существует веб-сервис и его URL: https://kps.saglik.gov.tr/Services/KPSTestServices.svc
Мы можем легко импортировать этот URL в Visual Studio C#, но мы не смогли импортировать его в Delphi 2010.
Также у нас есть идентификатор пользователя и пароль от saglik.gov.tr, но результат тот же: невозможно импортировать этот сервис. Что мы можем теперь сделать?
Спасибо за любую идею на данный момент.
Пример Visual Studio: https://kps.saglik.gov.tr/kps_ornek1.zip
Мне удалось импортировать файлы на локальную запись на жесткий диск.
- https://kps.saglik.gov.tr/Services/KPSTestServices.svc?wsdl = services.wsdl
- https://kps.saglik.gov.tr/Services/KPSTestServices.svc?wsdl=wsdl0 = secondry.wsdl
- https://kps.saglik.gov.tr/Services/KPSTestServices.svc?xsd=xsd0 = xsd0.xsd
- https://kps.saglik.gov.tr/Services/KPSTestServices.svc?xsd=xsd1 = xsd1.xsd
- https://kps.saglik.gov.tr/Services/KPSTestServices.svc?xsd=xsd2 = xsd2.xsd
Когда я вызываю службу, теперь я получаю ошибку соединения HTTPS.
XML, созданный WCFStorm (http://www.wcfstorm.com/wcf/home.aspx)
Header
POST https://kps.saglik.gov.tr/Services/KPSTestServices.svc HTTP/1.1
Content-Type: application/soap+xml; charset=utf-8
Host: kps.saglik.gov.tr
Content-Length: 1256
Expect: 100-continue
Connection: Keep-Alive
<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope" xmlns:a="http://www.w3.org/2005/08/addressing" xmlns:u="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"><s:Header><a:Action s:mustUnderstand="1">http://www.saglik.gov.tr/KPS/2011/KPSServices/TcKimlikNoIleKisiSorgula</a:Action><a:MessageID>urn:uuid:b99c1ef4-9e44-42b9-ae1f-9844bfc0f997</a:MessageID><a:ReplyTo><a:Address>http://www.w3.org/2005/08/addressing/anonymous</a:Address></a:ReplyTo><a:To s:mustUnderstand="1">https://kps.saglik.gov.tr/Services/KPSTestServices.svc</a:To><o:Security s:mustUnderstand="1" xmlns:o="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"><u:Timestamp u:Id="_0"><u:Created>2011-09-13T11:17:27.234Z</u:Created><u:Expires>2011-09-13T11:22:27.234Z</u:Expires></u:Timestamp><o:UsernameToken u:Id="uuid-d7a725d3-aa3c-4336-8651-304ecdb8d5e0-4"><o:Username>myUserName</o:Username><o:Password o:Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">myPassword</o:Password></o:UsernameToken></o:Security></s:Header><s:Body><TcKimlikNoIleKisiSorgula xmlns="http://www.saglik.gov.tr/KPS/2011"><tcNo>1842715****</tcNo></TcKimlikNoIleKisiSorgula></s:Body></s:Envelope>
XML ответа
Header
HTTP/1.1 200 OK
Cache-Control: private
Content-Length: 1519
Content-Type: application/soap+xml; charset=utf-8
Server: Microsoft-IIS/7.5
Set-Cookie: ASP.NET_SessionId=0vdbbkozgztz4falycku4gr0; path=/; HttpOnly
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET
Date: Tue, 13 Sep 2011 11:19:40 GMT
<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope" xmlns:a="http://www.w3.org/2005/08/addressing" xmlns:u="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"><s:Header><a:Action s:mustUnderstand="1">http://www.saglik.gov.tr/KPS/2011/KPSServices/TcKimlikNoIleKisiSorgulaResponse</a:Action><a:RelatesTo>urn:uuid:b99c1ef4-9e44-42b9-ae1f-9844bfc0f997</a:RelatesTo><o:Security s:mustUnderstand="1" xmlns:o="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"><u:Timestamp u:Id="_0"><u:Created>2011-09-13T11:19:41.255Z</u:Created><u:Expires>2011-09-13T11:24:41.255Z</u:Expires></u:Timestamp></o:Security></s:Header><s:Body><TcKimlikNoIleKisiSorgulaResponse xmlns="http://www.saglik.gov.tr/KPS/2011"><TcKimlikNoIleKisiSorgulaResult xmlns:i="http://www.w3.org/2001/XMLSchema-instance"><Hata i:nil="true"/><Sonuc><Ad>MUSTAFA</Ad><AileSiraNo>12</AileSiraNo><AnaAd>LEYLA</AnaAd><BabaAd>OSMAN</BabaAd><BireySiraNo>*</BireySiraNo><CiltAd>-</CiltAd><CiltKod>-</CiltKod><Cinsiyet>Erkek</Cinsiyet><Din i:nil="true"/><DogumTarihi>21.9.0000</DogumTarihi><DogumYer>*</DogumYer><Durum>Açık</Durum><Hata i:nil="true"/><IlAd>*</IlAd><IlKod>*</IlKod><IlceAd>Abana</IlceAd><IlceKod>*</IlceKod><MedeniHal>Bekar</MedeniHal><OlumTarih>0.0.0</OlumTarih><Soyad>*</Soyad><TCKimlikNo>18427***</TCKimlikNo><Yakinlik>Kendisi</Yakinlik></Sonuc></TcKimlikNoIleKisiSorgulaResult></TcKimlikNoIleKisiSorgulaResponse></s:Body></s:Envelope>
Delphi 2010
Мой запрос
CONNECT kps.saglik.gov.tr:443 HTTP/1.0
User-Agent: Borland SOAP 1.2
Host: kps.saglik.gov.tr:443
Content-Length: 0
Proxy-Connection: Keep-Alive
Pragma: no-cache
Нет XML
Мой ответ
Header
HTTP/1.1 502 Unable to Secure Connection
Via: 1.1 SYSTMG07
Connection: Keep-Alive
Proxy-Connection: Keep-Alive
Нет XML
3 ответа
Вы должны указать Delphi на WSDL службы. просто добавьте?wsdl в конец первого URL, который вы дали: https://kps.saglik.gov.tr/Services/KPSTestServices.svc?wsdl и откройте этот URL.
Сохраните файл как файл wsdl и импортируйте его, используя: File
-> New
-> Other
-> Delphi Projects
-> Webservices
-> WSDL Importer
,
Обратите внимание: при изменении веб-службы вам необходимо выполнить повторный импорт. Кроме того, при использовании веб-службы таким образом вам может потребоваться развернуть wsdl вместе с вашим приложением, в зависимости от того, используете ли вы wsdl при использовании веб-службы.
Я только что столкнулся с подобной проблемой, пытаясь подключить клиент D2007 к сервису C#. Детали, которые я нашел, были интересны. В первую очередь импортер Delphi серьезно недоделан. Я переключился на RemObj и продолжал иметь проблемы. Похоже, что в конце дня при вызове веб-службы WCF C# из приложения Delphi интерес представляют три вещи. Эти 3 пункта следующие:
1) Убедитесь, что на стороне Delphi версия Soap установлена на 1.2 (это самая простая версия)
2) Сгенерированная команда post включала неверное действие. Нужно: POST "http://URI/Service/Command" RemObj: POST urn:HCSConnect-WSHCSConnect#Ping Delphi: --- команда post полностью отсутствует ---
Что я сделал, так это изменил некоторые детали в Rem Obj и сделал так, что мне нужно
3) С сервисом, который я использовал, мыльный конверт хочет область заголовка, которая содержит определение нескольких деталей. В моей ситуации наиболее важными элементами в этом заголовке оказались теги "a:Action" и "a:To". Эти теги отсутствуют в приложениях Delphi, RemObj или других. Так что в моих ситуациях я перехватываю xml и заполняю его.
Решения для последних 2 пунктов не так просты... если вы используете Rem Obj, вы можете прочитать о том, как я это исправил и что вы можете сделать на форуме RemObj.
http://connect.remobjects.com/discussion/825/problem-calling-web-service-built-with-c
.... последний, но тем не менее важный...
У меня также есть возможность работать с прямыми вызовами... если вы не используете RemObj, а Delphi - это боль, вы всегда можете просто создать свой пост и xml самостоятельно и отправить его. Точно так же, как я сделал ниже... помните, post/xml/web - это просто обычный текст, отправляемый туда и обратно.
procedure TMainForm.Button5Click(Sender: TObject);
procedure HandleError(const errorCode: integer);
var
errorMessage: AnsiString;
begin
SetLength(errorMessage, 256);
FormatMessage( FORMAT_MESSAGE_FROM_SYSTEM or FORMAT_MESSAGE_FROM_HMODULE,
Pointer(GetModuleHandle('wininet.dll')),
errorCode, 0, PChar(errorMessage), Length(errorMessage), nil);
SetLength(errorMessage, StrLen(PChar(errorMessage)));
raise Exception.Create(errorMessage);
end;
function BuildHeader: TStringStream;
begin
result := TStringStream.Create('');
try
result.WriteString('Content-Type: application/soap+xml;charset=UTF-8;action="http://Thermo.Connect/IHCSConnect/Ping"' + sLineBreak);
except
result.Free;
raise;
end;
end;
function BuildBody: TStringStream;
begin
result := TStringStream.Create('');
with result do
try
WriteString('<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope" xmlns:a="http://www.w3.org/2005/08/addressing">' + sLineBreak);
WriteString('<s:Header>' + sLineBreak);
WriteString('<a:Action>http://Thermo.Connect/IHCSConnect/Ping</a:Action>' + sLineBreak);
WriteString('<a:To>http://thermo-pc:2021/WSHCSConnect</a:To>' + sLineBreak);
WriteString('</s:Header>' + sLineBreak);
WriteString('<s:Body>' + sLineBreak);
WriteString('<Ping xmlns="http://Thermo.Connect">' + sLineBreak);
WriteString('</Ping>' + sLineBreak);
WriteString('</s:Body>' + sLineBreak);
WriteString('</s:Envelope>' + sLineBreak);
except;
result.Free;
raise;
end;
end;
var
InetRoot: HINTERNET;
InetConnect: HINTERNET;
Request: HINTERNET;
begin
InetRoot := InternetOpen('GabeCode', INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);
try
InetConnect := InternetConnect( InetRoot, 'thermo-pc:2021', 0, '',
'', INTERNET_SERVICE_HTTP, 0, Cardinal(Self));
try
Request := HttpOpenRequest( InetConnect, 'POST', 'WSHCSConnect', 'HTTP/1.1', nil, nil,
INTERNET_FLAG_KEEP_CONNECTION or INTERNET_FLAG_NO_CACHE_WRITE,
0);
try
// build add header items to the post request
with BuildHeader do
try
HttpAddRequestHeaders(Request, PChar(DataString), Length(DataString), HTTP_ADDREQ_FLAG_ADD);
finally
Free;
end;
// build the body of data being posted and send the post
with BuildBody do
try
if not HttpSendRequest(Request, nil, 0, PChar(DataString), Length(DataString)) then
HandleError(GetLastError);
finally
Free;
end;
finally
InternetCloseHandle(Request);
end;
finally
InternetCloseHandle(InetConnect);
end;
finally
InternetCloseHandle(InetRoot);
end;
end;
Может быть, я немного пессимистичен в отношении поддержки Delphi SOAP, но я думаю, что это будет легче решить с помощью службы "прокси", написанной на C# (или Java, в зависимости от доступных ресурсов разработчика).
Я успешно использовал решение "прокси" для интеграции системы Microsoft Dynamics CRM. После многих попыток решить ее в Delphi мы наконец-то написали простое приложение на C#, которое считывает входные данные из файлов (созданных из приложения Delphi), а затем вызывает операции веб-службы, используя данные из этих файлов.
К счастью, это был очень простой односторонний интерфейс. Для расширенных требований приложение Delphi может взаимодействовать по протоколу TCP (HTTP) с использованием полезной нагрузки XML или JSON. Для двунаправленного обмена данными приложению Delphi также потребуется запустить HTTP-сервер, который может быть реализован с помощью Indy в виде нескольких строк кода. Для двунаправленной работы также может быть полезно использование промежуточного программного обеспечения для обмена сообщениями, такого как MSMQ (или одного из многих брокеров сообщений с открытым исходным кодом, таких как ActiveMQ или OpenMQ), поскольку все приложения могут уходить в автономный режим для обслуживания без опасности потери сообщений.