Web-Services

Um ein neues dynamisches Feld vom Typ Web-Service zu erstellen, ist es notwendig, einen bereits funktionierenden Web-Service zu haben. Es erfordert mindestens einen Invoker vom Typ Generic::PassThrough. Dieser Invoker wird aufgerufen, um die Daten vom Remote-Server zu holen. Die Originaldaten, die sie in einer Anforderung gesendet werden, ähneln dem folgenden Beispiel.

{
    DynamicFieldID    => 123,
    DynamicFieldLabel => 'NameX',
    DynamicFieldName  => 'NameX',
    DynamicFieldValue => 'Value',
    Form => {
        # Form fields
        # ...
    },
    Ticket => {
        # Ticket attributes
        # ...
    },
    DynamicField => {
        NameX => 'Value'
        NameY => [ 'Value' ],
    },
    UserID => 123,
},
Form

Dieser Abschnitt enthält die Felder in der aktuellen Form im Webbrowser. Diese Informationen ändern sich mit dem Ausfüllen der Maske.

Ticket

Dieser Abschnitt (oder ein anderes Quellobjekt, z. B. CustomerUser) enthält die Attribute des Objekts, zu dem das dynamische Feld gehört.

In der Ansicht Neues Telefon-Ticket ist der Abschnitt z.B. leer, da das Ticket noch nicht erstellt wurde, aber in der Ansicht Freie Felder ändern enthält er die Informationen des aktuellen Tickets.

DynamicField

Dieser Abschnitt enthält alle nicht leeren Werte aller konfigurierten dynamischen Felder für das aktuelle Objekt.

In den meisten Fällen werden sich die Daten, die der Remote-Server benötigt, stark von den bereitgestellten Daten unterscheiden, weshalb es dringend empfohlen wird, ein Mapping-Modul für die ausgehenden Daten zu verwenden, um sie speziell für den Remote-Server-Aufruf zu formatieren.

Das folgende Beispiel für das ausgehende Mapping zeigt ein XSLT-Mapping, das alle Daten verwirft und setzt einen festen Wert für UserLogin, Password und TicketID (wie für eine TicketGet Operation erforderlich).

<?xml version="1.0" encoding="UTF-8"?>
<xsl:transform
    xmlns:xsl="https://www.w3.org/1999/XSL/Transform"
    xmlns:date="https://exsalt.org/dates-and-times"
    version="1.0"
    extension-element-prefixes="date">

    <xsl:output method="xml" encoding="utf-8" indent="yes" />

    <!-- Don't return unmached tags -->
    <xsl:template match="text()" />

    <!-- Remove empty elements -->
    <xsl:template match="*[not(node())]" />

    <!-- Root template -->
    <xsl:template match="/">
        <RootElement>
            <UserLogin>someuser</UserLogin>
            <Password>somepassword</Password>
            <TicketID>1</TicketID>
        </RootElement>
    </xsl:template>

</xsl:transform>

Die Antwort des Servers kann auch sehr unterschiedlich sein, so dass in diesem Fall auch sehr empfehlenswert ist, ein Mapping-Modul für die eingehenden Daten zu verwenden, um die Informationen verarbeiten zu können. Die Antwort muss eine Liste von Schlüssel- und Wertelementen sein.

Das folgende eingehende Mapping-Beispiel zeigt ein XSLT-Mapping, das die Ergebnisse einer Antwort der Operation TicketGet vom Remote-Server konvertiert und den Zustand und die Queue extrahiert und formatiert, wie es für die Verwendung als Optionen für das dynamische Feld erforderlich ist.

<?xml version="1.0" encoding="UTF-8"?>
<xsl:transform
    xmlns:xsl="https://www.w3.org/1999/XSL/Transform"
    xmlns:date="https://exsalt.org/dates-and-times"
    version="1.0"
    extension-element-prefixes="date">

    <xsl:output method="xml" encoding="utf-8" indent="yes" />

    <!-- Don't return unmached tags -->
    <xsl:template match="text()" />

    <!-- Remove empty elements -->
    <xsl:template match="*[not(node())]" />

    <!-- Root template -->
    <xsl:template match="/">
        <RootElement>
            <xsl:apply-templates />
        </RootElement>
    </xsl:template>

    <xsl:template match="/*/Ticket">
        <PossibleValue>
            <Key>State</Key>
            <Value>
                <xsl:value-of select="/*/Ticket/State" />
            </Value>
        </PossibleValue>
        <PossibleValue>
            <Key>Queue</Key>
            <Value>
                <xsl:value-of select="/*/Ticket/Queue" />
            </Value>
        </PossibleValue>
    </xsl:template>

</xsl:transform>

Die folgende Definition des Web-Service (importierbare YAML-Datei) kann für den Test des Feldes verwendet werden, aber der Endpunkt muss an das aktuelle System angepasst werden. Dieser Web-Service fungiert als Requester und Provider und gibt immer den Status und die Queue von TicketID 1 als mögliche Werte an das Feld zurück.

Bemerkung

Dieses Beispiel sollte nicht in Verbindung mit dem Webserver für die Entwicklung verwendet werden.

---
Debugger:
  DebugThreshold: debug
  TestMode: '0'
