我如何与Kronos API进行通信?

时间:2012-03-21 20:14:00

标签: c# xml web-services kronos-workforce-central

我有一个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 个答案:

答案 0 :(得分:4)

您可以使用浏览器,因为Kronos服务器仅支持POST请求,浏览器正在发出GET请求。原因是因为Kronos需要在正文中使用XML,而POST是最合适的方法。

访问Kronos XML API的方法是使用方法设置为POST的URL为WebRequest,如下所示:

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

请注意ContentType也设置为text / xml。

答案 1 :(得分:3)

作为Nick pointed out您可以使用XML POST请求与Kronos API进行通信。

WFC v5.0 Developer's Toolkit Programmer's Guide 1 提供了使用各种语言与Kronos API进行通信的一般指南。第一章介绍了XML API,它是所有API请求的发送方式。

Logon Request

Kronos WFC的标​​准XML登录请求。必须先在任何其他请求之前发送。

<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>

支付期间总请求

此请求会在2017年10月20日至2017年10月27日之间加载员工12345的付款期总计。

<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>

可以在 Workforce Timekeeping Developer Toolkit参考指南中找到Kronos API标记的完整列表。

您发送POST请求的方法可能因您的语言而异。但是,XML请求格式和API入口点(<ServerName>/wfc/XmlService)应适用于所有语言。

以下是用于发送Kronos登录请求的示例Python脚本:

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)

WFC Developer's Toolkit Programmer's Guide的第2章包含在 Java Visual Basic 中发送XML请求的示例。但是,我建议您查看一个更新的XML或HTTP请求库,该库特定于您使用的任何语言。

  

Java-based Implementation 2

     

使用Java语言有八个步骤:

     
      
  1. 使用以下URL字符串打开与服务器的HTTP连接:

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

    请务必将http://localhost替换为您服务器的网址

  2.   
  3. 通过将HTTP方法设置为&#34; POST&#34;来配置连接。以及#34; text / xml&#34;的内容类型如图所示:

    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);
    
  4.   
  5. 设置连接的Cookie。最初,在第一次连接到服务器时,cookie集将为空。然而,   登录<Response>的{​​{1}}将返回一组Cookie   必须保存并在后续HTTP请求中发回。

    <Request>
  6.   
  7. 将XML文本写为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);
    }
    
  8.   
  9. 连接到服务器。

    String xml_send = "<?xml version='1.0'?> … </Kronos_WFC>"
    PrintWriter out = new PrintWriter(new OutputStreamWriter(conn.getOutputStream()));
    out.println(xml_send);
    out.close();
    
  10.   
  11. 从服务器打开响应。

    conn.connect();
    
  12.   
  13. 阅读回复。来自服务器的HTTP响应将包含XML API响应。在Logon请求的情况下,字符串   InputStream is = conn.getInputStream(); 包含回复。

    xml_recv
  14.   
  15. 从响应中读取cookie并将其存储以用于后续的HTTP请求。

    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();
    
  16.         

    Visual Basic Implementation

               

    在本节中,最后用Java实现了相同的基本步骤   部分在Visual Basic中实现。这种比较显示出来   Visual Basic通过内部管理cookie简化了过程   以及大部分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++; } 处理HTTP的调用   请求如下所示:

    Inet1 COM object

有用的资源

<强>脚注:

1 引用的文档最初是为Kronos WFC 5.0(API 1.0)编写的。虽然6.3版本的版本应使用相同的API,但我无法保证其他版本的准确性。 (见XML API version 6.3 to 8.0 upgrade
2 下面的代码示例来自2004年。使用HTTP库可以大大简化Java实现。

答案 2 :(得分:2)

此外,您需要确保在Kronos的功能访问配置文件中检查XML API访问权限。

答案 3 :(得分:1)

不仅是XML Access,而且用户还必须启用远程api访问