3

我尝试使用以下代码发出 https 发布请求。

NSURL *url = [NSURL URLWithString:@"https://portkey.formspring.me/login/"];

//initialize a request from url
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[url       standardizedURL]];

//set http method
[request setHTTPMethod:@"POST"];
//initialize a post data

NSDictionary *postDict = [NSDictionary dictionaryWithObjectsAndKeys:@"username", @"username",
                          @"password", @"password", nil];

NSError *error=nil;

NSData* jsonData = [NSJSONSerialization dataWithJSONObject:postDict
                                                   options:NSJSONWritingPrettyPrinted     error:&error];



[request setValue:@"application/x-www-form-urlencoded; charset=utf-8" forHTTPHeaderField:@"Content-Type"];

//set post data of request
[request setHTTPBody:jsonData];

//initialize a connection from request
NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request delegate:self];

//start the connection
[connection start];

但我得到以下回应。

错误 错误域=NSURLErrorDomain 代码=-1202 “此服务器的证书无效。您可能正在连接到伪装成“portkey.formspring.me”的服务器,这可能会使您的机密信息面临风险。” UserInfo=0x7564180 {NSLocalizedRecoverySuggestion=你想连接到服务器吗?, NSErrorFailingURLKey= https://portkey.formspring.me/login/, NSLocalizedDescription=此服务器的证书无效。您可能正在连接到一个伪装成“portkey.formspring.me”的服务器,这可能会使您的机密信息面临风险。NSUnderlyingError=0x7168a20“此服务器的证书无效。您可能正在连接到一个服务器冒充“portkey.formspring.me”,这可能会使您的机密信息面临风险。", NSURLErrorFailingURLPeerTrustErrorKey=}

谁能告诉我如何使用 NSURLConnection 发出 post 请求?

提前致谢。

4

2 回答 2

7

您尝试连接的站点的证书不受信任(尝试访问您在 Chrome 中发布的链接)。

默认情况下,iOS 不会让您连接到提供不受信任证书的站点。如果绝对必要,您可以绕过此检查 - 请参阅此问题:如何使用 NSURLConnection 与 SSL 连接以获得不受信任的证书?

但是,实际修复有问题的证书会好得多。

于 2013-06-04T13:20:35.787 回答
0

这些委托方法已NSURLConnection弃用

-(BOOL)connection:(NSURLConnection *)connection canAuthenticateAgainstProtectionSpace:(NSURLProtectionSpace *)protectionSpace
-(void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge
-(void)connection:(NSURLConnection *)connection didCancelAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge

您可以使用-connection:willSendRequestForAuthenticationChallenge:这 3 种已弃用的方法来代替

-(void)connection:(NSURLConnection *)connection willSendRequestForAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge
{
    if ([[challenge protectionSpace] authenticationMethod] == NSURLAuthenticationMethodServerTrust)
    {
        [[challenge sender] useCredential:[NSURLCredential credentialForTrust:[[challenge protectionSpace] serverTrust]] forAuthenticationChallenge:challenge];
    }
}
于 2017-01-07T12:47:37.710 回答