[Flutter]请求阿里百川的API

简单封装了一下,请求阿里百川的api。只是做了一个简单的get请求封装,要更加优雅可以自己再封装一下。

可以简单的学习一下Flutter的网络请求用法。

文件tb_api.dart代码如下:

import 'dart:convert';
import 'package:convert/convert.dart';
import 'package:crypto/crypto.dart';
import 'dart:async';
import 'package:http/http.dart' as http;

// 阿里百川
const AlibcAppKey = "";
const AlibcAppSecret = "";
const AlibcApiUrl = "http://gw.api.taobao.com/router/rest?";

const BCGoodsListURL = "taobao.tae.items.list";
const BCGoodsDetailURL = "taobao.item.detail.get";

// md5 加密
String generateMd5(String data) {
  var content = new Utf8Encoder().convert(data);
  var digest = md5.convert(content);
  return hex.encode(digest.bytes);
}

// 公共请求参数
Map<String, String> commonParams(String method) {
  const app_key = AlibcAppKey;
  DateTime date = new DateTime.now();

  // yyyy-MM-dd HH:mm:ss
  String timestamp =
      "${date.year.toString()}-${date.month.toString().padLeft(2,'0')}-${date.day.toString().padLeft(2,'0')} ${date.hour.toString().padLeft(2, '0')}:${date.minute.toString().padLeft(2, '0')}:${date.second.toString().padLeft(2, '0')}";
  const format = "json";
  const v = "2.0";
  const sign_method = "md5";
  const simplify = "true";

  var params = {
    "app_key": app_key,
    "format": format,
    "method": method,
    "sign_method": sign_method,
    "timestamp": timestamp,
    "v": v
  };

  return params;
}

// 这是商品列表接口的参数
Map<String, String> goodsListParams() {
  return {
    "num_iids": '534014773552',
    "fields": "cid,title,nick,price,num,pic_url"
  };
}

// 最终的请求参数 通过公共参数和接口参数确定签名
Map<String, String> requestParameters(String method, Map<String, String> customParams) {
  var params = commonParams(method);
  var custom = customParams;

  // print("接口参数: \(custom)")
  custom.forEach((k, v) {
    params[k] = v;
  });

  // print("最终参数: \(params)")

  List<String> keys = params.keys.toList();
  keys.sort();

  // print("排序后的参数:\(keys)")
  String total = '';
  keys.forEach((key) {
    total += '${key}${params[key]}';
  });

  String sign =
      generateMd5(AlibcAppSecret + total + AlibcAppSecret).toUpperCase();
  params['sign'] = sign;

  return params;
}

// 读取商品列表
getGoodsList() {
  get(requestParameters(BCGoodsListURL, goodsListParams()));
}

// 读取商品详情
getGoodDetail(String itemId) {
  var params = { "item_id" : itemId, "fields" : "item" };
  get(requestParameters(BCGoodsDetailURL, params));
}

Future<Map> get(Map params) async {
  final uri = new Uri.http('gw.api.taobao.com', '/router/rest', params);
  // print('请求的url: ${uri}');
  final headers = {
    "Content-Type": "application/json",
  };

  final response = await http.get(uri, headers: headers);
  var data = json.decode(response.body);
  print('阿里返回的数据:${data}');

  return data;
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏DOTNET

asp.net web api 异常捕获

1 向客户端发送错误消息 使用throw new HttpResponseException()向客户端抛出错误信息。 HttpResponseExceptio...

52112
来自专栏北京马哥教育

搞定Linux Shell文本处理工具,看完这篇集锦就够了

Linux Shell是一种基本功,由于怪异的语法加之较差的可读性,通常被Python等脚本代替。既然是基本功,那就需要掌握,毕竟学习Shell脚本的过程中,还...

3423
来自专栏静晴轩

Url参数中出现+、空格、=、%、&、#等字符的解决办法

Url出现了有+,空格,/,?,%,#,&,=等特殊符号的时候,可能在服务器端无法获得正确的参数值,抑或是造成不能正常下载文件(作为Download Url时候...

4057
来自专栏Ryan Miao

java线程(2)--同步和锁

参考转载:http://rainyear.iteye.com/blog/1734311 http://turandot.iteye.com/blog/17040...

3867
来自专栏ASP.NETCore

动手实现扩展属性为对象动态添加获取数据(续)

在上一篇文章中我们了解了扩展属性的原理和结构,其实其内部结构与思想都与WPF中的依赖属性基本相同,大家也可以从中了解到关于依赖属性的原理,这对了解及使用依赖属性...

1291
来自专栏技术博客

Asp.net MVC Jquery提交后乱码问题

最近在处理MVC时,遇到要将特殊字符,或者XML格式的数据传递到后台,但是后台解析发现无法识别,处理有误。

1822
来自专栏Golang语言社区

golang 高效字符串拼接

以下内容摘自许世伟《go语言程序设计》: 连接字符串使用" + "或者使用slice拼接,"这2个转换都不是无代价的" 虽然方便,但是使用+=操作符并不是在一个...

3114
来自专栏机器学习从入门到成神

2015百度校招笔试真题以及解析(二)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sinat_35512245/articl...

2052
来自专栏散尽浮华

shell脚本之特殊符号总结性梳理

# 井号 (comments) 这几乎是个满场都有的符号 #!/bin/bash 井号也常出现在一行的开头,或者位于完整指令之后,这类情况表示符号后面的是注...

21010
来自专栏陈树义

BitMap 算法

什么是 BigMap 算法 所谓 BitMap 就是用一个 bit 位来标记某个元素对应的 value,而 key 即是这个元素。由于采用bit为单位来存储数据...

5026

扫码关注云+社区

领取腾讯云代金券