Description: Dynamic Field Web Service Test
FrameworkVersion: 7.0.x git
Provider:
  ErrorHandling: {}
  ErrorHandlingPriority: []
  Operation:
    TicketGet:
      Description: ''
      IncludeTicketData: ''
      MappingInbound: {}
      MappingOutbound: {}
      Type: Ticket::TicketGet
  Transport:
    Config:
      AdditionalHeaders: ~
      MaxLength: '100000000'
      NameSpace: https://www.otrs.org/TicketConnector/
      RequestNameFreeText: ''
      RequestNameScheme: Plain
      ResponseNameFreeText: ''
      ResponseNameScheme: Response
    Type: HTTP::SOAP
RemoteSystem: ''
Requester:
  ErrorHandling: {}
  ErrorHandlingPriority: []
  Invoker:
    TicketGet:
      Description: Get possible values from the other side.
      Events: []
      MappingInbound:
        Config:
          Template: |-
              <?xml version="1.0" encoding="UTF-8"?>
              <!--
              Copyright (C) 2001-2023 OTRS AG, https://otrs.com/
              This software comes with ABSOLUTELY NO WARRANTY. For details, see
              the enclosed file COPYING for license information (GPL). If you
              did not receive this file, see https://www.gnu.org/licenses/gpl.txt.
              -->

              <!-- DOCUMENTATION

              * Example XML Input *
              <RootElement>
                  ...
              </RootElement>


              * Example XML Output *
              <RootElement>
                  <PossibleValues>
                      <Key>???</Key>
                      <Value>???</Value>
                  </PossibleValues>
                  <PossibleValues>
                      <Key>???</Key>
                      <Value>???</Value>
                  </PossibleValues>
                  ...
              </RootElement>

              -->


              <xsl:transform
                  xmlns:xsl="https://www.w3.org/1999/XSL/Transform"
                  xmlns:date="https://exslt.org/dates-and-times"
                  version="1.0"
                  extension-element-prefixes="date">

                  <xsl:output method="xml" encoding="utf-8" indent="yes" />

                  <!-- Don't return unmatched tags -->
                  <xsl:template match="text()" />

                  <!-- Remove empty elements -->
                  <xsl:template match="*[not(node())]" />

                  <!-- Root template -->
                  <xsl:template match="/">
                      <RootElement>
                          <xsl:apply-templates />
                      </RootElement>
                  </xsl:template>

                  <xsl:template match="/*/Ticket">
                      <PossibleValue>
                          <Key>State</Key>
                          <Value><xsl:value-of select="/*/Ticket/State" /></Value>
                      </PossibleValue>
                      <PossibleValue>
                          <Key>Queue</Key>
                          <Value><xsl:value-of select="/*/Ticket/Queue" /></Value>
                      </PossibleValue>
                  </xsl:template>

              </xsl:transform>
        Type: XSLT
      MappingOutbound:
        Config:
          Template: |-
              <?xml version="1.0" encoding="UTF-8"?>
              <!--
              Copyright (C) 2001-2023 OTRS AG, https://otrs.com/

              This software comes with ABSOLUTELY NO WARRANTY. For details, see
              the enclosed file COPYING for license information (GPL). If you
              did not receive this file, see https://www.gnu.org/licenses/gpl.txt.
              -->

              <!-- DOCUMENTATION

              * Example XML Input *
              <RootElement>
                 ...
              </RootElement>


              * Example XML Output *
              <RootElement>
                  <PossibleValues>
                      <Key>???</Key>
                      <Value>???</Value>
                  </PossibleValues>
                  <PossibleValues>
                      <Key>???</Key>
                      <Value>???</Value>
                  </PossibleValues>
                  ...
              </RootElement>

              -->

              <xsl:transform
                  xmlns:xsl="https://www.w3.org/1999/XSL/Transform"
                  xmlns:date="https://exslt.org/dates-and-times"
                  version="1.0"
                  extension-element-prefixes="date">
                  <xsl:output method="xml" encoding="utf-8" indent="yes" />

                  <!-- Don't return unmatched tags -->
                  <xsl:template match="text()" />

                  <!-- Remove empty elements -->
                  <xsl:template match="*[not(node())]" />

                  <!-- Root template -->
                  <xsl:template match="/">
                      <RootElement>
                          <UserLogin>someuser</UserLogin>
                          <Password>somepassword</Password>
                          <TicketID>1</TicketID>
                      </RootElement>
                  </xsl:template>

              </xsl:transform>
        Type: XSLT
      Type: Generic::PassThrough
  Transport:
    Config:
      Encoding: ''
      Endpoint: https://localhost/otrs/nph-genericinterface.pl/Webservice/GenericConfigItemConnectorSOAP
      NameSpace: https://www.otrs.org/TicketConnector/
      RequestNameFreeText: ''
      RequestNameScheme: Plain
      ResponseNameFreeText: ''
      ResponseNameScheme: Response
      SOAPAction: Yes
      SOAPActionSeparator: '#'
      SSL:
        SSLProxy: ''
        SSLProxyPassword: ''
        SSLProxyUser: ''
    Type: HTTP::SOAP
  UseMappedData: '1'
Nach oben scrollen