• Apfeltalk ändert einen Teil seiner Allgemeinen Geschäftsbedingungen (AGB), das Löschen von Useraccounts betreffend.
    Näheres könnt Ihr hier nachlesen: AGB-Änderung
  • Die Bildungsoffensive hier im Forum geht weiter! Jetzt sollen Kreativität und technische Möglichkeiten einen neue Dimension erreichen. Das Thema in diesem Monat lautet - Verkehrte Welt - Hier geht es lang --> Klick

HTTP-Request: Wie richtig

sashs

James Grieve
Registriert
23.03.10
Beiträge
133
Hallo,

ich hab im Internet jede Menge Lösungen gefunden, wie ich Daten zu einem HTTP-Server schicken kann. Allerdings weiß ich jetzt nicht wie man es machen sollte.
Ich hab einmal mit NSURL und NSString gefunden, dann NSURL über NSData zu NSString. Dann hab ich noch was mit NSMutableUrlRequest gefunden. Jetzt weiß ich allerdings nicht wie man es machen sollte.

Kurze Erklärung was ich machen möchte. Ich muss Daten mal per GET und mal per POST zum Http-Server schicken und bekomme dann einen XML-Datei als response. Diese muss ich dann auswerten.

Könnte mir jemand ein kleines Beispiel geben, wie man das richtig macht?


Gruß

Sascha
 
Hallo,

wenn du weisst, wie GET aussieht, sollte das erstmal kein Problem sein. POST ist fast gleich, nur dass die key=value-Paare nicht im URL selbst sondern in einem message body stecken. Soviel zu den Typen.

GET:
Du willst dem Server 'beispiel.de' die Paare: name: klaus, passwort: 1234 übergeben. Das geht so:
Code:
NSString *myURL = @"beispiel.de?name=klaus&passwort=1234";
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:[NSURL urlWithString:myURL]];
NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request delegate:self];
[connection start];

POST:
Du machst alles genau gleich, nur dass du die Paare eben in den body schreibst. Beispiel:
Code:
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:[NSURL urlWithString:@"beispiel.de"]];
NSString *myData = @"name=klaus&passwort=1234";
[request setHTTPBody:[myData dataUsingEncoding:NSUTF8StringEncoding]] 
NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request delegate:self];
[connection start];

Damit hast du einen Request an den Server geschickt. Der wird aber jetzt antworten. Dies wird von NSURLConnection, welche in beiden Beispielen verwendet wurde, gehandelt. Du hast ja vielleicht bemerkt, dass da immer delegate:self steht. Du musst also jetzt noch delegate-Methoden zur Verfügung stellen, um die Daten zu empfangen. Da hilft dir die doku:

URL Loading System Programming Guide - Using NSURLConnection

Sonst meldest du dich wieder hier!

Gruss ppocket

EDIT: Willst du komplizierte Daten versenden, verzichte auf GET (255 bytes Maximum) und befasse dich noch mit dem korrekten URL-Encoding: Wikipedia - URL Encoding.
 
Hallo,

danke dir!
Ok, so hab ich das auch gebaut. :-)

Die Delegate-Methoden hab ich nicht implementiert, da ich das ganze nicht asynchron sondern synchron brauche.

Aber eine Frage hab ich noch zu GET. Ich weiß, dass normal die GET-Parameter an der URL hängen. Funktioniert es nicht, wenn ich die GET-Parameter auch in den Body packe und die Methode auf GET umstelle?

Code:
NSMutableURLRequest *urlRequest = [NSMutableURLRequest requestWithURL:@"DieURl"];
		
	[urlRequest setHTTPMethod: @"GET"];

Gruß

Sascha
 
Ich denke eher nicht, und das aus einem einfachen Grund. Ein HTTP-Request sieht in deinem Fall in etwa wie folgt aus (Version 1.1):

POST /_FILEPATH_ HTTP/1.1
Host: _HOSTNAME_:80
Content-Type: application/x-www-form-urlencoded
Content-Length: 25
Connection: close

name=klaus&password=1234

Wenn du jetzt mit dem NSURLRequest also die Daten in den request-body schreibst, kommt der request an obiges Beispiel ran.

Wenn du das, wie vorgeschlagen machst: Wie soll aber jetzt der NSURLRequest wissen, dass im body Parameter-Daten stecken? Du kannst ja irgendwelche Daten mitschicken, muss nicht GET- oder POST-konform sein.

Gruss ppocket