如何发送POST和GET请求?

Ale*_*izi 45 post get objective-c nsurlsession swift

我想发送JSON一个URL(POSTGET).

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

NSData *JSONData = [NSJSONSerialization dataWithJSONObject:self options:kNilOptions error:nil];
Run Code Online (Sandbox Code Playgroud)

我当前的请求代码无效.

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];
Run Code Online (Sandbox Code Playgroud)

使用ASIHTTPRequest不是一个容易回答.

Ale*_*izi 130

iOS中的发送POSTGET请求非常简单; 并且不需要额外的框架.


POST 请求:

我们首先创建我们POSTbody(我们想发送的东西)NSString,并将其转换为NSData.

NSString *post = [NSString stringWithFormat:@"test=Message&this=isNotReal"];
NSData *postData = [post dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES];
Run Code Online (Sandbox Code Playgroud)

接下来,我们读取了postDatas length,所以我们可以在请求中传递它.

NSString *postLength = [NSString stringWithFormat:@"%d", [postData length]];
Run Code Online (Sandbox Code Playgroud)

现在我们已经发布了我们要发布的内容,我们可以创建一个NSMutableURLRequest,并包含我们的内容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];
Run Code Online (Sandbox Code Playgroud)

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;
Run Code Online (Sandbox Code Playgroud)

最后,我们可以发送我们的请求,并通过创建一个新的来阅读回复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];
Run Code Online (Sandbox Code Playgroud)

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()
Run Code Online (Sandbox Code Playgroud)

GET 请求:

随着GET请求时,它基本上是相同的东西,只是没有HTTPBodyContent-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];
Run Code Online (Sandbox Code Playgroud)

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()
Run Code Online (Sandbox Code Playgroud)

在旁注中,您可以Content-Type通过向我们添加以下内容来添加(和其他数据)NSMutableURLRequest.这可能是服务器在请求时需要的,例如,.

[request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
[request setValue:@"application/json" forHTTPHeaderField:@"Accept"];
Run Code Online (Sandbox Code Playgroud)

也可以使用读取响应代码[(NSHTTPURLResponse*)response statusCode].

request.addValue("application/json", forHTTPHeaderField: "Content-Type")
request.addValue("application/json", forHTTPHeaderField: "Accept")
Run Code Online (Sandbox Code Playgroud)

更新: sendSynchronousRequest弃用(10.11)进出.

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);
Run Code Online (Sandbox Code Playgroud)

  • 很好解释.谢谢.:) (4认同)
  • 就我而言,我将使用GET并发送json数据.我可以添加HTTPBody吗? (4认同)