Как я могу общаться с Kronos API? - PullRequest
9 голосов
/ 22 марта 2012

У меня есть Kronos точка входа http://kronos.. / Wfc / XmlService , к которой я должен иметь доступ, однако, когда я открою ее в браузере, ответ будет:

<Kronos_WFC>
<Response Status="Failure" ErrorCode="1332" Message="WFP-01110 The MIME type of the request is invalid. Type Found: . Valid types: text/xml, application/xml."></Response>
</Kronos_WFC>

Что я должен сделать, чтобы использовать веб-сервисы?

Кстати, я использую C # для связи с сервером.

Ответы [ 4 ]

4 голосов
/ 16 октября 2017

Как Ник указал , , вы можете общаться с 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 2

Существует восемь шагов с использованием языка Java:

  1. Откройте HTTP-соединение с сервером, используя следующую строку URL:

    URL url = new URL("http://localhost/wfc/XmlService");
    HttpURLConnection conn = (HttpURLConnection)url.openConnection();
    

    Не забудьте заменить http://localhost URL вашего сервера

  2. Сконфигурируйте соединение, установив для 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);
    
  3. Установить куки для подключения. Первоначально при первом подключении к серверу набор файлов 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);
    }
    
  4. Напишите текст 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();
    
  5. Подключиться к серверу.

    conn.connect();
    
  6. Открыть ответ с сервера.

    InputStream is = conn.getInputStream();
    
  7. Прочитайте ответ. Ответ 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();
    
  8. Считайте куки из ответа и сохраните их для последующих 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++;
    }
    

Реализация Visual Basic

В этом разделе те же самые основные шаги, реализованные в 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.

4 голосов
/ 22 марта 2012

Вы получаете это с браузером, потому что сервер Kronos поддерживает только запросы POST и браузер выдает запрос GET. Причина этого в том, что Kronos требует XML в теле, а POST является наиболее подходящим для этого методом.

Способ доступа к API-интерфейсу Kronos XML заключается в создании WebRequest для URL-адреса, который у вас есть, с методом, установленным в POST, следующим образом:

HttpWebRequest reqFp = (HttpWebRequest)HttpWebRequest.Create(KronosServerUrl);
reqFp.Method = "POST";
reqFp.ContentType = "text/xml";

Обратите внимание, что ContentType также установлен на text / xml.

2 голосов
/ 09 декабря 2014

Кроме того, вам необходимо убедиться, что у вас есть проверка доступа к XML API в профиле доступа к функциям в Kronos.

1 голос
/ 10 декабря 2014

Не только доступ XML, но и пользователь также должен иметь удаленный доступ API

...