我有一个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#与服务器进行通信。
答案 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请求的发送方式。
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语言有八个步骤:
使用以下URL字符串打开与服务器的HTTP连接:
URL url = new URL("http://localhost/wfc/XmlService"); HttpURLConnection conn = (HttpURLConnection)url.openConnection();
请务必将
http://localhost
替换为您服务器的网址通过将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);
设置连接的Cookie。最初,在第一次连接到服务器时,cookie集将为空。然而, 登录
<Response>
的{{1}}将返回一组Cookie 必须保存并在后续HTTP请求中发回。<Request>
将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); }
连接到服务器。
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();
阅读回复。来自服务器的HTTP响应将包含XML API响应。在Logon请求的情况下,字符串
InputStream is = conn.getInputStream();
包含回复。xml_recv
- 醇>
从响应中读取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();
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访问