Search code examples
objective-cswiftpostgetnsurlsession

How to send POST and GET request?


I want to send my JSON to a URL (POST and GET).

NSMutableDictionary *JSONDict = [[NSMutableDictionary alloc] init];
[JSONDict setValue:"myValue" forKey:"myKey"];

NSData *JSONData = [NSJSONSerialization dataWithJSONObject:self options:kNilOptions error:nil];

My current request code isn't working.

NSMutableURLRequest *requestData = [[NSMutableURLRequest alloc] init];

[requestData setURL:[NSURL URLWithString:@"http://fake.url/"];];

[requestData setHTTPMethod:@"POST"];
[requestData setValue:postLength forHTTPHeaderField:@"Content-Length"];
[requestData setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
[requestData setValue:@"application/json" forHTTPHeaderField:@"Accept"];
[requestData setHTTPBody:postData];

Using ASIHTTPRequest is not a liable answer.


Solution

  • Sending POST and GET requests in iOS is quite easy; and there's no need for an additional framework.


    POST Request:

    We begin by creating our POST's body (ergo. what we'd like to send) as an NSString, and converting it to NSData.

    NSString *post = [NSString stringWithFormat:@"test=Message&this=isNotReal"];
    NSData *postData = [post dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES];
    

    Next up, we read the postData's length, so we can pass it along in the request.

    NSString *postLength = [NSString stringWithFormat:@"%d", [postData length]];
    

    Now that we have what we'd like to post, we can create an NSMutableURLRequest, and include our postData.

    NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];
    [request setURL:[NSURL URLWithString:@"http://YourURL.com/FakeURL"]];
    [request setHTTPMethod:@"POST"];
    [request setValue:postLength forHTTPHeaderField:@"Content-Length"];
    [request setHTTPBody:postData];
    

    let post = "test=Message&this=isNotReal"
    let postData = post.data(using: String.Encoding.ascii, allowLossyConversion: true)
    
    let postLength = String(postData!.count)
    
    var request = URLRequest(url: URL(string: "http://YourURL.com/FakeURL/PARAMETERS")!)
    request.httpMethod = "POST"
    request.addValue(postLength, forHTTPHeaderField: "Content-Length")
    request.httpBody = postData;
    

    And finally, we can send our request, and read the reply by creating a new NSURLSession:

    NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]];
    [[session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
        NSString *requestReply = [[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding];
        NSLog(@"Request reply: %@", requestReply);
    }] resume];
    

    let session = URLSession(configuration: .default)
    session.dataTask(with: request) {data, response, error in
        let requestReply = NSString(data: data!, encoding: String.Encoding.ascii.rawValue)
        print("Request reply: \(requestReply!)")
    }.resume()
    

    GET Request:

    With the GET request it's basically the same thing, only without the HTTPBody and Content-Length.

    NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];
    [request setURL:[NSURL URLWithString:@"http://YourURL.com/FakeURL/PARAMETERS"]];
    [request setHTTPMethod:@"GET"];
    
    NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]];
    [[session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
        NSString *requestReply = [[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding];
        NSLog(@"Request reply: %@", requestReply);
    }] resume];
    

    var request = URLRequest(url: URL(string: "http://YourURL.com/FakeURL/PARAMETERS")!)
    request.httpMethod = "GET"
    
    let session = URLSession(configuration: .default)
    session.dataTask(with: request) {data, response, error in
        let requestReply = NSString(data: data!, encoding: String.Encoding.ascii.rawValue)
        print("Request reply: \(requestReply!)")
    }.resume()
    

    On a side note, you can add Content-Type (and other data) by adding the following to our NSMutableURLRequest. This might be required by the server when requesting, e.g, a .

    [request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
    [request setValue:@"application/json" forHTTPHeaderField:@"Accept"];
    

    Response code can also be read using [(NSHTTPURLResponse*)response statusCode].

    request.addValue("application/json", forHTTPHeaderField: "Content-Type")
    request.addValue("application/json", forHTTPHeaderField: "Accept")
    

    Update: sendSynchronousRequest is deprecated from and (10.11) and out.

    NSURLResponse *requestResponse; NSData *requestHandler = [NSURLConnection sendSynchronousRequest:request returningResponse:&requestResponse error:nil]; NSString *requestReply = [[NSString alloc] initWithBytes:[requestHandler bytes] length:[requestHandler length] encoding:NSASCIIStringEncoding]; NSLog(@"requestReply: %@", requestReply);