【问题标题】:Windows Azure Authentication for Bing Search in Objective-CObjective-C 中 Bing 搜索的 Windows Azure 身份验证
【发布时间】:2012-08-02 05:06:49
【问题描述】:

2012 年 8 月 1 日 Bing 将他们的搜索 api 修改为 Azure,如何在 Objective-C 中进行身份验证以使用 Azure 中的新 bing 搜索 api?

我最好的猜测是从迁移word文档中提供的PHP示例中学习!! http://go.microsoft.com/fwlink/?LinkID=248077(天哪,你不能设置一个网页吗!)或者这个 Java 问题 - Bing Search API Azure Marketplace Authentication in Java

【问题讨论】:

  • 这里是标准 HTTPRequest(不是 ASIHTTPRequest)的解决方案 ` String bing_access=[BING_APP_KEY_AZURE add:[@":""add:BING_APP_KEY_AZURE]]; bing_access=[self encodeBase64:bing_access]; [ request setValue:[@"Basic" add:bing_access] forHTTPHeaderField:@"Authorization"]; `

标签: objective-c api authentication encode bing


【解决方案1】:

我正在使用 ASIHTTPRequest 通过以下代码进行身份验证。

NSString *queryString = [NSString stringWithFormat:@"'%@'", queryString];
queryString = [queryString urlEncodeUsingEncoding:NSUTF8StringEncoding]; //You'll have to implement url encoding method, preferably in a string category file

NSString *urlString = [NSString stringWithFormat:@"https://api.datamarket.azure.com/Data.ashx/Bing/Search/v1/Image?Query=%@&Market='en-US'&$top=50&$format=json", queryString];

ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:[NSURL URLWithString:urlString] ];
[request setAuthenticationScheme:(NSString *)kCFHTTPAuthenticationSchemeBasic];
[request setUsername:@"YOUR_KEY_HERE"];
[request setPassword:@"YOUR_KEY_HERE"];
[request setDelegate:self];
[request startAsynchronous];

请注意,不需要 appID。只是将您的密钥作为用户名和密码传递。正在成功获取数据。

但是,不能真正将数据转换为 NSString。尝试了每种编码,但无法从数据中获取字符串。最初的谷歌搜索说它是 UTF-8 编码的。但没有成功。

要使上述代码正常工作,您必须添加 ASIHTTP 框架。

另一件事是,我的猜测是使用这种格式的 base64 编码字符串 your_key:yourkey 也应该适用于基本身份验证。

【讨论】:

  • 谢谢,我不知道 - ASIHTTPRequest 中的 setAuthenticationScheme。它对我来说非常适合(删除了 urlString 部分),您可能对未转义的字符串有问题,在这种情况下,您可以使用以下类别(例如我用它来处理希伯来语),请参阅下一条评论:
  • @implementation NSString (Utils) -(NSString*)encodeForURL { NSString *encodedString = (__bridge NSString *)CFURLCreateStringByAddingPercentEscapes( kCFAllocatorDefault, (__bridge CFStringRef)self, NULL, CFSTR(":/?#[ ]@!$ &'()*+,;=\"%{}|\\^~`"), CFStringConvertNSStringEncodingToEncoding(NSUTF8StringEncoding)); return encodedString ? encodedString : @""; } @end
  • 来自 AZURE 文档:您不需要提供用户名。
【解决方案2】:

我只使用 NSUrlConnection 就能让它工作。你必须先base64encode

NSString *keyString = [NSString stringWithFormat:@"%@:%@", BING_SEARCH_API_KEY, BING_SEARCH_API_KEY];
NSData *plainTextData = [keyString dataUsingEncoding:NSUTF8StringEncoding];
NSString *base64String = [plainTextData base64EncodedString];

设置您的请求

NSMutableURLRequest *req = [[NSMutableURLRequest alloc] init];
[req setURL:[NSURL URLWithString:searchUrl]];
NSString *authValue = [NSString stringWithFormat:@"Basic %@", base64String];
[req setValue:authValue forHTTPHeaderField:@"Authorization"];

提出请求

NSError *error = [[NSError alloc] init];
NSHTTPURLResponse *response = nil;
NSData *data = [NSURLConnection sendSynchronousRequest:req returningResponse:&response error:&error];

查看文档关于如何形成searchUrl,然后按照你在$format=中指定的格式处理数据(我用的是json,所以我的看起来像):

NSDictionary *json = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:&error];

我省略了错误处理,别忘了通过检查响应和错误来添加它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-23
    • 1970-01-01
    相关资源
    最近更新 更多