【问题标题】:Synchronous HTTPS POST Request iOS同步 HTTPS POST 请求 iOS
【发布时间】:2014-10-09 16:56:05
【问题描述】:

对于 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 请求的最佳方式是什么?

【问题讨论】:

  • 您需要提供您的 iOS 代码。 Android 代码不会引发 iOS 域错误 :)

标签: ios objective-c post ssl https


【解决方案1】:

你可以试试这个功能:

-(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, /* peer host name mismatch */

问题应该是你的服务器上的地址。

这里来自docs

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

希望有帮助

【讨论】:

  • 这让我得到了问题中发布的错误,即“NSURLConnection/CFURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9843)”。
  • 这是生产代码。链接上的答案指出:“不要将此代码用于生产,而仅在证书尚未批准/提交/安装的情况下开发应用程序时使用。典型的是使用没有受信任的开发服务器证书已安装。使用此代码将拒绝通过 iTunes 分发您的应用程序,因为它使用私有 API 方法。"
  • 请看我的编辑,你必须在你的服务器上修复它
猜你喜欢
  • 2013-05-30
  • 1970-01-01
  • 2011-06-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-09
  • 1970-01-01
  • 2013-08-04
相关资源
最近更新 更多