Hauptmenü

Suche nach Kontakten mit API GetContact

Begonnen von euheine, 14.01.2025 15:41:09

⏪ vorheriges - nächstes ⏩

euheine

Hallo alle miteinander,
ich versuche gerade via API Call in Kix Asset anzulegen, was auch funktioniert.
Nun muss ich aber zusätzlich den Assets jeweils einen Kontakt zuweisen. Mit GetContacts bekomen ich immer nur eine Liste der Kontakte, in der ich dann wiederum nach den passenden Kontaktdaten suchen muss. Besser wäre es, wenn ich zum Beispiel über die EMail des Kontaktes die zugehörige Kix-ID oder Name, Vorname abfragen könnte. Leider habe ich mit dem Request Body bisher keinerlei Erfolge erzielt. Selbst bei der gezielten Abfrage mit einer bekannten ID bekomme ich in der Felermeldung nur die Mitteilung:

ERROR org.quartz.core.JobRunShell.run - Job connection.189-173 threw an unhandled Exception:
1011 Jan 14 13:57:56 DATA-BROKER-TEST oc[2743977]: java.lang.IllegalArgumentException: Parameter should have not empty value, parameter = { name = 'contactId', location = 'path', style = 'simple', schema = { type = 'string', value = nul    l}}

Kann mir jemand eventuell ein Stück JSON Code zur Verfügung stellen, mit dem ich einzelne Kontakt gezielt abfragen kann?
Vielen Dank.
Mit freundlichen Grüssen
euheine

euheine

Alternativ ist für mich die Frage, ob die Methode GetContacts, die alle Kontakte zurückgibt einen Parameter zur Filterung zuläßt?
Eventuell wie
{
   "Email":"max@mustermann.de"
}
Zumindest habe ich das beim Blick auf die Methode /contacts | GET | V1::Contact::ContactSearch vermutet, aber ohne Erfolg versucht.
   

cgaertner

Hallo euheine,

Schau bitte mal in die API Dokumentation
https://github.com/kix-service-software/kix-backend/tree/master/doc/API/V1

der Endpunkt Contact Search ist dafür besser geeignet da er gezielte Filter ermöglicht

hier ist eine Beispiel JSON für die Abfrage eines Kontakts über die Email
{
   "parameter":{
      "name": "Email",
      "value": "max@mustermann.de"
   }
}



viele Grüße - Ihr KIX-Service-Team,
Cedric Gärtner

euheine

Hallo Cedric,
vielen Dank für deinen Tip. Das probiere ich gleich mal aus.
Mit freundlichen Grüßen
euheine

euheine

#4
Hallo Cedric,
ich habe es als Python Skript und mit OpenCelium probiert, bekomme aber in beiden Fällen die vollständige Kontakt-Liste ungefiltert zurück.
Mein Python Aufruf, indem die Parameter Struktur als JSON Strutur beim Aufruf mitgegeben wird, sieht so aus:
meine filter Werte:

    # Suche mit Filterparameter
    parameter_name = "Email"
    parameter_value = "Max.Musterman@moon.de"


meine Python Funktion:

def get_contacts_with_filter(auth_token, parameter_name, parameter_value):
    """Funktion zum Abrufen von Kontakten mit einem Filterparameter."""
    url = f"{BASE_URL}/contacts"
    headers = {
        "Authorization": f"Token {auth_token}",
        "Content-Type": "application/json"
    }

    # Filterparameter erstellen
    search_params = {
        "parameter": {
            "name": parameter_name,
            "value": parameter_value
        }
    }
   
        }

    response = requests.get(url, headers=headers, json=search_params)
    if response.status_code == 200:
        return response.json().get("Contact", [])
    else:
        print(f"Fehler beim Abrufen der Kontakte: {response.status_code} - {response.text}")
        return None

Im OpenCelium sieht der Request wie folgt aus:

URL: http://ticketsystem:20000/api/v1/contacts
Body: {"parameter": {"name": "Email", "value": "Max.Musterman@moon.de"}}

In beiden Fällen wird die Liste komplett zurückgegeben. Die Mail-Adresse ist im System in selber Schreibweise sicher vorhanden.
Wo kann hier mein Fehler liegen?
Wie immer dankbar für einen Tip.
Mit freundlichen Grüßen
euheine

cgaertner

#5
Hallo euheine,
ich hätte eine kleine Verbesserung bei der Python Funktion

import requests

