我正在尝试在https上进行HTTP调用。这是我的代码片段。
NSMutableURLRequest *request = [[NSMutableURLRequest alloc]
initWithURL:[NSURL
URLWithString:@"https://testservice.fiamm.com/token"]];
[request setHTTPMethod:@"POST"];
[request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-type"];
NSString *postString = @"username=TestIphone&Password=T3st1ph$n&Grant_type=password";
[request setValue:[NSString stringWithFormat:@"%d", [postString length]] forHTTPHeaderField:@"Content-length"];
[request setHTTPBody:[postString
dataUsingEncoding:NSUTF8StringEncoding]];
// Fetch the JSON response
NSData *urlData;
NSURLResponse *response;
NSError *error;
// Make synchronous request
urlData = [NSURLConnection sendSynchronousRequest:request
returningResponse:&response
error:&error];
// Construct a String around the Data from the response
NSString *strFiamm = [[NSString alloc] initWithData:urlData encoding:NSUTF8StringEncoding];
当我尝试投掷或邮递员时,我得到了适当的回复,但是当我尝试使用我的代码时,我得到了这个错误。
NSURLConnection / CFURLConnection HTTP加载失败(kCFStreamErrorDomainSSL,-9813)
任何帮助或建议表示赞赏。!
答案 0 :(得分:0)
您在此处提到的链接不是https证书,因此请使用简单的http而不是https
编辑#1
我尝试了这些值
http://testservice.fiamm.com/token
username=TestIphone
Password=T3st1ph$n
Grant_type=password
,输出
403 - Forbidden: Access is denied.
You do not have permission to view this directory or page using the credentials that you supplied.
表示您的用户名密码或键值不正确
答案 1 :(得分:0)
您没有正确设置Content-Length
标头。内容的正确长度是以{1}为单位以UTF-8编码的字节。 postString
返回UTF-16代码点的数量(既不是UTF-8中的字节数,也不是字符串中的字符数)。
您还应确保将帖子字符串正确地进行网址编码,以便与[postString length]
一起使用。您可以在SO上找到关于此的一些帖子。但是,权威性指南是:URL-encoded form data。您应特别注意第一段中强调的关于application/x-www-form-urlencoded
表单数据的警告:
"这种形式的数据集编码在很多方面都是异常的怪物,是多年实施事故和妥协的结果,导致了互操作性所需的一系列要求,但绝不代表良好的设计实践。特别要提醒读者注意扭曲的细节,包括字符编码和字节序列之间的重复(在某些情况下是嵌套的)转换。"
话虽如此,我强烈建议使用另一个Content-Type将数据传递给服务器,例如JSON。
答案 2 :(得分:0)
在您的课程中添加此方法
-(void) connection:(NSURLConnection *)connection willSendRequestForAuthenticationChallenge:(NSURLAuthenticationChallenge *) challenge {
if ([challenge.protectionSpace.authenticationMethod isEqualToString: NSURLAuthenticationMethodServerTrust])
{
NSURL* baseURL = [NSURL URLWithString:@"yourURL”];
if ([challenge.protectionSpace.host isEqualToString:baseURL.host])
{
SecTrustRef trust = challenge.protectionSpace.serverTrust;
NSURLCredential *cred = [NSURLCredential credentialForTrust:trust];
[challenge.sender useCredential:cred forAuthenticationChallenge:challenge];
}
else
NSLog(@"Not trusting connection to host %@", challenge.protectionSpace.host);
}
[challenge.sender continueWithoutCredentialForAuthenticationChallenge:challenge];
}