首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >iOS:如何执行HTTP POST请求?

iOS:如何执行HTTP POST请求?
EN

Stack Overflow用户
提问于 2011-04-04 18:36:39
回答 3查看 121.7K关注 0票数 127

我正在进行iOS开发,我想让我的第一批应用程序之一执行HTTP POST请求。

据我所知,我应该通过NSURLConnection对象管理处理请求的连接,这迫使我有一个委托对象,而委托对象又将处理数据事件。

有没有人可以用一个实际的例子来说明这项任务?

我应该联系一个https端点,发送身份验证数据(用户名和密码)并返回一个纯文本响应。

EN

回答 3

Stack Overflow用户

发布于 2013-05-15 08:12:26

我想我应该稍微更新一下这篇文章,并说在ASIHTTPRequest被抛弃后,很多iOS社区已经转移到了AFNetworking。我强烈推荐它。它是一个围绕NSURLConnection的很好的包装器,允许异步调用,基本上是您可能需要的任何东西。

票数 7
EN

Stack Overflow用户

发布于 2015-03-25 09:05:11

以下是iOS7+的更新答案。它使用的是NSURLSession,一种新的热点。免责声明,这是未经测试的,并在文本字段中编写:

- (void)post {
    NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration] delegate:self delegateQueue:nil];
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"https://example.com/dontposthere"] cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:60.0];
    // Uncomment the following two lines if you're using JSON like I imagine many people are (the person who is asking specified plain text)
    // [request addValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
    // [request addValue:@"application/json" forHTTPHeaderField:@"Accept"]; 
    [request setHTTPMethod:@"POST"];
    NSURLSessionDataTask *postDataTask = [session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
        NSString *responseString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
    }];
    [postDataTask resume];
}

-(void)URLSession:(NSURLSession *)session didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge completionHandler:(void (^)(    NSURLSessionAuthChallengeDisposition disposition, NSURLCredential *credential))completionHandler {
    completionHandler(NSURLSessionAuthChallengeUseCredential, [NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust]);
}

或者更好的是,使用AFNetworking 2.0+。通常我会将AFHTTPSessionManager子类,但我将所有这些都放在一个方法中,以便有一个简洁的示例。

- (void)post {
    AFHTTPSessionManager *manager = [[AFHTTPSessionManager alloc] initWithBaseURL:[NSURL URLWithString:@"https://example.com"]];
    // Many people will probably want [AFJSONRequestSerializer serializer];
    manager.requestSerializer = [AFHTTPRequestSerializer serializer];
    // Many people will probably want [AFJSONResponseSerializer serializer];
    manager.responseSerializer = [AFHTTPRequestSerializer serializer];
    manager.securityPolicy.allowInvalidCertificates = NO; // Some servers require this to be YES, but default is NO.
    [manager.requestSerializer setAuthorizationHeaderFieldWithUsername:@"username" password:@"password"];
    [[manager POST:@"dontposthere" parameters:nil success:^(NSURLSessionDataTask *task, id responseObject) {
        NSString *responseString = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding];
    } failure:^(NSURLSessionDataTask *task, NSError *error) {
        NSLog(@"darn it");
    }] resume];
}

如果您正在使用JSON响应序列化程序,那么responseObject将是来自JSON响应的对象(通常是NSDictionary或NSArray)。

票数 6
EN

Stack Overflow用户

发布于 2017-05-19 20:25:14

以下是使用NSURLSession的iOS 8+的POST HTTP请求的工作原理:

- (void)call_PostNetworkingAPI:(NSURL *)url withCompletionBlock:(void(^)(id object,NSError *error,NSURLResponse *response))completion
{
    NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration];
    config.requestCachePolicy = NSURLRequestReloadIgnoringLocalCacheData;
    config.URLCache = nil;
    config.timeoutIntervalForRequest = 5.0f;
    config.timeoutIntervalForResource =10.0f;
    NSURLSession *session = [NSURLSession sessionWithConfiguration:config delegate:nil delegateQueue:nil];
    NSMutableURLRequest *Req=[NSMutableURLRequest requestWithURL:url];
    [Req setHTTPMethod:@"POST"];

    NSURLSessionDataTask *task = [session dataTaskWithRequest:Req completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
        if (error == nil) {

            NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:nil];
            if (dict != nil) {
                completion(dict,error,response);
            }
        }else
        {
            completion(nil,error,response);
        }
    }];
    [task resume];

}

希望这将满足您的以下要求。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5537297

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档