Php NSURLConnection sendSynchronousRequest需要在URL中进行身份验证
通过这个问题,我实现了将文件上载到服务器:Php NSURLConnection sendSynchronousRequest需要在URL中进行身份验证,php,ios,objective-c,http,http-authentication,Php,Ios,Objective C,Http,Http Authentication,通过这个问题,我实现了将文件上载到服务器: 我正在阅读苹果的文档以了解NSURLConnection sendSynchronousRequest方法的安全性,文档中说,如果文件需要身份验证,它将在URL中使用凭据。我的问题是,如何要求身份验证?我假设它在服务器端。有大量不同类型的身份验证。有关更多信息,请参阅《URL加载系统编程指南》的一节 但是,在回答您的问题时,是的,您可能希望在web服务器上使用安全性,然后让您的iOS网络请求使用适当的凭据进行身份验证。如果您只是想了解身份验证请求的世界
我正在阅读苹果的文档以了解NSURLConnection sendSynchronousRequest方法的安全性,文档中说,如果文件需要身份验证,它将在URL中使用凭据。我的问题是,如何要求身份验证?我假设它在服务器端。有大量不同类型的身份验证。有关更多信息,请参阅《URL加载系统编程指南》的一节 但是,在回答您的问题时,是的,您可能希望在web服务器上使用安全性,然后让您的iOS网络请求使用适当的凭据进行身份验证。如果您只是想了解身份验证请求的世界,那么您可能应该从HTTP“基本”身份验证开始。(还有许多其他类型的身份验证,但检查所有这些类型超出了简单堆栈溢出回答的范围。) HTTP“基本”身份验证的实现由两个组件组成:
didReceiveResponse
,didReceiveData
,您希望使用基于委托的NSURLConnection
,而不是sendSynchronousRequest
(无论如何,这是一个可怕的解决方案;永远不要进行同步网络请求),connectiondFinishLoading
和didFailWithError
方法,您还需要编写一个didReceiveAuthenticationChallenge
方法,该方法提供您在上一步中设置的用户ID和密码sendSynchronousRequest
:
[NSURLConnection connectionWithRequest:request delegate:self];
然后实现以下委托方法:
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
if ([response isKindOfClass:[NSHTTPURLResponse class]]) {
int statusCode = [(NSHTTPURLResponse *)response statusCode];
if (statusCode != 200) {
NSLog(@"%s failed status code %d", __FUNCTION__, statusCode);
}
}
self.responseData = [NSMutableData data];
}
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
[self.responseData appendData:data];
}
- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
// do whatever you want upon success
NSLog(@"%s success; data = %@", __FUNCTION__, [[NSString alloc] initWithData:self.responseData encoding:NSUTF8StringEncoding]);
}
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
{
// do whatever you want upon failure
NSLog(@"%s: %@", __FUNCTION__, error);
}
-(void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge
{
if ([challenge.protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodHTTPBasic]) {
if ([challenge previousFailureCount] == 0) {
NSURLCredential *credential = [NSURLCredential credentialWithUser:kUsername
password:kPassword
persistence:NSURLCredentialPersistenceForSession];
[[challenge sender] useCredential:credential forAuthenticationChallenge:challenge];
}
else
{
[[challenge sender] cancelAuthenticationChallenge:challenge];
// inform the user that the user name and password
// in the preferences are incorrect
NSLog (@"failed authentication");
// ...error will be handled by connection didFailWithError
}
}
}
显然,这假设您已经定义了responseData
属性:
@property (nonatomic, strong) NSMutableData *responseData;
现在,我怀疑您对所有这些代码发送请求并验证该请求的概念感到愤怒。但是,执行正确的HTTP级别身份验证需要这样的解决方案。像
sendSynchronousRequest
(无论如何,您应该避免)和sendSynchronousRequest
(更好,但仍然不能处理像这样的身份验证挑战)这样的方便方法不能胜任这项任务。如果你不想写所有的代码,那么你可以考虑使用这样的一个库来完成所有这些代码(加上更多的代码),让你摆脱这种网络请求的杂草。嗯,有点不太可能。我之所以实现这一点,是因为我最初尝试进行SFTP上传(这件事的全部目的是上传一个文件),但我找不到如何实现这样一个库。你有什么有用的资源吗?教程将非常有用。@benjsigmon从你在问题中引用的另一个答案可以推断,人们通常使用HTTP上传文件(坦白地说,我假设在你引用这个答案时,你说你将使用HTTPS而不是SFTP)。这比SFTP更常见(更简单,IMHO)。如果您必须使用SFTP,那么这个答案可能会有所帮助:。或者谷歌“iOS sftp库”。事实上,我不知道。在我所有的应用程序开发中,我从未处理过足够敏感的数据,除了电子邮件以外,我还需要其他任何东西。无论如何,谢谢你的帮助。我在应用程序中需要的这个小功能占用了我大部分的时间。帕累托原理等等。