Como posso comunicar com a API de Kronos?

Tenho um Kronos Ponto de entrada http://kronos../wfc / XmlService que eu deveria ser capaz de Acessar no entanto quando eu abri-lo no brower a resposta é:

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

O Que devo fazer para usar os serviços web?

A propósito, estou a usar C# para comunicar com o servidor.

Author: Steven Vascellaro, 2012-03-22

4 answers

{[[2]} Você obtém isso com o brower porque o servidor de Kronos só suporta pedidos de POST e o navegador está emitindo um pedido de GET. A razão para isso é porque Kronos requer um XML no corpo e o POST é o método mais apropriado para fazê-lo.

A forma de aceder à API XML do Kronos, é fazer um WebRequest para o URL que tem com o método definido para publicar desta forma:

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

Note como o ContentType também é definido como text / xml.

 4
Author: Nick, 2012-03-21 20:25:06

Além disso, tem de ter a certeza que tem acesso à API XML no perfil de acesso à função em Kronos.

 2
Author: Jose Carlos Carballo, 2014-12-09 18:11:12

Como Nick apontou, você pode se comunicar com a API de Kronos usando pedidos de XML POST.

Embora o seu método de envio dos pedidos possa variar, o formato do pedido e o ponto de entrada da API (wfc/XmlService) devem aplicar-se a todas as línguas.


Capítulo 1: Compreender a API XML

O Guia do programador de ferramentas do programador do WFC v5.01 fornece um guia geral para a comunicação com o Kronos API em vários idiomas. O primeiro capítulo cobre a API XML, que é como todos os pedidos de API serão enviados.

Pedido De Registo

Um pedido padrão de logon XML para a Kronos WFC. Isto deve ser enviado antes de quaisquer outros pedidos.

<Kronos_WFC version = "1.0">
  <Request
    Object = "System"
    Action = "Logon"
    Username = "ValidUsername"
    Password = "ValidPassword"
  />
</Kronos_WFC>

Resposta da amostra:

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

Pedido De Cancelamento

Este pedido de encerramento terminará a sessão activa de Kronos.
<Kronos_WFC version="1.0">
  <Request Object="System" Action="Logoff"/>
</Kronos_WFC>

Período De Pagamento Pedido Total

Este pedido carrega o período de pagamento Total do trabalhador 12345 entre 20 de outubro de 2017 e 27 de outubro de 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>

Capítulo 2: utilização da API XML

Este capítulo cobre exemplos específicos da linguagem sobre como enviar pedidos XML para Kronos. Ele inclui exemplos paraJava e Visual Basic . (para Python, veja kronos-wfc-login.py)

Note que estes exemplos são bastante simplificados. Eu recomendo olhar para um XML mais atualizado ou HTTP solicita biblioteca específica para qualquer idioma que você está usando.

Implementação baseada em Java2

Existem oito passos usando a linguagem Java:

  1. Abra uma ligação HTTP ao servidor usando o seguinte texto de URL:

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

    lembre-se de substituir http://localhost pelo URL do seu servidor

  2. Configure a ligação definindo o método HTTP para "POST" e o tipo de conteúdo em "texto / xml" como mostrado:

    conn.setRequestMethod("POST");
    conn.setRequestProperty("Content-type", "text/xml");
    

    A ligação de HTTP que estabelece é usada tanto para a entrada (enviar o XML <Request>) como para a saída (ler o XML <Response>). Você também deve garantir que qualquer servidor proxy ou gateway intermediária não tenta cache o <Request> ou o <Response>.

    conn.setDoOutput(true);
    conn.setDoInput(true);
    conn.setUseCaches(false);
    
  3. Defina os cookies para a ligação. Inicialmente, na primeira ligação ao servidor, o conjunto de cookies estará vazio. Entanto, o <Response> para o Logon <Request> irá devolver um conjunto de cookies isso deve ser salvo e enviado de volta em solicitações HTTP subsequentes.

    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. Escreva o texto XML como parte do pedido 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. Liga-te ao servidor.
    conn.connect();
    
  6. Abra a resposta do servidor.

    InputStream is = conn.getInputStream();
    
  7. Leia a resposta. A resposta HTTP do servidor irá conter a resposta da API XML. No caso do pedido de Logon, o texto xml_recv contém a resposta.
    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. Leia os cookies da resposta e armazene-os para os pedidos HTTP subsequentes.

    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++;
    }
    

Implementação Visual Básica

Nesta Secção, os mesmos passos básicos implementados em Java na última a seção é implementada no Visual Basic. Esta comparação revela que: Visual Basic simplifica o processo através da gestão interna dos cookies e muito do HTTP tratamento de ligações.

O seguinte Inet1 COM object lida com a invocação do HTTP pedido apresentado:

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

Recursos Úteis

Notas de rodapé:

1: a documentação citada foi originalmente escrita para Kronos WFC 5.0 (API 1.0). Enquanto as versões até 6.3 devem usar a mesma API, eu não posso garantir precisão para outras versões. (Ver API XML versão 6. 3 a actualização de 8. 0)
2: As amostras de código abaixo são de 2004. A implementação Java poderia ser muito simplificado usando uma biblioteca HTTP.

 2
Author: Steven Vascellaro, 2018-03-01 14:34:09

Não só o acesso XML, mas também o utilizador tem de ter acesso à api remota activo

 1
Author: Javier, 2014-12-09 21:08:05