Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
c# JSON Api für Personio
ChrisBa
myCSharp.de - Member



Dabei seit:
Beiträge: 54

Themenstarter:

c# JSON Api für Personio

beantworten | zitieren | melden

Hallo zusammen.
Ich muss Daten per Api aus der Software Personio. The People Operating System. ziehen.
Dazu habe ich einen Test-Account bei Personio.de erstellt.

Mein Problem ist, dass ich mit dieser Materie noch gar nichts am Hut habe...

Ich habe dazu folgenden Code in einer Consolenanwendung, der mit den Fehler "401 (Unauthorized)" liefert.
Wie gesagt, ich habe hierzu leider überhaupt keine Ahnung und bin deshalb für jede Hilfe dankbar.
Übrigens, die Variablen client_id & client_secret sind auch die richtigen für meinen Test-Account bei Personio.de. Zudem habe ich einen Screenshot von Personio angeheftet und es gibt auch eine Doku (https://developer.personio.de/reference), die mir nichts bringt.


class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("*** START ***");
            Console.WriteLine("");

            GetPersonen();

            Console.WriteLine("");
            Console.WriteLine("*** END ***");
            Console.ReadLine();
        }

        private const string URL = "https://api.personio.de/v1/company/employees?limit=300&offset=0";
        private static string client_id = "xxxx";
        private static string client_secret = "xxxxxxxx";

        public static async void GetPersonen()
        {
            using (var client = new HttpClient())
            {
                client.BaseAddress = new Uri(URL);
                client.DefaultRequestHeaders.Accept.Clear();
                client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
                client.DefaultRequestHeaders.Add("client_id", client_id);
                client.DefaultRequestHeaders.Add("client_secret", client_secret);

                var responseTask = client.GetAsync("employees");
                responseTask.Wait();

                var result = responseTask.Result;
                if (result.IsSuccessStatusCode)
                {

                    var readTask = result.Content.ReadAsAsync<Person[]>();
                    readTask.Wait();

                    var personen = readTask.Result;

                    foreach (var person in personen)
                    {
                        Console.WriteLine(person.Nachname);
                    }
                }
                else
                {
                    Console.WriteLine("{0} ({1})", (int)result.StatusCode, result.ReasonPhrase);
                }
            }
        }
    }

    public class Person
    {
        public string Vorname
        {
            get;
            set;
        }

        public string Nachname
        {
            get;
            set;
        }
    }
Attachments
Das Schicksal bevorzugt jene die bereit sind.
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 16.196

beantworten | zitieren | melden

Also erstens: poste keine Credentials in Foren.
Ich habe die Credentials aus Deinem Beitrag gelöscht, Du solltest sie trotzdem zurück setzen.
Zitat
Mein Problem ist, dass ich mit dieser Materie noch gar nichts am Hut habe...
Das ist völlig normal, aber es bietet sich immer an, dass man erstmal etwas dazu liest, statt blind loszulegen. Das Wissen kommt Dir nicht zugeflogen, das musst Dir schon selbst holen. :-)
Gerade bei REST APIs gibts fertige Bibliotheken, wie zB. Refit, die einem sehr viel Arbeit und auch die Authentifizierung sowie vor allem die Fehlerbehandlung und Kommunikation abnehmen.

Ansonsten hat Dein Code auch auf den wenigen Code schon viel konzeptionelle Fehler, zB Dein Wait bei einem Task (das kann in der Form Deadlocks und damit in Folge zum Absturz führen), oder das using um den HttpClient.
private Nachricht | Beiträge des Benutzers
ChrisBa
myCSharp.de - Member



Dabei seit:
Beiträge: 54

Themenstarter:

beantworten | zitieren | melden

Hallo und Danke für die Antwort.
Ich dachte ich kann die Credentials anzeigen, da es sich ja um einen Test-Account handelt....
Über Refit werde ich mich gleich mal schlau machen.
Sonst noch Tipps?
Das Schicksal bevorzugt jene die bereit sind.
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 16.196

beantworten | zitieren | melden

Credentials sind Credentials. Behandle sie als solches, egal von was. ;-)
private Nachricht | Beiträge des Benutzers
ChrisBa
myCSharp.de - Member



Dabei seit:
Beiträge: 54

Themenstarter:

beantworten | zitieren | melden

Hallo, der Support von Personio hat mir nun geschrieben:
Zitat
Eine API-Request muss durch einen Bearer-Token verifiziert werden, der für jede neue Anfrage im Vorfeld neu abgerufen/generiert werden muss.
Weiter Auskunft oder Hilfe kann er mir dazu aber nicht geben.

Wie mache ich denn so einen Bearer-Token-Verifizierung auf meinen Code bezogen?
Das Schicksal bevorzugt jene die bereit sind.
private Nachricht | Beiträge des Benutzers
glandorf
myCSharp.de - Member

Avatar #avatar-4144.jpg


Dabei seit:
Beiträge: 84
Herkunft: Chemnitz

beantworten | zitieren | melden

Hallo,

https://developer.personio.de/reference

glandorf
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 16.196

beantworten | zitieren | melden

Zitat von ChrisBa
Wie mache ich denn so einen Bearer-Token-Verifizierung auf meinen Code bezogen?
Sorry, das so deutlich zu sagen, aber den Code kannst wegwerfen :-)
Nimm ein REST Package (zB Refit), schau in dessen Doku: die haben alle Bearer-Token Support.

Personio ist ein personen-bezogener Service - Du unterliegst damit sehr strengen DSGVO Regeln.
Eine Lücke in Deinem Code kann euch (finanziell) extrem weh tun.
Also les besser 1-2 Dokumentationen, bevor Du irgendwas hin klatschst. Dir wird das nicht zugeflogen kommen.
Machs ordentlich. :-)
private Nachricht | Beiträge des Benutzers
ChrisBa
myCSharp.de - Member



