2012-08-04 70 views
1

2012年8月1日Bing將他們的搜索API修改爲Azure,如何在Objective-C中使用Azure中的新bing搜索api進行身份驗證?Objective-C中Bing搜索的Windows Azure身份驗證

我最好的猜測是從遷移Word文檔中提供的PHP示例中學習! http://go.microsoft.com/fwlink/?LinkID=248077(哦,上帝,你不能設置一個網頁!)或此Java問題 - Bing Search API Azure Marketplace Authentication in Java

+0

這裏是標準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」]; ' – Anno2001 2012-08-17 09:30:28

回答

3

我正在使用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:你的密鑰也應該與基本認證。

+0

謝謝,我沒有意識到 - setAuthenticationScheme在ASIHTTPRequest中,它對我來說非常完美(移除了urlString部分),你可能會遇到問題轉義字符串,這種情況下,你可以使用以下類別(例如我用它來處理希伯來文),看下評論: – 2012-08-04 16:33:46

+0

@implementation的NSString(utils的) - (的NSString *)encodeForURL { 的NSString * encodedString =( __bridge NSString *)CFURLCreateStringByAddi ngPercentEscapes( kCFAllocatorDefault,(__bridge CFStringRef)self,NULL,CFSTR(「:/?#[] @!$&'()* +,; = \」<>%{} | \\ ^〜'「), CFStringConvertNSStringEncodingToEncoding(NSUTF8StringEncoding)); return encodedString? encodedString:@「」; } @end – 2012-08-04 16:34:09

+0

來自AZURE文檔:您無需提供用戶名。 – 2012-08-04 16:36:02

0

我能夠使用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,然後處理數據文檔以$格式指定=(我用json,所以我的樣子):

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

我遺漏了錯誤處理,不要忘了添加,通過檢查響應以及錯誤。