标题几乎说明了一切。我的应用程序包含文件myFile.ext的URL和密码,位于:
https://myserver.com/stuff.cgi?db=mydb
我想创建一个NSURL对象,如果传递给UIApplication的canOpenURL和openURL方法,将导致适当的行为。
这可能吗?如果是这样的话?我应该注意安全问题吗?
编辑澄清:
以下代码生成一个URL请求,该请求在发送到服务器时成功导致应用程序下载该文件。但我想做的是用openURL打开它。
+ (NSMutableURLRequest *) requestForFileNamed: (NSString *) filename {
NSString *url = [NSString stringWithFormat:@"%@&user=%@&getbinfile=%@", serverLocation, username, filename];
NSString *body = [NSString stringWithFormat:@"password=%@", password];
return [XMLRequestBuilder postRequestWithURL:url body:body];
}
XMLRequestBuilder方法:
+ (NSMutableURLRequest *) requestWithURL: (NSString *) url body: (NSString *) body method: (NSString *) method {
NSURL * theURL = [NSURL URLWithString:url];
NSMutableURLRequest * ret = [NSMutableURLRequest requestWithURL:theURL];
[ret setHTTPBody:[body dataUsingEncoding:NSUTF8StringEncoding]];
[ret setHTTPMethod: method];
[ret setTimeoutInterval:kDefaultTimeoutInterval];
return ret;
}
+ (NSMutableURLRequest *) postRequestWithURL: (NSString *) url body: (NSString *) body {
return [XMLRequestBuilder requestWithURL:url body:body method:@"POST"];
}
答案 0 :(得分:1)
假设(正如@bodnarbm指出的那样)你想要HTTP身份验证,那么它是相当直接的。只需实现didReceiveAuthenticationChallenge。以下是Apple的文档样本:
只需将[self preferencesName]和[self preferencesPassword]更改为您的用户名/密码。
-(void)connection:(NSURLConnection *)connection
didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge
{
if ([challenge previousFailureCount] == 0) {
NSURLCredential *newCredential;
newCredential=[NSURLCredential credentialWithUser:[self preferencesName]
password:[self preferencesPassword]
persistence:NSURLCredentialPersistenceNone];
[[challenge sender] useCredential:newCredential
forAuthenticationChallenge:challenge];
} else {
[[challenge sender] cancelAuthenticationChallenge:challenge];
// inform the user that the user name and password
// in the preferences are incorrect
[self showPreferencesCredentialsAreIncorrectPanel:self];
}
}
更新: 从上面的评论来看,它看起来并不像您使用的是HTTP身份验证(因此我的上述代码不适用于您,但我会将其留给可能帮助其他人)。
回到您的问题:您是否在请求中将HTTP方法标头值设置为“POST”?你为什么试图在体内发送pwd(如POST应该)但其他参数在URL中(作为GET)?将其他参数移动到POST请求的主体。如果您发布代码,可能更容易看到您出错的地方。