【问题标题】:Passing parameters in objective C在目标 C 中传递参数
【发布时间】:2023-03-28 07:55:01
【问题描述】:

我有一个 sharedClient 请求一个 URL

#define BASE_URL @"http://myurl.com"

+ (id)sharedClient {
static MyClient *__instance;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
    NSURL *baseUrl = [NSURL URLWithString:BASE_URL];
    __instance = [[MyClient alloc] initWithBaseURL:baseUrl];
});
    return __instance;
}

然后我在按下按钮时在视图控制器中调用它

id params = @{
              @"username": self.usernameField.text,
              @"password": self.passwordField.text
              };

[[MyClient sharedClient]getPath:@"/users/current.json"
                           parameters:params
                              success:^(AFHTTPRequestOperation *operation, id responseObject) {
                                  NSString *authToken = [responseObject objectForKey:@"api_key"];
                                  [self.credentialStore setAuthToken:authToken];

                                  [SVProgressHUD dismiss];

                                  [self dismissViewControllerAnimated:YES completion:nil];
                              } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
                                  NSLog(@"%ld", (long)operation.response.statusCode);
                                  if (operation.response.statusCode == 500) {
                                      [SVProgressHUD showErrorWithStatus:@"Something went wrong!"];
                                  } else {
                                      NSData *jsonData = [operation.responseString dataUsingEncoding:NSUTF8StringEncoding];
                                      NSDictionary *json = [NSJSONSerialization JSONObjectWithData:jsonData
                                                                                           options:0
                                                                                             error:nil];
                                      NSString *errorMessage = [json objectForKey:@"error"];
                                      [SVProgressHUD showErrorWithStatus:errorMessage];
                                  }
                              }];

此代码可以正常工作,但我的问题是我尝试访问的 API 有点奇怪。您必须在 url 之前传递用户名和密码。像这样

http://username:password@myurl.com

我将如何在 URL 的 http 之前传递参数?

【问题讨论】:

  • 据我所知,这是一种通过 URL 传输用户名和密码的标准(但不安全)机制。 [NSURL URLWithString:@"http://username:password@myurl.com"] 应该可以正常工作。
  • 如何使用户名和密码动态化?换句话说,我会传递用户名和密码吗?
  • 如果你的目标是 iOS 7 及更高版本,NSURLComponents 是最好的选择。
  • @FilipRadelic 我的目标是 iOS7 及更高版本,你有这方面的例子吗?

标签: ios objective-c afnetworking


【解决方案1】:
NSURLComponents *urlComponents = [NSURLComponents componentsWithString:BASE_URL];
urlComponents.user = @"user";
urlComponents.password = @"pass";
NSURL *url = urlComponents.URL;

然后只需使用url 来初始化您的客户端。

【讨论】:

    【解决方案2】:

    “奇数”形式是完全有效的,并且只要我能想到就一直使用 HTTP,但是与 HTTP 一起使用时它是不安全的(但与 HTTPS 一起使用时是安全的,其中请求是通过加密连接发送的)。

    对每个请求简单地构造这样的 URL:

    static NSString * const kBaseScheme = @"http"
    static NSString * const kBaseHostAndPath = @"myurl.com/mypath"
    
    ...
    
    NSString *urlString;
    if ([username length] > 0 && [password length] > 0) {
        urlString = [NSString stringWithFormat:@"%@://%@:%@@%@", kBaseScheme, username, password, kBaseHostAndPath];
    } else {
        urlString = [NSString stringWithFormat:@"%@://%@", kBaseScheme, kBaseHostAndPath];
    }
    NSURL *url = [NSURL URLWithString:urlString];
    

    如果您愿意,您还可以“解构”现有的 NSURL,然后“重构”URL(您可以使用存储了 [[MyClient alloc] initWithBaseURL:baseUrl]; 调用的 URL 的实例变量来执行此操作;但是你也可以做一个像initWithScheme:kBaseScheme hostAndPath:kBaseHostAndPath]这样的初始化器并将它们保存在两个实例变量中)。

    NSString *urlString = [NSString stringWithFormat:@"%@://%@:%@@%@%@", [baseURL scheme], username, password, [baseURL host], [baseURL path]];
    

    另见NSURL documentation 了解各个领域。

    【讨论】:

    • 你更快 :-) - 可能应该使用 stringByAddingPercentEscapesUsingEncoding 转义用户名和密码。
    • 感谢您的回答,只是一个简单的问题:如何将用户名和密码传递给单例类?
    • 单例对象与对象没有什么不同。使用 ivars。
    • @joshuahornby10:正如 vikingosegundo 所说,只需使用实例变量。请参阅我的更新答案。您可以使用现有 baseUrl 的字段,也可以将其拆分为两个字段。
    • 哦,@MartinR 是绝对正确的:您需要转义用户名和密码!想象一下有人拥有密码a@foo.com/,如果您没有转义它,它将重定向您的请求。
    猜你喜欢
    • 2011-02-22
    • 2010-11-03
    • 1970-01-01
    • 1970-01-01
    • 2015-10-02
    • 1970-01-01
    • 1970-01-01
    • 2021-09-29
    • 1970-01-01
    相关资源
    最近更新 更多