亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

FatSecretPlatformAPI

2019-11-14 18:34:15
字體:
來源:轉載
供稿:網友

  在現階段飲食類的APP發展的非常迅猛,尤其在校園中,學生只需要憑借一個手機就能買到自己想要的食物,真正做到了足不出戶??墒侨绻覀兿氇毩⑼瓿梢粋€app就需要有相應的數據支持,這里給大家介紹一個國外的開發API, FatSecret Platform API,這里面包含了許多的食物信息。我們根據這些信息,就能夠請求我們的數據,進行獨立的app開發。

1、api地址

  http://platform.fatsecret.com/api/Default.aspx?screen=rapih

2、Authentication 認證

這里要注意,Authentication是難點也是重點,下面我們一起研究研究怎么進行認證。

Note that you must be signed up as a developer, and agree to our Terms of Service in order to obtain you Consumer Key andShared Secret, which you'll need to send requests to the REST API. 

  Api中提到,如果我們需要使用api必須首先注冊為開發者,并且獲取到Consumer Key andShared Secret,這兩個東西。好既然這樣我們就開始獲取,按照網站注冊后如會獲取如下數據

有了這個東西我們就可以進行下一步了。繼續瀏覽API的Authentication

看到這我們會發現想要請求api必須還得獲取一個signature ,而且上面給我們提供了步驟。好那我們就接著往下看

Step 1. Creating a Signature Base String

意思就是說,我們需要將字段和方法按照順序拼接出下面的形式,其中的轉碼我們用的是RFC3986

POST & http%3A%2F%2Fplatform.fatsecret.com%2Frest%2Fserver.api &a%3Dbar%26%26oauth_consumer_key%3Ddemo%26oauth_nonce%3Dabc%26oauth_signature_method%3DHMAC-SHA1%26oauth_timestamp%3D12345678%26oauth_version%3D1.0%26z%3Dbar

 

  Step 2. Calculating the Signature value (oauth_signature)

意思是說需要進一步RFC2104和RFC2045和RFC3986進行轉碼

 

Step 3. Sending the Request

Send all the parameters used to generate the Signature Base String via the HTTP method specified in the Signature Base String, with the inclusion of the oauth_signature.

That's it! We will hopefully be able to generate the same oauth_signature from our end and confirm that it is indeed you

  好,看到這里大家肯定有些模糊,沒關系,我們有代碼幫助大家理解,上面的api步驟,我通過代碼翻譯如下

