Senden einer HTTP-POST-Anfrage auf iOS
Ich versuche, das senden einer HTTP-Post mit der iOS-Anwendung, die ich entwickeln, sondern die push-nie erreicht den server zwar bekomme ich ein code 200 als Rückmeldung (von der urlconnection). Ich bekomme nie eine Antwort von dem server auch der server erkennt meine Beiträge (der server muss erkennen, Beiträge kommen von android)
Verwende ich ARC aber eingestellt haben pd und urlConnection so stark.
Dies ist mein code zum senden der request -
NSMutableURLRequest *request = [[NSMutableURLRequest alloc]
initWithURL:[NSURL URLWithString:[NSString stringWithFormat:@"%@%@",dk.baseURL,@"daantest"]]];
[request setHTTPMethod:@"POST"];
[request setValue:@"text/xml"
forHTTPHeaderField:@"Content-type"];
NSString *sendString = @"<data><item>Item 1</item><item>Item 2</item></data>";
[request setValue:[NSString stringWithFormat:@"%d", [sendString length]] forHTTPHeaderField:@"Content-length"];
[request setHTTPBody:[sendString dataUsingEncoding:NSUTF8StringEncoding]];
PushDelegate *pushd = [[PushDelegate alloc] init];
pd = pushd;
urlConnection = [[NSURLConnection alloc] initWithRequest:request delegate:pd];
[urlConnection start];
dies ist mein code für die Delegierten
#import "PushDelegate.h"
@implementation PushDelegate
@synthesize data;
-(id) init
{
if(self = [super init])
{
data = [[NSMutableData alloc]init];
[data setLength:0];
}
return self;
}
- (void)connection:(NSURLConnection *)connection didWriteData:(long long)bytesWritten totalBytesWritten:(long long)totalBytesWritten
{
NSLog(@"didwriteData push");
}
- (void)connectionDidResumeDownloading:(NSURLConnection *)connection totalBytesWritten:(long long)totalBytesWritten expectedTotalBytes:(long long)expectedTotalBytes
{
NSLog(@"connectionDidResumeDownloading push");
}
- (void)connectionDidFinishDownloading:(NSURLConnection *)connection destinationURL:(NSURL *)destinationURL
{
NSLog(@"didfinish push @push %@",data);
}
- (void)connection:(NSURLConnection *)connection didSendBodyData:(NSInteger)bytesWritten totalBytesWritten:(NSInteger)totalBytesWritten totalBytesExpectedToWrite:(NSInteger)totalBytesExpectedToWrite
{
NSLog(@"did send body");
}
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
[self.data setLength:0];
NSHTTPURLResponse *resp= (NSHTTPURLResponse *) response;
NSLog(@"got response with status @push %d",[resp statusCode]);
}
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)d
{
[self.data appendData:d];
NSLog(@"recieved data @push %@", data);
}
- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
NSString *responseText = [[NSString alloc] initWithData:self.data encoding:NSUTF8StringEncoding];
NSLog(@"didfinishLoading%@",responseText);
}
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
{
[[[UIAlertView alloc] initWithTitle:NSLocalizedString(@"Error ", @"")
message:[error localizedDescription]
delegate:nil
cancelButtonTitle:NSLocalizedString(@"OK", @"")
otherButtonTitles:nil] show];
NSLog(@"failed &push");
}
//Handle basic authentication challenge if needed
- (void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge
{
NSLog(@"credentials requested");
NSString *username = @"username";
NSString *password = @"password";
NSURLCredential *credential = [NSURLCredential credentialWithUser:username
password:password
persistence:NSURLCredentialPersistenceForSession];
[[challenge sender] useCredential:credential forAuthenticationChallenge:challenge];
}
@end
Die Konsole immer druckt die folgenden Zeilen und die folgenden Zeilen nur:
2013-04-01 20:35:04.341 ApprenticeXM[3423:907] did send body
2013-04-01 20:35:04.481 ApprenticeXM[3423:907] got response with status @push 200
2013-04-01 20:35:04.484 ApprenticeXM[3423:907] didfinish push @push <>
InformationsquelleAutor Daan Luttik | 2013-04-01
Du musst angemeldet sein, um einen Kommentar abzugeben.
Der folgende code beschreibt ein einfaches Beispiel mit
POST
Methode.(Wie kann man die übergabe der Daten vonPOST
Methode)Hier beschreibe ich, wie man die Verwendung der POST-Methode.
1. Pfosten string mit den tatsächlichen Benutzernamen und Passwort.
2. Kodieren Sie die post-string mit
NSASCIIStringEncoding
und auch die post-string, den Sie senden in NSData-format.Müssen Sie senden Sie die tatsächliche Länge der Daten. Berechnen Sie die Länge der post-string.
3. Erstellen Sie ein Urlrequest-Objekt mit allen Eigenschaften wie
HTTP
- Methode, http-header-Feld mit der Länge des post-string. ErstellenURLRequest
- Objekt und initialisiert es.Legen Sie die Url für die, die Sie gehen, um zu senden der Daten auf diese Anfrage.
Nun setzen HTTP Methode (POST-oder GET -). Schreiben dieser Zeilen, wie es in Ihrem code.
Set
HTTP
- header-Feld mit der Länge der post-Daten.Auch den Codierten Wert für die HTTP-header-Feld.
Legen Sie die
HTTPBody
des urlrequest-mit postData.4. Erstellen Sie jetzt URLConnection-Objekt. Initialisieren Sie es mit der URLRequest.
Gibt es initialisiert die url-Verbindung und beginnt das laden der Daten für die url-Anforderung. Sie können überprüfen, ob Sie
URL
Verbindung ordnungsgemäß erfolgt ist oder nicht, mit nur if/else Anweisung, wie unten beschrieben.5. Zum empfangen von Daten aus der HTTP-Anfrage , Sie können verwenden Sie die delegate-Methoden zur Verfügung gestellt von der URLConnection-Klasse Referenz.
Delegate-Methoden sind wie folgt.
Siehe auch Diese und Diese Dokumentation für
POST
Methode.Und hier ist das beste Beispiel mit Quellcode HTTPPost-Methode.
Überprüfen Sie die akzeptierte Antwort von stackoverflow.com/questions/405151/... und/oder google nach "nsurlconnection-cache policy"
Auch wenn die Antwort akzeptiert wurde, so viele Male, den angegebenen code in diese Antwort hat eine Reihe von eklatanten Probleme, und wird lästig sein in der Praxis.
Aber können wir das Bild senden von Daten mit der oben angegebenen Methode post code.
Leider ist dieser code falsch ist und anfällig für injection-Angriffe. Wenn der Benutzer geschieht, ein "&" - Zeichen in das Passwort ein, alle weiteren Zeichen wird analysiert werden, wie eine zusätzliche POST-parameter. Bewusste manipulation möglich ist.
InformationsquelleAutor iPatel
Ich bin nicht wirklich sicher, warum, aber sobald ich kommentieren Sie die folgende Methode funktioniert:
Außerdem, ich glaube nicht, Sie brauchen die Methoden aus der NSUrlConnectionDownloadDelegate-Protokoll, nur die von NSURLConnectionDataDelegate, es sei denn, Sie wollen einige download-Informationen enthalten.
Offenbar NSURLConnectionDownloadDelegate funktioniert nur in der Zeitungskiosk-apps....... Mindestens das ist, was dieser thread sagt:
InformationsquelleAutor nickygerritsen
Hier ist die Methode, die ich in meiner logging-Bibliothek: https://github.com/goktugyil/QorumLogs
Diese Methode füllt html-Formulare in Google Formulare. Hoffe es hilft jemand mit Swift.
InformationsquelleAutor Esqarrouth
InformationsquelleAutor Mannam Brahmam
**
Post API mit Parametern zu validieren und mit der url zu navigieren, wenn json
Antwort-Schlüssel (mit dem status":"success"
JSON-Antwort : {"status":"success","user_id":"58","user_name":"dilip","result":"Sie wurden erfolgreich angemeldet"}
Funktionierenden code
**
InformationsquelleAutor Dilip Tiwari
Senden einer HTTP-POST-Anforderung, die auf iOS (Objective c):
Diese "postexample" - Funktion schneller ist, Antwort,: - p @DaanLuttik
InformationsquelleAutor Ronny Morán
Mittels Swift 3 oder 4 können Sie auf diese http-Anforderung zum Server-Kommunikation.
//Für POST-Daten auf Anfrage
//Zum abrufen der Daten aus Anfrage
//Für download-Inhalte wie Bild-oder video-von der Anfrage
InformationsquelleAutor Tech