Dabei seit:
Beiträge: 54

Themenstarter:

beantworten | zitieren | melden

Alles klar. Danke für eure Hilfe.
Das hier ist damit geschlossen.
Das Schicksal bevorzugt jene die bereit sind.
private Nachricht | Beiträge des Benutzers
ChrisBa
myCSharp.de - Member



Dabei seit:
Beiträge: 54

Themenstarter:

beantworten | zitieren | melden

Jetzt habe ich doch noch einen Nachbrenner....

Also, ich habs jetzt hin bekommen, dass ich die gewünschten Infos als JSON-String erhalte...
Nun stellt sich mir die Frage wie genau ich die richtigen Infos aus dem JSON-String erhalte.

Mein Versuch:


public static void GetPersonen(string token)
        {
            var httpRequest = (HttpWebRequest)WebRequest.Create(string.Format("{0}&client_id={1}&client_secret={2}", EmployeesURL, Client_id, Client_secret));
            httpRequest.Accept = "application/json";
            httpRequest.Headers["Authorization"] = "Bearer " + token;


            var httpResponse = (HttpWebResponse)httpRequest.GetResponse();
            using (var streamReader = new StreamReader(httpResponse.GetResponseStream()))
            {
                var jsonData = streamReader.ReadToEnd();

               
                JObject jObject = JObject.Parse(jsonData);

                foreach (var data in jObject["data"])
                {
                    foreach (var attributes in data["attributes"])
                    {
                        var firstname = attributes.SelectToken("first_name");
                        var value = firstname.SelectToken("value");
                        Console.WriteLine(value.Value<string>("value"));
                    }

                }
            }
        }


Aus dem JSON-String, siehe Anhang.
Attachments
Das Schicksal bevorzugt jene die bereit sind.
private Nachricht | Beiträge des Benutzers
Papst
myCSharp.de - Experte



Dabei seit:
Beiträge: 429
Herkunft: Kassel

beantworten | zitieren | melden

Erstelle dir eine Klasse (dafür gibt es Generatoren, die aus dem JSON C# Code erstellen) und lass es dir in diese deserialisieren.

Das würde dir übrigens auch eine Bibliothek wie Refit abnehmen.

Übrigens: der HttpWebRequest, den du verwendest ist veraltet (auch das würde dir refit abnehmen).
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 16.196

beantworten | zitieren | melden


string.Format("{0}&client_id={1}&client_secret={2}", EmployeesURL, Client_id, Client_secret)
Client Id und Client Secret via GET Parameter...
Genau so entstehen Sicherheitslücken. Herzlichen Glückwunsch :-)

Edit: wow, das steht sogar als GET in der Dokumentation von Personio.
Ich schreibe denen mal...
private Nachricht | Beiträge des Benutzers
ChrisBa
myCSharp.de - Member



Dabei seit:
Beiträge: 54

Themenstarter:

beantworten | zitieren | melden

Kann mir bitte jemand helfen?

Ich bekomme den Fehler: "The JSON value could not be converted to System.String. Path: $.success | LineNumber: 0 | BytePositionInLine: 15."
Bei diesem Code:


public static void GetPersonen(string token)
        {
            var httpRequest = (HttpWebRequest)WebRequest.Create(string.Format("{0}&client_id={1}&client_secret={2}", EmployeesURL, Client_id, Client_secret));
            httpRequest.Accept = "application/json";
            httpRequest.Headers["Authorization"] = "Bearer " + token;


            var httpResponse = (HttpWebResponse)httpRequest.GetResponse();
            using (var streamReader = new StreamReader(httpResponse.GetResponseStream()))
            {
                var jsonData = streamReader.ReadToEnd();


                var mitarbeiter = System.Text.Json.JsonSerializer.Deserialize<Mitarbeiter>(jsonData);
                Console.WriteLine(mitarbeiter.data.attributes.first_name.value);
            }
        }


Mit diesen Klassen:


public class Mitarbeiter
    {
        public string success { get; set; }
        public Data data { get; set; }
    }

    public class Data 
    {
        public string type { get; set; }
        public Attributes attributes { get; set; }
    }

    public class Attributes
    {
        public string type { get; set; }
        public Id id { get; set; }
        public FirstName first_name { get; set; }
    }

    public class Id
    {
        public string label { get; set; }
        public int value { get; set; }
        public string type { get; set; }
        public string universal_id { get; set; }
    }

    public class FirstName
    {
        public string label { get; set; }
        public string value { get; set; }
        public string type { get; set; }
        public string universal_id { get; set; }
    }
Das Schicksal bevorzugt jene die bereit sind.
private Nachricht | Beiträge des Benutzers
Caveman
myCSharp.de - Member

Avatar #avatar-3854.jpg


Dabei seit:
Beiträge: 155

beantworten | zitieren | melden

Zitat von ChrisBa
Kann mir bitte jemand helfen?

Ich bekomme den Fehler: "The JSON value could not be converted to System.String. Path: $.success | LineNumber: 0 | BytePositionInLine: 15."
Bei diesem Code:


public class Mitarbeiter
    {
        public string success { get; set; }
        public Data data { get; set; }
    }

Ändere die Mitarbeiterklasse wie folgt:


public class Mitarbeiter
    {
        public bool success { get; set; }
        public Data data { get; set; }
    }
private Nachricht | Beiträge des Benutzers
ChrisBa
myCSharp.de - Member



Dabei seit:
Beiträge: 54

Themenstarter:

beantworten | zitieren | melden

Besten Dank für die Hilfe.
Funktioniert nun. Kann geschlossen werden.
Das Schicksal bevorzugt jene die bereit sind.
private Nachricht | Beiträge des Benutzers