/** *  <#Description#> * *  @param url                  請求的地址 *  @param method               請求的方法 *  @param body                 body數據 *  @param _oAuthConsumerKey    申請的key *  @param _oAuthConsumerSecret  申請的Secret *  @param _oAuthToken          暫時用不到 *  @param _oAuthTokenSecret    暫時用不到 * *  @return <#return value description#> */NSString *OAuthorizationHeader(NSURL *url, NSString *method, NSData *body, NSString *_oAuthConsumerKey, NSString *_oAuthConsumerSecret, NSString *_oAuthToken, NSString *_oAuthTokenSecret){    NSString *_oAuthNonce = [NSString ab_GUID];    NSString *_oAuthTimestamp = [NSString stringWithFormat:@"%d", (int)[[NSDate date] timeIntervalSince1970]];    NSString *_oAuthSignatureMethod = @"HMAC-SHA1";    NSString *_oAuthVersion = @"1.0";        NSMutableDictionary *oAuthAuthorizationParameters = [NSMutableDictionary dictionary];    [oAuthAuthorizationParameters setObject:_oAuthNonce forKey:@"oauth_nonce"];    [oAuthAuthorizationParameters setObject:_oAuthTimestamp forKey:@"oauth_timestamp"];    [oAuthAuthorizationParameters setObject:_oAuthSignatureMethod forKey:@"oauth_signature_method"];    [oAuthAuthorizationParameters setObject:_oAuthVersion forKey:@"oauth_version"];    [oAuthAuthorizationParameters setObject:_oAuthConsumerKey forKey:@"oauth_consumer_key"];    if(_oAuthToken)        [oAuthAuthorizationParameters setObject:_oAuthToken forKey:@"oauth_token"];        // get query and body parameters    NSDictionary *additionalQueryParameters = [NSURL ab_parseURLQueryString:[url query]];    NSDictionary *additionalBodyParameters = nil;    if(body) {        NSString *string = [[NSString alloc] initWithData:body encoding:NSUTF8StringEncoding];        if(string) {            additionalBodyParameters = [NSURL ab_parseURLQueryString:string];        }    }        // combine all parameters    NSMutableDictionary *parameters = [oAuthAuthorizationParameters mutableCopy];    if(additionalQueryParameters) [parameters addEntriesFromDictionary:additionalQueryParameters];    if(additionalBodyParameters) [parameters addEntriesFromDictionary:additionalBodyParameters];        // -> UTF-8 -> RFC3986    NSMutableDictionary *encodedParameters = [NSMutableDictionary dictionary];    for(NSString *key in parameters) {        NSString *value = [parameters objectForKey:key];        [encodedParameters setObject:[value ab_RFC3986EncodedString] forKey:[key ab_RFC3986EncodedString]];    }        NSArray *sortedKeys = [[encodedParameters allKeys] sortedArrayUsingFunction:SortParameter context:(__bridge void *)(encodedParameters)];        NSMutableArray *parameterArray = [NSMutableArray array];    for(NSString *key in sortedKeys) {        [parameterArray addObject:[NSString stringWithFormat:@"%@=%@", key, [encodedParameters objectForKey:key]]];    }    NSString *normalizedParameterString = [parameterArray componentsJoinedByString:@"&"];        NSString *normalizedURLString;    if ([url port] == nil) {        normalizedURLString = [NSString stringWithFormat:@"%@://%@%@", [url scheme], [url host], [url path]];    } else {        normalizedURLString = [NSString stringWithFormat:@"%@://%@:%@%@", [url scheme], [url host], [url port], [url path]];    }        NSString *signatureBaseString = [NSString stringWithFormat:@"%@&%@&%@",                                     [method ab_RFC3986EncodedString],                                     [normalizedURLString ab_RFC3986EncodedString],                                     [normalizedParameterString ab_RFC3986EncodedString]];        NSString *key = [NSString stringWithFormat:@"%@&%@",                     [_oAuthConsumerSecret ab_RFC3986EncodedString],                     [_oAuthTokenSecret ab_RFC3986EncodedString]];        NSData *signature = HMAC_SHA1(signatureBaseString, key);    NSString *base64Signature = [signature base64EncodedString];        // PARKER CHANGE: changed oAuthAuthorizationParameters to parameters    NSMutableDictionary *authorizationHeaderDictionary = [parameters mutableCopy];    [authorizationHeaderDictionary setObject:base64Signature forKey:@"oauth_signature"];        NSMutableArray *authorizationHeaderItems = [NSMutableArray array];    for(NSString *key in authorizationHeaderDictionary) {        NSString *value = [authorizationHeaderDictionary objectForKey:key];        // PARKER CHANGE: removed quotes that surrounded each value        [authorizationHeaderItems addObject:[NSString stringWithFormat:@"%@=%@",                                             [key ab_RFC3986EncodedString],                                             [value ab_RFC3986EncodedString]]];    }        // PARKER CHANGE: changed concatentation string from ", " to "&"    NSString *authorizationHeaderString = [authorizationHeaderItems componentsJoinedByString:@"&"];//  authorizationHeaderString = [NSString stringWithFormat:@"OAuth %@", authorizationHeaderString];        return authorizationHeaderString;}

使用方法如下:

#PRagma mark - 請求方法-(void) connentSign{    //設置食物ID    NSDictionary *params = @{@"food_id" : @"33690"};    //設置請求參數和方法名    [self makeRequestWithMethod:@"food.get" parameters:params completion:^(NSDictionary *data) {            }];    }//開始發送請求- (void) makeRequestWithMethod:(NSString *)method                    parameters:(NSDictionary *)params                    completion:(void (^)(NSDictionary *data))completionBlock {        NSMutableDictionary *parameters = [params mutableCopy];    [parameters addEntriesFromDictionary:[self defaultParameters]];    [parameters addEntriesFromDictionary:@{ @"method" : method }];        NSString *queryString = [self queryStringFromDictionary:parameters];    NSData *data          = [NSData dataWithBytes:[queryString UTF8String] length:queryString.length];    NSString *authHeader  = OAuthorizationHeader([NSURL URLWithString:FAT_SECRET_API_ENDPOINT],                                                 @"GET",                                                 data,                                                 @"9921d3f511a542a8b32b8841bb1d62ed",                                                 @"f8fa1d96494046c69159099ab153ea1e",                                                 nil,                                                 @"");         [self.manager GET:[FAT_SECRET_API_ENDPOINT stringByAppendingFormat:@"?%@", authHeader] parameters:nil success:^(AFHTTPRequestOperation *operation, id responSEObject) {                NSLog(@"%@",responseObject);            } failure:^(AFHTTPRequestOperation *operation, NSError *error) {            }];    }- (NSDictionary *) defaultParameters {    return @{ @"format": @"json" };}- (NSString *) queryStringFromDictionary:(NSDictionary *)dict {    NSMutableArray *entries = [@[] mutableCopy];        for (NSString *key in dict) {        NSString *value = [dict objectForKey:key];        [entries addObject:[NSString stringWithFormat:@"%@=%@", key, value]];    }        return [entries componentsJoinedByString:@"&"];}

然后我們就可以Happy programming!

 

  想要了解更多內容的小伙伴,可以點擊查看源碼,親自運行測試。

  疑問咨詢或技術交流,請加入官方QQ群:JRedu技術交流 (452379712)

 

作者:杰瑞教育
出處:http://www.49028c.com/jerehedu/ 
本文版權歸煙臺杰瑞教育科技有限公司和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。
 

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品第8页| 日韩在线欧美在线国产在线| 亚洲女同精品视频| 欧美精品videofree1080p| 亚洲精品久久久久中文字幕二区| 国产一区二区在线免费视频| 欧美一区深夜视频| 中文字幕av一区| 福利视频导航一区| 疯狂做受xxxx高潮欧美日本| 国产精品观看在线亚洲人成网| 国产综合香蕉五月婷在线| 亚洲精品欧美日韩专区| 91在线中文字幕| 欧美日韩一区二区免费在线观看| 久久久久久成人精品| 欧美国产在线视频| 国a精品视频大全| 亚洲精品一区久久久久久| 97超碰蝌蚪网人人做人人爽| 日韩美女在线播放| 日韩av在线影院| 亚洲最大av网| 欧美黑人一级爽快片淫片高清| 色婷婷综合成人av| 国产精品精品一区二区三区午夜版| 91精品久久久久久久久不口人| 国产精品久久久久久久天堂| 亚洲jizzjizz日本少妇| 日本亚洲欧美三级| 欧美日韩在线观看视频小说| 久久中文字幕视频| 国产精品91一区| 精品亚洲男同gayvideo网站| 午夜精品一区二区三区在线播放| 亚洲性无码av在线| 欧美成人免费观看| 国产一区二区美女视频| www.欧美三级电影.com| 欧洲成人免费aa| 亚洲aⅴ男人的天堂在线观看| 亚洲午夜精品久久久久久性色| 亚洲xxx自由成熟| 国产精品丝袜久久久久久不卡| 黄色精品一区二区| 亚洲国产日韩欧美在线99| 亚洲欧美日韩高清| 自拍偷拍亚洲区| 久久精品色欧美aⅴ一区二区| 久久精品夜夜夜夜夜久久| 亚洲图中文字幕| 国产精品69久久| 成人黄色在线免费| 亚洲成年人在线播放| 国产精品大陆在线观看| 日韩中文字幕国产| 欧美激情日韩图片| 成人在线视频福利| 久久夜色撩人精品| 国产精品三级久久久久久电影| 国产精品丝袜久久久久久高清| 亚洲日本成人女熟在线观看| 亚洲国产精品视频在线观看| 色妞欧美日韩在线| 日日噜噜噜夜夜爽亚洲精品| 91精品久久久久久久| 精品福利免费观看| 91精品国产综合久久香蕉的用户体验| 97精品久久久| 久久久综合免费视频| 国产香蕉97碰碰久久人人| 国产在线拍揄自揄视频不卡99| 国产网站欧美日韩免费精品在线观看| 国内偷自视频区视频综合| 欧美激情小视频| 国产第一区电影| 欧美韩国理论所午夜片917电影| 欧美精品在线观看91| 奇米4444一区二区三区| 欧美成人性色生活仑片| 欧美在线观看日本一区| 亚洲淫片在线视频| 精品视频在线观看日韩| 亚洲激情视频网站| 亚洲性69xxxbbb| 国产一区二区三区在线视频| 久久久精品视频在线观看| 国产精品com| 亚洲欧美中文在线视频| 黄色精品一区二区| 一区二区三区四区在线观看视频| 欧美激情免费在线| 亚洲九九九在线观看| 亚洲久久久久久久久久久| 久久香蕉国产线看观看网| 欧美xxxx做受欧美.88| 91精品国产综合久久久久久蜜臀| 亚洲国产精品久久久| 国内免费久久久久久久久久久| 大胆欧美人体视频| 欧美一区三区三区高中清蜜桃| 一区二区三区高清国产| 日韩在线www| 77777亚洲午夜久久多人| 国产精品看片资源| 91大神在线播放精品| 日韩电影中文字幕在线| 日韩国产欧美精品一区二区三区| 欧美伊久线香蕉线新在线| 国产+人+亚洲| 77777少妇光屁股久久一区| 美乳少妇欧美精品| 亚洲专区中文字幕| 国产成人精品免高潮在线观看| 成人黄色免费在线观看| 亚洲欧美一区二区三区四区| 2018国产精品视频| 亚洲第一二三四五区| 奇米成人av国产一区二区三区| 欧美激情一级精品国产| 国产精品毛片a∨一区二区三区|国| 成人午夜激情免费视频| 欧美日韩美女视频| 亚洲综合视频1区| 久久夜色精品国产亚洲aⅴ| 精品久久久久久久久国产字幕| 国产欧美日韩丝袜精品一区| 97热精品视频官网| 久久久999国产精品| 国产成人精品在线观看| 亚洲成人av中文字幕| 久久精品中文字幕免费mv| 影音先锋欧美在线资源| 中文日韩在线视频| 91精品在线播放| 国产欧美日韩中文字幕在线| 久久精品国产电影| 久久最新资源网| 国产精品美乳在线观看| 亚洲xxxx在线| 亚洲精品乱码久久久久久按摩观| 欧美成aaa人片免费看| 日韩电影免费观看在线观看| 成人免费网站在线观看| 国产欧美日韩精品专区| 日韩欧美高清视频| 7777精品久久久久久| 性色av一区二区三区红粉影视| 亚洲国产另类久久精品| 欧美—级a级欧美特级ar全黄| 国产精品久久久久久久久影视| 亚洲欧美国产另类| 91精品国产91久久久久福利| 日本人成精品视频在线| 91久久久久久久一区二区| 伊人亚洲福利一区二区三区| 91免费的视频在线播放| 精品国产一区二区在线| 国产欧美日韩精品丝袜高跟鞋| 欧美交受高潮1| 日韩经典中文字幕| 日韩在线观看精品| 97精品视频在线| 久久中国妇女中文字幕|