FatSecret Platform API

  在现阶段饮食类的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.cnblogs.com/jerehedu/ 
本文版权归烟台杰瑞教育科技有限公司和优快云共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
 
<think>好的,用户的问题是关于如何通过条形码查询商品的配料表,需要找到相关的数据库或API工具。首先,我需要回顾已有的引用内容,看看是否有相关的信息。 查看已有的引用,引用[1]提到商品详情API接口,可以获取商品详细信息,包括商品ID、名称等,但未明确说明是否包含配料表。引用[4]提到FatSecret Platform API,主要用于食品营养数据,可能包含配料信息。其他引用如原材料质量管理、图像识别和微生物组分析似乎不太相关。 接下来,我需要考虑用户的实际需求。用户可能希望有一个能够通过条形码快速获取商品配料表的工具,这可能用于健康管理、过敏原避免或产品分析等场景。需要确认现有API是否支持配料表查询,或者是否有其他常用服务。 首先,FatSecret API确实提供食品的详细信息,可能包括配料。此外,Open Food Facts是一个开源项目,专门通过条形码提供食品数据,包括配料表,并且有API接口。这应该是推荐的首选,因为它是免费的且数据由用户贡献,覆盖面广。 另外,引用[1]提到的商品详情API可能需要具体确认供应商是否提供配料信息,但通常这类API可能更侧重于基础信息如价格、库存等。此外,用户可能需要注册或申请API密钥,需要注意使用限制和合规性。 可能还需要考虑其他商业API,如Barcodelookup.com,虽然主要提供产品信息,但部分数据可能包含配料。需要检查其文档或示例响应是否包含相关字段。 总结下来,应推荐Open Food Facts作为主要解决方案,因为它直接关联到用户需求,并且免费。其次是FatSecret API,虽然主要关注营养,但可能有部分配料信息。最后,Barcodelookup.com作为备选,但需注意数据可能有限。 此外,用户可能需要指导如何集成这些API,比如查看文档、处理认证和解析响应。需要提醒用户注意API的使用条款,确保合规,并处理可能的错误或数据不全的情况。</think>### 条形码查询商品配料表的数据库/API工具 以下是可用于通过条形码查询商品配料表的数据库或API工具推荐: --- #### 1. **Open Food Facts** - **简介**: 这是一个开源的全球食品数据库,用户可通过商品条形码(如EAN、UPC)查询详细的食品信息,包括配料表、营养成分、添加剂等。 - **API接口**: 提供RESTful API,支持通过条形码直接获取JSON格式数据。例如: ```bash https://world.openfoodfacts.org/api/v0/product/{barcode}.json ``` - **特点**: - 数据由全球用户贡献,覆盖范围广。 - 完全免费且支持多语言。 - **适用场景**: 健康管理、食品过敏原检测、产品对比分析。 - **文档**: [Open Food Facts API文档](https://wiki.openfoodfacts.org/API) [^4]。 --- #### 2. **FatSecret Platform API** - **简介**: 提供全球食品营养数据,包括包装食品和餐厅食品的详细信息,部分数据可能包含配料表。 - **功能**: - 支持通过条形码或关键词搜索食品。 - 返回数据包含营养成分、原料列表(视数据源而定)。 - **适用场景**: 营养计算、健身类应用、食品分析。 - **限制**: 部分功能需付费,配料表完整性依赖数据源。 - **文档**: [FatSecret API文档](https://platform.fatsecret.com/api/)。 --- #### 3. **Barcodelookup.com API** - **简介**: 商业化的条形码数据库,提供商品基本信息,部分条目包含配料表。 - **功能**: - 通过条形码查询商品名称、品牌、类别等。 - 部分商品有详细的成分信息(需确认具体数据)。 - **特点**: 提供免费基础版和付费高级版(更高请求次数)。 - **文档**: [Barcodelookup API文档](https://www.barcodelookup.com/api)。 --- ### 使用建议 1. **优先选择Open Food Facts**: 免费、开源且数据透明,适合需要完整配料表的场景。 2. **验证数据完整性**: 部分商品可能缺少配料信息,需结合多源数据或用户反馈补充。 3. **处理API限制**: 注意请求频率限制(如Barcodelookup免费版限制50次/天),合理设计缓存机制。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值