国外开发API,api地址、Authentication认证
在现阶段饮食类的APP发展的非常迅猛,尤其在校园中,学生只需要凭借一个手机就能买到自己想要的食物,真正做到了足不出户。可是如果我们想独立完成一个app就需要有相应的数据支持,这里给大家介绍一个国外的开发API, FatSecret Platform API,这里面包含了许多的食物信息。我们根据这些信息,就能够请求我们的数据,进行独立的app开发。
1、api地址
2、Authentication 认证
(资料图片仅供参考)
这里要注意,Authentication是难点也是重点,下面我们一起研究研究怎么进行认证。
Api中提到,如果我们需要使用api必须首先注册为开发者,并且获取到Consumer KeyandShared Secret,这两个东西。好既然这样我们就开始获取,按照网站注册后如会获取如下数据
有了这个东西我们就可以进行下一步了。继续浏览API的Authentication
看到这我们会发现想要请求api必须还得获取一个signature ,而且上面给我们提供了步骤。好那我们就接着往下看
Step 1. Creating a Signature Base String
意思就是说,我们需要将字段和方法按照顺序拼接出下面的形式,其中的转码我们用的是RFC3986
Step 2. Calculating the Signature value (oauth_signature)
意思是说需要进一步RFC2104和RFC2045和RFC3986进行转码
Step 3. Sending the Request
好,看到这里大家肯定有些模糊,没关系,我们有代码帮助大家理解,上面的api步骤,我通过代码翻译如下
/** * <#description#> * * @param url 请求的地址 * @param method 请求的方法 * @param body body数据 * @param _oAuthConsumerKey 申请的key * @param _oAuthConsumerSecret 申请的Secret * @param _oAuthToken 暂时用不到 * @param _oAuthTokenSecret 暂时用不到 * * @return <#return value=""> */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!
标签:
相关推荐:
最新新闻:
- 如何将图像数据编码为比特流?转换方法步骤
- PF的关键字顺序有多灵活?PF防火墙最详细教程
- 国外开发API,api地址、Authentication认证
- 华为t2010怎么刷机?华为t2010刷机教程及评测_全球今日报
- windows7桌面图标怎么改大小?修改方法步骤
- iphone4s怎么设置彩信?iphone4s联通卡彩信设置方法
- 什么软件修图较好?图片处理有哪些技巧?
- 国内常用的ntp服务器 国内常用NTP服务器地址及IP_环球新视野
- rocketdock怎么操作?rocketdock教程之程序设置-环球热消息
- 当前速读:QQ火炬手图标怎么关闭?关闭图标方法介绍
- 【世界速看料】戴森v7v8v10什么区别?V6和V8的区别介绍
- linux主机的详细介绍 linux主机安装的八个步骤_全球讯息
- 环球速读:富可视m310怎么刷机?富可视m310刷机教程
- 手机wifi密码破解器哪个好用?手机wifi密码破解器介绍
- 天天即时:淘宝拥有注册会员1.7亿 注册用户不断增长
- 手摇甘蔗榨汁机怎么样?品牌有哪些? 天天视讯
- androidstudio发现环境坏了 jdk出问题了?
- 天天信息:linux内核编译ccflag,linux-内核编译 centisecs文件控制内核参数
- 全球今头条!连连支付怎么样?连连靠谱吗?
- 每日关注!identity字段怎么使用?identity字段的基本用法及使用方法
- 惠普笔记本电脑 设备管理器中双击未知设备的解决方案|每日播报
- 【盗梦空间】潜行凶间(港)全面启动
- AngularJS中的refresher该如何使用?使用技巧|动态
- 联想s720i配置怎么样?联想s720i配置总结|热文
- 【证书】PFX证书、CER证书申请流程详解
- dockerexec-itoracle11g创建容器实例分享
- PocketTrail实现拖尾效果的脚本及说明|焦点短讯
- 当前报道:功放如何连接?功放机接线图详解
- 手机无限重启或无法开机怎么办?索爱st25i强刷教程及注意事项 快报
- 头条:绿色出行新方式:共享汽车APP的交互体验
- 环球观焦点:B站视频播放源地址获取及B站视频下载
- 复旦壁纸:手绘正校门1024、7681280
- 佳能IP1180怎么样?佳能IP1180详情介绍
- 天天热门:象棋里的卧槽马是什么?典型案例分享
- 无法访问文件夹怎么办?无法访问文件夹的原因和解决方法-焦点速看
- 设计带构造函数的Dog类 对数据成员进行初始化
- 焦点报道:薛定谔的猫和EPR佯谬——量子力学史上的经典术语
- 网银无法登陆怎么办?网上银行登录安全控件
- 联想昭阳E46G能玩魔兽世界吗?显卡集显特效开起来根本没办法玩
- 最新:在百度里下载格式工厂——KuGo格式
- speedtest-cli|网速测试工具命令行方式
- 【数据更新】全国上网卡专属号段数据汇总
- 全球新动态:Calendar类:日历字段的转换方法
- 数据字典中的同义词:user_synonyms
- 非定常约束:几何约束与完整约束的区别
- 图片文件合成器是什么?图片、文件合成器的原理与方法
- 天天微头条丨企业的经营性现金流与净利润的含金量有多大?
- 微头条丨java timestamp 格式化_java日期处理(Timestamp)
- 【世界时快讯】《满江红》让杭州岳王庙成热门打卡地:秦桧像曾被砸烂9次
- 分享5个高质无损音乐网站 歌曲很丰富
- 焦点报道:薛定谔的猫和EPR佯谬——量子力学史上的经典术语
- 微头条丨java timestamp 格式化_java日期处理(Timestamp)
- 【世界时快讯】《满江红》让杭州岳王庙成热门打卡地:秦桧像曾被砸烂9次
- 【世界快播报】《如龙:维新!极》“复仇之刃”预告 全新截图欣赏
- 音游《最终幻想:节奏剧场》试玩版2月1日上线
- 【环球速看料】《死亡空间:重制版》开发者讨论该系列未来发展
- 索尼承诺在PSVR2发行前“增加PS5主机供应”:全球要闻
- 财报预警!三大航空公司合计预亏超千亿,昔日养猪巨头亏损超百亿
- 郭明錤:可折叠iPad或明年问世,今年苹果可能不会发新品,出货至少下降10%
- 热点在线丨《死亡空间》重制版不支持Steam deck
- 三星新款翻转笔记本曝光:高配13代i9-13900H
- NBC季度亏损10亿!好于华尔街预期
- 无人驾驶出租?旧金山表示先缓缓_世界新资讯
- 联想拯救者新品将用上超频内存 支持DDR5-6000_环球快看点
- 突发!伦敦街头惊现《战神》利维坦之斧:外观霸气 地面开裂
- 全球观热点:青海春天药用资源科技股份有限公司 2022年度业绩预亏暨风险提示公告
- Xbox金会员2月会免游戏公布 《为了吾王》等
- 兔年首个交易日,两大股东公告“抢筹”兴业银行
- 【世界热闻】曝百度将推人工智能聊天工具:类似ChatGPT
- 环球微动态丨腾讯游戏春节7天吸金破4.5亿:《王者荣耀》收入超3千万!
- 国产《时灵:星辰愚者》2月14日发售 登陆PS5/PC/NS
- 暴雪游戏国服“头七” 你找到合适的平替游戏了吗?
- 《流浪地球2》MOSS和末日铁拳是一个配音演员:给破球来个上勾拳!:世界快消息
- 【环球速看料】PS5广告:奎爷利维坦巨斧现身英国伦敦
- 效仿印尼,全球第二大镍生产国菲律宾考虑对镍出口征税
- 摩根士丹利“大空头”警告:不要参与反弹行情,美股熊市还没结束
- 消费者遭遇特步反向抹零 特步回应:系统设置四舍五入
- 超4000万!Capcom称当前财年销量有望是史上最高一年:全球即时看
- 最新:我爱我家2022年业绩预告:聚焦品质服务 推进精细运营
- 我家的春节泡汤了,因为家里有人没阳
- 《卧龙:苍天陨落》中有“黑暗熊猫”登场:不会伤人的可爱萌物-世界最新
- 快看点丨消费修复成色几何?
- 世界今日讯!以技术革新引领绿色制造 三菱电机助力碳中和愿景
- 颜值绝了!荣耀Magic5 Lite渲染图曝光
- 可折叠iPad将于2024年发布,使用碳纤维铰链:环球快资讯