Objective C - POST data using NSURLConnection

2019-03-21 16:58发布

I'm very slowly working my way through learning the URL loading system for iOS development, and I am hoping someone could briefly explain the following piece of code:

NSString *myParameters = [[NSString alloc] initWithFormat:@"one=two&three=four"];
[myRequest setHTTPMethod:@"POST"];
[myRequest setHTTPBody:[myParameters dataUsingEncoding:NSUTF8StringEncoding]];

Eventually I would like to be able to create an application that logs into my ISP's website and retrieves how much data I have left for the rest of the month, and I feel as though I should get my head around setHTTPMethod/setHTTPBody first.

Kind regards

4条回答
等我变得足够好
2楼-- · 2019-03-21 17:03

This is a pretty simple HTTP request setup; if you have more specific questions you might do better asking those.

NSString *myParameters = @"paramOne=valueOne&paramTwo=valueTwo";

This sets up a string containing the POST parameters.

[myRequest setHTTPMethod:@"POST"];

The request needs to be a POST request.

[myRequest setHTTPBody:[myParameters dataUsingEncoding:NSUTF8StringEncoding]];

This puts the parameters into the post body (they need to be raw data, so we first encode them as UTF-8).

查看更多
倾城 Initia
3楼-- · 2019-03-21 17:09

The first line created an string, it can be replaced with:

NSString *myParameters = @"one=two&three=four";

It's written in initWithFormat so you can extend it to assign parameter value.

Second line indicate this is HTTP post request.

The third line, setHTTPBody method take NSData type, so you need to convert string type to NSData using dataUsingEncoding method.

查看更多
聊天终结者
4楼-- · 2019-03-21 17:10
please use below code.
+(void)callapi:(NSString *)str withBlock:(dictionary)block{

NSData *postData = [str dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES];
NSString *postLength = [NSString stringWithFormat:@"%lu",(unsigned long)[postData length]];

NSMutableURLRequest *urlRequest = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:[NSString stringWithFormat:@“%@/url”,WebserviceUrl]]
                                                          cachePolicy:NSURLRequestUseProtocolCachePolicy
                                                      timeoutInterval:120.0];

[urlRequest setHTTPMethod:@"POST"];
[urlRequest setValue:postLength forHTTPHeaderField:@"Content-Length"];
[urlRequest setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];
[urlRequest setHTTPBody:postData];

[NSURLConnection sendAsynchronousRequest:urlRequest queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError)
 {
     if (!data) {
         NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];
          [dict setObject:[NSString stringWithFormat:@"%@",AMLocalizedString(SomethingWentWrong, nil)] forKey:@"error"];
         block(dict);
         return ;
     }
     NSError *error = nil;
     NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:&error];
     //////NSLog(@"%@",dict);
     if (!dict) {
         NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];
         [dict setObject:AMLocalizedString(ServerResponceError, nil) forKey:@"error"];
         block(dict);
         return ;
     }
     block(dict);

 }];
}
查看更多
家丑人穷心不美
5楼-- · 2019-03-21 17:23
Step 1 : set URL definitions:

// Create the request

    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"http://192.168.0.232:8080/xxxx/api/Login"]];

    // Specify that it will be a POST request
    request.HTTPMethod = @"POST";

    // This is how we set header fields
    [request setValue:@"application/x-www-form-urlencoded; charset=utf-8" forHTTPHeaderField:@"Content-Type"];

    NSMutableDictionary *postDict = [[NSMutableDictionary alloc] init];

    [postDict setValue:@"Login" forKey:@"methodName"];
    [postDict setValue:@"admin" forKey:@"username"];
    [postDict setValue:@"123456" forKey:@"password"];
    [postDict setValue:@"mobile" forKey:@"clientType"];


    NSData *jsonData = [NSJSONSerialization dataWithJSONObject:postDict options:0 error:nil];

    // Checking the format
    NSString *urlString =  [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];


    // Convert your data and set your request's HTTPBody property
    NSString *stringData = [[NSString alloc] initWithFormat:@"jsonRequest=%@", urlString];

    //@"jsonRequest={\"methodName\":\"Login\",\"username\":\"admin\",\"password\":\"12345678n\",\"clientType\":\"web\"}";

    NSData *requestBodyData = [stringData dataUsingEncoding:NSUTF8StringEncoding];

    request.HTTPBody = requestBodyData;

    // Create url connection and fire request
    NSURLConnection *theConnection = [[NSURLConnection alloc] initWithRequest:request delegate:self];

    if (!theConnection) {

        // Release the receivedData object.
        NSMutableData *responseData = nil;

        // Inform the user that the connection failed.
    }

Step 2: 

// Declare the value for NSURLResponse URL

//pragma mark NSURLConnection Delegate Methods

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {
    // A response has been received, this is where we initialize the instance var you created
    // so that we can append data to it in the didReceiveData method
    // Furthermore, this method is called each time there is a redirect so reinitializing it
    // also serves to clear it
    _responseData = [[NSMutableData alloc] init];
}

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
    // Append the new data to the instance variable you declared
    [_responseData appendData:data];

    NSError *error=nil;

    // Convert JSON Object into Dictionary
    NSDictionary *JSON = [NSJSONSerialization JSONObjectWithData:_responseData options:
                          NSJSONReadingMutableContainers error:&error];



    NSLog(@"Response %@",JSON);
}

- (NSCachedURLResponse *)connection:(NSURLConnection *)connection
                  willCacheResponse:(NSCachedURLResponse*)cachedResponse {
    // Return nil to indicate not necessary to store a cached response for this connection
    return nil;
}

- (void)connectionDidFinishLoading:(NSURLConnection *)connection {
    // The request is complete and data has been received
    // You can parse the stuff in your instance variable now

}

- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error {
    // The request has failed for some reason!
    // Check the error var
}
查看更多
登录 后发表回答