Как Ник указал , , вы можете общаться с API Kronos, используя запросы XML POST.
Руководство программиста по WFC v5.0 для разработчиков 1 содержит общее руководство по взаимодействию с API Kronos на разных языках. Первая глава посвящена XML API, и именно так будут отправляться все запросы API.
Стандартный запрос входа в систему XML для Kronos WFC. Это должно быть отправлено в первую очередь перед любыми другими запросами.
<Kronos_WFC version="1.0">
<Request Object="System" Action="Logon" Username="ValidUsername" Password="ValidPassword"/>
</Kronos_WFC>
Ответ:
<Kronos_WFC version="1.0" TimeStamp="11/15/2017 3:35PM GMT-05:00">
<Response Status="Success" Timeout="1800" PersonKey="123456" Object="System" Username="ValidUsername" Action="Logon" PersonNumber="112233">
</Response>
</Kronos_WFC>
Запрос на выход из системы
Этот запрос на выход из системы завершит ваш активный сеанс Kronos.
<Kronos_WFC version="1.0">
<Request Object="System" Action="Logoff"/>
</Kronos_WFC>
Общая сумма запроса на период оплаты
В этом запросе загружается сумма периода оплаты для сотрудника 12345
с 20 октября 2017 года по 27 октября 2017 года.
<Kronos_WFC version="1.0">
<Request Action="Load">
<Timesheet>
<Employee>
<PersonIdentity PersonNumber="12345"/>
</Employee>
<Period>
<TimeFramePeriod PeriodDateSpan="10/20/2017 - 10/27/2017"/>
</Period>
</Timesheet>
</Request>
</Kronos_WFC>
Полный список тегов API Kronos можно найти в Справочном руководстве Workforce Timekeeping Developer Toolkit *1036*.
Ваш метод отправки запросов POST может отличаться в зависимости от вашего языка. Однако формат запроса XML и точка входа API (<ServerName>/wfc/XmlService
) должны применяться ко всем языкам.
Ниже приведен пример скрипта Python для отправки запроса на вход в Kronos:
import requests
url = "http://localhost/wfc/XmlService"
headers = {'Content-Type': 'text/xml'}
data = """<Kronos_WFC version = "1.0">
<Request Object="System" Action="Logon" Username="SomeUsername" Password="SomePassword"/>
</Kronos_WFC>"""
# Login to Kronos and print response
session = requests.Session() # preserve login cookies across requests
response = session.post(url, data=data, headers=headers)
print(response.text)
Глава 2 Руководства разработчика WFC Developer Toolkit содержит примеры отправки запросов XML в Java и Visual Basic . Тем не менее, я рекомендую ознакомиться с более современной библиотекой XML или HTTP-запросов, специфичной для любого языка, который вы используете.
Существует восемь шагов с использованием языка Java:
Откройте HTTP-соединение с сервером, используя следующую строку URL:
URL url = new URL("http://localhost/wfc/XmlService");
HttpURLConnection conn = (HttpURLConnection)url.openConnection();
Не забудьте заменить http://localhost
URL вашего сервера
Сконфигурируйте соединение, установив для HTTP-метода значение «POST», а для типа содержимого - «text / xml», как показано:
conn.setRequestMethod("POST");
conn.setRequestProperty("Content-type", "text/xml");
HTTP-соединение, которое вы устанавливаете, используется как для ввода (отправка XML <Request>
), так и для вывода (чтение XML).
<Response>
). Вы также должны убедиться, что любой прокси-сервер или
промежуточный шлюз не пытается кэшировать <Request>
или
<Response>
.
conn.setDoOutput(true);
conn.setDoInput(true);
conn.setUseCaches(false);
Установить куки для подключения. Первоначально при первом подключении к серверу набор файлов cookie будет пустым. Тем не мение,
<Response>
в логон <Request>
вернет набор куки
которые должны быть сохранены и отправлены обратно в последующих HTTP-запросах.
Vector cookies = new Vector();
…
//set the cookie values - if available
for (int i=0; i <cookies.size(); i++) {
String cookie = (String)cookies.elementAt(i);
conn.setRequestProperty("Cookie", cookie);
}
Напишите текст XML как часть HTTP-запроса.
String xml_send = "<?xml version='1.0'?> … </Kronos_WFC>"
PrintWriter out = new PrintWriter(new OutputStreamWriter(conn.getOutputStream()));
out.println(xml_send);
out.close();
Подключиться к серверу.
conn.connect();
Открыть ответ с сервера.
InputStream is = conn.getInputStream();
Прочитайте ответ. Ответ HTTP от сервера будет содержать ответ XML API. В случае запроса входа в систему строка
xml_recv
содержит ответ.
int size = conn.getContentLength();
byte[] dataBytes = new byte[size];
int bytesRead = 0;
int pos = 0;
//read stream into byte array
while ( (bytesRead >= 0) && (pos < size)) {
if ((bytesRead = is.read(dataBytes, pos, size-pos)) >= 0) {
pos = pos + bytesRead;
}
}
String xml_recv = new String(dataBytes, 0, size);
is.close();
Считайте куки из ответа и сохраните их для последующих HTTP-запросов.
int j = 1;//
while (true) {
String key = conn.getHeaderFieldKey(j);
if (key==null)
break;
else if (key.equals("Set-Cookie")) {
String value = conn.getHeaderField(j);
cookies.addElement(value);
}
j++;
}
В этом разделе те же самые основные шаги, реализованные в Java в последнем
Раздел реализован в Visual Basic. Это сравнение показывает, что
Visual Basic упрощает процесс за счет внутреннего управления файлами cookie
и большая часть обработки HTTP-соединений.
Следующая Inet1 COM object
обрабатывает вызов HTTP
запрос, как показано:
Dim sPost As String
Dim sAction As String
Dim sXMLData As String
Dim sHTTPHeaders As String
sPost = "POST"
sAction = "http://localhost/wfc/XmlService"
sXMLData = "<xml ..> <request …….. /></xml>"
sHTTPHeaders = "Content-type: text/xml"
' Inet1 object is an instance
' of the msinet.ocx control
' placed on the current form
Inet1.Execute sAction, sPost, sXMLData, sHTTPHeaders
Полезные ресурсы
Сноски:
1 : цитируемая документация изначально была написана для Kronos WFC 5.0 (API 1.0).Хотя версии до 6.3 должны использовать один и тот же API, я не могу гарантировать точность для других версий.(См. Обновление XML API версии 6.3 до 8.0 )
2 : Примеры кода ниже относятся к 2004 году. Реализация Javaможет быть значительно упрощен при использовании библиотеки HTTP.