同步 HTTPS POST 请求 iOS

5

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

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

然而,在iOS上我收到了以下错误:

NSURLConnection/CFURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9843)

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


1
你需要提供你的iOS代码。Android代码不会抛出iOS域错误 :) - jww
1个回答

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;
}

以下是如何使用它:

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

NSData *returnData =  [self post:postString url:urlString];

编辑:

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

errSSLHostNameMismatch = -9843, /*同行主机名不匹配*/

问题应该在您的服务器上得到解决。

以下是来自文档中的描述:

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

希望这可以帮助到您。


这会让我得到问题中发布的错误,即“NSURLConnection/CFURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9843)”。 - lrAndroid
这是针对生产代码的。链接中的答案指出:“不要在生产环境中使用此代码,仅在开发应用程序时使用,例如证书尚未获批准/提交/安装的情况下。典型的情况是使用没有安装受信任证书的开发服务器。使用此代码将导致您的应用程序被拒绝通过iTunes分发,因为它使用了私有API方法。” - lrAndroid
请查看我的编辑,您需要在您的服务器上进行修复。 - meda

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接