同步HTTPS POST请求iOS

lrA*_*oid 5 ssl https post objective-c ios

对于Android,我已经能够以下列方式发送POST请求:

HttpClient http = new DefaultHttpClient();
HttpPost request = new HttpPost("https://somewebsite.com");
request.setEntity(new StringEntity(data));
http.execute(request);
Run Code Online (Sandbox Code Playgroud)

但是,在iOS上我收到以下错误:

NSURLConnection/CFURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9843)
Run Code Online (Sandbox Code Playgroud)

在iOS上使用https执行同步POST请求的最佳方法是什么?

med*_*eda 8

你可以试试这个功能:

-(NSData *)post:(NSString *)postString url:(NSString*)urlString{

    //Response data object
    NSData *returnData = [[NSData alloc]init];

    //Build the Request
    NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:urlString]];
    [request setHTTPMethod:@"POST"];
    [request setValue:[NSString stringWithFormat:@"%lu", (unsigned long)[postString length]] forHTTPHeaderField:@"Content-length"];
    [request setHTTPBody:[postString dataUsingEncoding:NSUTF8StringEncoding]];

    //Send the Request
    returnData = [NSURLConnection sendSynchronousRequest: request returningResponse: nil error: nil];

    //Get the Result of Request
    NSString *response = [[NSString alloc] initWithBytes:[returnData bytes] length:[returnData length] encoding:NSUTF8StringEncoding];

    bool debug = YES;

    if (debug && response) {
        NSLog(@"Response >>>> %@",response);
    }


    return returnData;
}
Run Code Online (Sandbox Code Playgroud)

以下是您如何使用它:

NSString *postString = [NSString stringWithFormat:@"param=%@",param];
NSString *urlString = @"https://www.yourapi.com";

NSData *returnData =  [self post:postString url:urlString];
Run Code Online (Sandbox Code Playgroud)

编辑:

我在源代码中找到了错误代码:

errSSLHostNameMismatch = -9843, /* peer host name mismatch */

问题应该在您的服务器上解决.

这是来自文档:

errSSLHostNameMismatch -9843 您连接的主机名与证书允许的任何主机名都不匹配.这通常是由与流的kCFStreamPropertySSLSettings键关联的字典中的kCFStreamSSLPeerName属性的值不正确引起的.适用于OS X v10.4及更高版本.

希望这个帮助