• Apfeltalk ändert einen Teil seiner Allgemeinen Geschäftsbedingungen (AGB), das Löschen von Useraccounts betreffend.
    Näheres könnt Ihr hier nachlesen: AGB-Änderung
  • Viele hassen ihn, manche schwören auf ihn, wir aber möchten unbedingt sehen, welche Bilder Ihr vor Eurem geistigen Auge bzw. vor der Linse Eures iPhone oder iPad sehen könnt, wenn Ihr dieses Wort hört oder lest. Macht mit und beteiligt Euch an unserem Frühjahrsputz ---> Klick

http POST request / JSON

osx_nerd

Querina
Registriert
21.11.12
Beiträge
185
Hallo,

kann mir jemand sagen wie ich einen http POST request schreibe? Die API spricht JSON.

Ich habe zich 1000 Zeilen Code geschrieben versucht und getestet, aber irgendwie komme ich hier nicht weiter.

Ich möchte rein mit xCode schreiben keine zusätzlichen "tools" benutzen.

wenn ich die folgenden Daten im HTTP Client übergebe, dann funktioniert es und ich bekomme die richtige Response.

HTML:
// URL
http://ccu-ip/api/homematic.cgi

// httpBody

{
    "method": "Session.login",
    "params":  {
       "username" : „<User>",
       "password" : "<password>"
     }

}

Nur schaffe ich es nicht in xCode umzusetzen, ich hoffe jemand hat paar Minuten Zeit für mich und kann mir das umsetzen, das würde mir beim lernen und verstehen von xCode sicherlich weiter helfen.

Vielen Dank im voraus :)
 

Klaarname

Jonagold
Registriert
07.09.12
Beiträge
18
Ok, ich habe mich mal hingesetzt und etwas gebastelt.
Vorweg: Deine URL stimmt (wahrscheinlich) nicht.


Das gesamte Xcode projekt kannst du dir hinter diesem Link herunterladen.

Um einen POST loszulassen genügen schon folgende Zeilen:
Code:
 NSURLSessionConfiguration *defaultConfigObject = [NSURLSessionConfiguration defaultSessionConfiguration];
   
 
    NSURLSession *urlSession = [NSURLSession sessionWithConfiguration:defaultConfigObject delegate:nil delegateQueue:[NSOperationQueue mainQueue]];
   
   
    NSURL *url = [NSURL URLWithString:@"http://ccu-ip/api/homematic.cgi"];
   
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
    [request setHTTPMethod:@"POST"];
   
   
    NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:@"Session.login",@"method" , [NSDictionary dictionaryWithObjectsAndKeys:@"<User>",@"username", @"<password>", @"password", nil], @"params", nil];
    NSError *error = nil;
   
   
   
    [request setHTTPBody:[NSJSONSerialization dataWithJSONObject:dict options:NSJSONWritingPrettyPrinted error:&error]];
    if(error) {
        NSLog(@"error creating JSON: %@", error.description);
        return;
    }
   
   
   
   
    
    NSURLSessionDataTask *task = [urlSession dataTaskWithRequest:request
                                              completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
                                                  NSLog(@"Received Response: %@ %@\n", response, error);
                                                  if(error == nil)
                                                  {
                                                      NSString * text = [[NSString alloc] initWithData: data encoding: NSUTF8StringEncoding];
                                                      NSLog(@"Received Data: %@",text);
                                                  }
                                                 
                                              }];
    [task resume];


Genauere Informationen findest du im Xcode Projekt ;)


Hilfreich ist auch die Apple-Dokumentation über NSURLSessionDataDelegate und falls es nicht klappt kannst du dich hiermit den Fehlern nähern.

Grüße! :)
 
  • Like
Reaktionen: osx_nerd

osx_nerd

Querina
Registriert
21.11.12
Beiträge
185
Vielen Dank, das klappt .... im ersten überfliegen war mein Fehler wohl im setHTTPBody :)

Das hilft mir echt weiter .... :)
 

osx_nerd

Querina
Registriert
21.11.12
Beiträge
185
Ich habe es noch mal bisschen umgestaltet, langsam kommt etwas Licht in mein Dunkels xCode ;)

Ich habe den Code mal angehangen, vielleicht hilft es ja irgendeinen Anfänger, wie ich es bin ;)

Wenn irgendwer sieht das ich da Unsinn schreibe, bitte bescheid sagen ;)

Natürlich ist mir bewusst das der Code so nicht bleiben sollte/kann und noch in einer Methode umgeschrieben werden sollte/muss .... denn er wird ja wenn es mal soweit ist sehr oft aufgerufen mit verschiedenen Parametern ....

Die Drei NSLog Zeilen waren nur für mich zum testen, ob ich auch die richtigen Daten bekomme und ins richtige Dictionary schreibe ;)




Code:
NSError *error = nil;
   
    NSURL *url = [NSURL URLWithString:@"http://<IP-ADRESSE>/api/homematic.cgi"];
   
    NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:@"Session.login",@"method" ,
                          [NSDictionary dictionaryWithObjectsAndKeys:@"<USER>",@"username", @"<PASSWORD>", @"password", nil], @"params", nil];
   
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
    [request setHTTPMethod:@"POST"];
    [request setHTTPBody:[NSJSONSerialization dataWithJSONObject:dict options:NSJSONWritingPrettyPrinted error:&error]];
   
    NSHTTPURLResponse *response = [[NSHTTPURLResponse alloc]init];
    NSData *responseData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
    NSDictionary *responseDictionary = [NSJSONSerialization JSONObjectWithData:responseData options:0 error:&error];
   
    if(error) {
        NSLog(@"JSON Error: %@", error.description);
        return;
    }
   
    NSLog(@"AUSGABE: %@",[[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding]);
    NSLog(@"response: %@", response);
    NSLog(@"responseDictionary: %@", responseDictionary);
 

Klaarname

Jonagold
Registriert
07.09.12
Beiträge
18
Noch ein kleiner Tipp:
Versuche Geschichten, die etwas mit dem Netzwerk machen, immer asynchron zu halten.
Also wenn es dir nur darauf ankommt, dass es funktioniert, kannst du es natürlich so lassen, aber wenn du weiter dazulernen willst, empfehle ich dir, es (später) asynchron zu schreiben :)
 

BBsan

Boskoop
Registriert
17.01.10
Beiträge
40
Selbst schreiben ist ja immer eine Möglichkeit....
aber...
ich verwende für meine Projekte in den meisten Fällen AFNetworking. Hat den großen Vorteil, dass eigentlich alles schon gekapselt ist - inkl serialization und deserialization. Kannst es dir ja mal anschauen!