def get_contacts_with_filter(auth_token, parameter_name, parameter_value):
    """
    Funktion zum Abrufen von Kontakten mit einem Filterparameter.
    """
    url = f"{BASE_URL}/contacts"
    headers = {
        "Authorization": f"Token {auth_token}",
        "Content-Type": "application/json"
    }
   
    # Filterparameter erstellen
    search_params = {
        "filter": [
            {
                "name": parameter_name,
                "operator": "equals",
                "value": parameter_value
            }
        ]
    }
   
    # Anfrage senden
    response = requests.post(url, headers=headers, json=search_params)
   
    if response.status_code == 200:
        return response.json().get('contacts', [])
    else:
        print(f"Fehler beim Abrufen der Kontakte: {response.status_code} - {response.text}")
        return None

falls das nicht funktionieren sollte versuch mal die Filterung in dem Code durchzuführen

Viele Grüße,
Cedric

euheine

Im Kix api_metric.log erscheint folgendes:

2025-01-15 13:35:41 203176 info 111 POST 201 /auth
2025-01-15 13:35:41 202389 info 1421 GET 200 /contacts {"parameter":{"value":"Max.Mustermann@moon.de","name":"Email"}}
2025-01-15 13:35:52 199085 info 36 GET 200 /system/logs/964a66f50cd17132a025ad767e4a4039 {"LogFileID":["964a66f50cd17132a025ad767e4a4039"],"tier":"BACKEND","include":{"Content":1}}
2025-01-15 13:35:52 199085 info 42 GET 200 /session/user {"include":{"DynamicFields":1,"RoleIDs":1,"Preferences":1,"Contact":1}}
2025-01-15 13:35:53 199085 info 23 GET 200 /session {}

cgaertner

Ich hätte noch einen Vorschlag:
import requests

BASE_URL = "http://ticket-test.smwk.sachsen.de:20000/api/v1"  # Passe die URL an
AUTH_TOKEN = "dein_auth_token"  # Setze deinen Token hier ein

def get_contacts_with_filter(auth_token, parameter_name, parameter_value):
    """
    Funktion zum Abrufen von Kontakten mit einem Filterparameter.
    """
    url = f"{BASE_URL}/contacts"
    headers = {
        "Authorization": f"Token {auth_token}",
        "Content-Type": "application/json"
    }

    # Versuch mit POST und Filter im Body
    search_params_post = {
        "filter": [
            {
                "name": parameter_name,
                "operator": "equals",
                "value": parameter_value
            }
        ]
    }

    # Versuch mit GET und Query-String-Filter
    search_params_get = {parameter_name: parameter_value}

    # POST-Request
    print("Sende POST-Request mit Filter im Body...")
    response_post = requests.post(url, headers=headers, json=search_params_post)
   
    if response_post.status_code == 200:
        print("POST erfolgreich. Rückgabe:", response_post.json())
        return response_post.json().get('contacts', [])
    else:
        print(f"Fehler beim POST: {response_post.status_code} - {response_post.text}")
   
    # GET-Request (Fallback)
    print("Sende GET-Request mit Filter im Query-String...")
    response_get = requests.get(url, headers=headers, params=search_params_get)
   
    if response_get.status_code == 200:
        print("GET erfolgreich. Rückgabe:", response_get.json())
        return response_get.json().get('contacts', [])
    else:
        print(f"Fehler beim GET: {response_get.status_code} - {response_get.text}")

    return None

# Aufruf der Funktion
filtered_contacts = get_contacts_with_filter(AUTH_TOKEN, "Email", "max@mustermann.de")
if filtered_contacts:
    print("Gefilterte Kontakte:", filtered_contacts)
else:
    print("Keine Kontakte gefunden oder ein Fehler ist aufgetreten.")

Sollte das nicht funktionieren nochmal in die Dokumentation schauen ob es spezielle Parameter oder Authentifizierungsmethoden gibt, manuell Testen ob die API Filter unterstützt oder im Client filtern

euheine

#8
Hallo Cedric und cgaertner

vielen Dank für eure Unterstützung.
Die folgende Lösung hat zum Ziel geführt:

1.) Die search_params wurden zu:

search_filter = {
    "Contact": {
        "AND": [
            {
                "Field": parameter_name,
                "Operator": "EQ",
                "Value": parameter_value
            }
        ]
    }
}

Die URL für den Aufruf :
url = f"{BASE_URL}/contacts"
muss erweitert werden:
response = requests.get(url+"?filter="+json.dumps(search_filter), headers=headers)

Damit liefert mein Skript das gewünschte Ergebnis und filtert den entsprechenden contact heraus.

Mit freundlichen Grüßen
euheine