Код: Выделить всё
'curl.exe -d @"' & 'req.xml' & '" -H "Content-Type: text/xml; charset=utf-8" -u ' & 'user' & ':' & 'pswd' & ' https://api2.vetrf.ru:8002/platform/services/2.0/EnterpriseService' & ' -o ' & 'resp.xml'
Код: Выделить всё
'curl.exe -d @"' & 'req.xml' & '" -H "Content-Type: text/xml; charset=utf-8" -u ' & 'user' & ':' & 'pswd' & ' https://api2.vetrf.ru:8002/platform/services/2.0/EnterpriseService' & ' -o ' & 'resp.xml'
Код: Выделить всё
fsFileMakerL.AddOutLine('<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ws="http://api.vetrf.ru/schema/cdm/registry/ws-definitions/v2" xmlns:bs="http://api.vetrf.ru/schema/cdm/base" xmlns:dt="http://api.vetrf.ru/schema/cdm/dictionary/v2">')
fsFileMakerL.AddOutLine(' <soapenv:Header/>')
fsFileMakerL.AddOutLine(' <soapenv:Body>')
fsFileMakerL.AddOutLine(' <ws:getRussianEnterpriseListRequest>')
fsFileMakerL.AddOutLine(' <bs:listOptions>')
fsFileMakerL.AddOutLine(' <bs:count>3</bs:count>')
fsFileMakerL.AddOutLine(' <bs:offset>0</bs:offset>')
fsFileMakerL.AddOutLine(' </bs:listOptions>')
fsFileMakerL.AddOutLine(' <dt:enterprise>')
fsFileMakerL.AddOutLine(' <dt:name>"ПЕРЕСВЕТ"</dt:name>')
fsFileMakerL.AddOutLine(' </dt:enterprise>')
fsFileMakerL.AddOutLine(' </ws:getRussianEnterpriseListRequest>')
fsFileMakerL.AddOutLine(' </soapenv:Body>')
fsFileMakerL.AddOutLine('</soapenv:Envelope>')
Это не беда. Плохо, что они (как я понял) не довели сей чудный сервис до ума и не прикрутили к нему вариант обмена в JSON.finsoftrz писал(а): ↑07 Август 2018, 15:10Хотя сами меркурианцы рекомендуют soapUI
Код: Выделить всё
sendRequest_r routine !послать запрос
DATA
lor:queue queue, pre()
lor:name string(128), name('dt:name')
lor:uuid string(80), name('bs:uuid')
lor:guid string(80), name('bs:guid')
.
lor:err byte
CODE
Loc:NameTmp=GetNameTmp(FsAccess:ActiveUserDir,'xml',0)
Loc:NameOutTmp=GetNameTmp(FsAccess:ActiveUserDir,'xml',1)
fsFileMakerL.init(Loc:NameTmp)
fsFileMakerL.AddOutLine('<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ws="http://api.vetrf.ru/schema/cdm/registry/ws-definitions/v2" xmlns:base="http://api.vetrf.ru/schema/cdm/base">')
fsFileMakerL.AddOutLine(' <soapenv:Header/>')
fsFileMakerL.AddOutLine(' <soapenv:Body>')
fsFileMakerL.AddOutLine(' <ws:getAllCountryListRequest>')
fsFileMakerL.AddOutLine(' <base:listOptions>')
fsFileMakerL.AddOutLine(' <base:count>10</base:count>')
fsFileMakerL.AddOutLine(' <base:offset>0</base:offset>')
fsFileMakerL.AddOutLine(' </base:listOptions>')
fsFileMakerL.AddOutLine(' </ws:getAllCountryListRequest>')
fsFileMakerL.AddOutLine(' </soapenv:Body>')
fsFileMakerL.AddOutLine('</soapenv:Envelope>')
if fsFileMakerL.MakeFile(1)=0
fsFileMakerL.kill
exit
.
fsFileMakerL.kill
if fsCurlL.StartProcess('curl\curl.exe -d @"' & clip(Loc:NameTmp) & '" -H "Content-Type: text/xml; charset=utf-8" -u ' & clip('peresvet-180801') & ':' & clip('b6WHf9r3') & clip(' https://api2.vetrf.ru:8002/platform/services/2.0/IkarService') & ' -o ' & clip(Loc:NameOutTmp)).
if ~exists(Loc:NameOutTmp)
FsMessagePr('Ошибка отправки запроса!')
exit
.
lor:err=0
Loc:NameTmp=Loc:NameOutTmp
Loc:NameVbsTmp=GetNameTmp(FsAccess:ActiveUserDir,'vbs',0)
Loc:NameOutTmp=GetNameTmp(FsAccess:ActiveUserDir,'txt',0)
!читаем ответ
fsXmlPar.init(Loc:NameTmp,Loc:NameVbsTmp,Loc:NameOutTmp)
fsXmlPar.LoadQueue('dt:country','lor:queue',lor:queue)
fsXmlPar.MakeScript(1)
if fsXmlPar.ErrorCode<>0
FsMessagePr('Ошибка! ' & clip(fsXmlPar.ErrorMessage))
lor:err=1
.
fsXmlPar.kill
if lor:err=0 and records(lor:queue)<>0
remove(Loc:NameTmp)
remove(Loc:NameOutTmp)
fsViewQueue('',lor:queue)
elsif lor:err=0
run('notepad.exe ' & Loc:NameTmp)
run('notepad.exe ' & Loc:NameOutTmp)
.
free(lor:queue)
Код: Выделить всё
LoadQueueFromXML PROCEDURE (*IDynStr xBuffer_,*Queue xMyQueue_, String xTagRow_)
Loc:XMLCount LONG(1)
Loc:XMLDoc &Document,AUTO
Loc:RetValue LONG(0) ! Возвращает кол-во добавленных строк в xMyQueue_
Loc:Value CSTRING(256)
Loc:FlagRecord BYTE(False)
Loc:TagParent CSTRING(81)
Loc:TagName CSTRING(81)
Loc:Column LONG
Loc:Field ANY
Loc:AttrIndex LONG
Loc:FlagData BYTE(False)
Loc:XMLList Queue(DOMQueue)
end
MyParentNode &node,auto
nnm &NamedNodeMap,auto
ANode &Node,Auto
CODE
Loc:XMLDoc &= XMLStringToDOM(xBuffer_.Str())
If ~(Loc:XMLDoc &= NULL)
FillDOMQueue(Loc:XMLDoc,Loc:XMLList)
!ViewXML(Loc:XMLDoc)
Loop While(Loc:XMLCount <= Records(Loc:XMLList))
Get(Loc:XMLList,Loc:XMLCount)
Loc:TagName = Lower(Loc:XMLList.Node.GetNodeName()) ! Сразу получаем имя тега - он нужен для поиска начала строки
If Loc:FlagRecord ! Если ведётся запись строки
MyParentNode &= Loc:XMLList.node.GetParentNode() ! Родительский тег
If (MyParentNode &= NULL) then Message('Ошибка ParentNode !').
Loc:TagParent = Lower(MyParentNode.GetNodeName())
! --- Получаем данные тега из следующей строки
Get(Loc:XMLList,Loc:XMLCount + 1)
If ~ErrorCode() and (Loc:XMLList.Node.GetNodeName() = '#text')
Loc:XMLCount += 1
! --- Поиск поля в очереди
Loc:Column = 1
Loop While(Who(xMyQueue_,Loc:Column) <> '')
If Lower(Who(xMyQueue_,Loc:Column)) = (Loc:TagParent & '!' & Loc:TagName)
Loc:Field &= What(xMyQueue_,Loc:Column)
If ~(Loc:Field &= NULL)
! Что бы не конвертировать из UTF-8 в ANSI цифры и GUID
If (IsString(Loc:Field) = False) Or (Size(What(xMyQueue_,Loc:Column)) = 36)
Loc:Value = Loc:XMLList.Node.GetNodeValue()
else ! Перекодировать строку UTF-8 в ANSI
Loc:Value = UTF8toANSI(Loc:XMLList.Node.GetNodeValue())
end
If Lower(Loc:Value) = 'true'
Loc:Field = True
elsIf Lower(Loc:Value) = 'false'
Loc:Field = False
else
Loc:Field = Loc:Value
end
Loc:FlagData = True ! В записи есть данные
end
end
Loc:Column += 1
end
end
end
! --- Поиск тега начала строки с данными
If Loc:TagName = Lower(xTagRow_)
If Loc:FlagRecord ! Если велась запись
If Loc:FlagData ! Если в буфере есть данные
Add(xMyQueue_) ! Добавить запись
If ~ErrorCode() then Loc:RetValue += 1.
end
else
Loc:FlagRecord = True ! Начать запись
end
Clear(xMyQueue_) ! Очистить буфер записи
Loc:FlagData = False ! В буфере нет данных
end
Loc:XMLCount += 1
end
If Loc:FlagData ! Если в буфере есть данные - добавить последнюю запись
Add(xMyQueue_)
If ~ErrorCode() then Loc:RetValue += 1.
end
Free(Loc:XMLList)
Loc:XMLDoc.Release()
end
Return(Loc:RetValue)
Код: Выделить всё
Loc:MyCountry Queue ! Список стран (УКАЗЫВЕТСЯ ИМЯ ПОЛЯ С РОДИТЕЛЬСКИМ ТЕГОМ, Т.К. В XML ИМЕНА НЕ УНИКАЛЬНЫ !!!)
UUID String(36), Name('dt:country!bs:uuid') ! Идентификатор версии
GUID String(36), Name('dt:country!bs:guid') ! Глобальный идентификатор страны в реестре системы Икар
Status Short, Name('dt:country!bs:status') ! Статус записи
Name CString(129), Name('dt:country!dt:name') ! Название страны (например, Белоруссия)
FullName CString(256), Name('dt:country!dt:fullName') ! Полное название страны (например, Республика Беларусь)
EnglishName CString(129), Name('dt:country!dt:englishName') ! Название страны на английском языке
Code String(2), Name('dt:country!dt:code') ! Двухбуквенный код страны в соответствии со стандартом ISO 3166-1 alpha-2
Code3 String(3), Name('dt:country!dt:code3') ! Трёхбуквенный код страны в соответствии со стандартом ISO 3166-1 alpha-3
end
Loc:Buffer &IDynStr
RLoad Long
Code
! Выполнили запрос и получили текст XML ответа в Loc:Buffer (см. LibCURL)
RLoad = LoadQueueFromXML(Loc:Buffer,Loc:MyCountry,'dt:country') ! Указываем тег строки с данными
Message('Загружено стран: ' & RLoad) ! Ну а список стран - в Loc:MyCountry :)
Спасибо, да, конечно. Страны, ед. измерения и т.д. - всё грузится.
Код: Выделить всё
fsFileMakerL.AddOutLine('<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"')
fsFileMakerL.AddOutLine(' xmlns:ws="http://api.vetrf.ru/schema/cdm/registry/ws-definitions/v2"')
fsFileMakerL.AddOutLine(' xmlns:base="http://api.vetrf.ru/schema/cdm/base">')
fsFileMakerL.AddOutLine(' <soapenv:Header/>')
fsFileMakerL.AddOutLine(' <soapenv:Body>')
fsFileMakerL.AddOutLine(' <ws:getAllCountryListRequest>')
fsFileMakerL.AddOutLine(' <base:listOptions>')
fsFileMakerL.AddOutLine(' <base:count>100</base:count>')
fsFileMakerL.AddOutLine(' <base:offset>' & Loc:Sm & '</base:offset>')
fsFileMakerL.AddOutLine(' </base:listOptions>')
fsFileMakerL.AddOutLine(' </ws:getAllCountryListRequest>')
fsFileMakerL.AddOutLine(' </soapenv:Body>')
fsFileMakerL.AddOutLine('</soapenv:Envelope>')