上回简单说了 Aliexpress API 的认证流程, 这回在奉送一个小工具, API 测试工具.
点我下载
做这一行,和做程序员的生活完全不搭调, 格格不入. 做个程序员,每天只需要做在那里动动手, 动动脑, 嗯,某些人可能还需要在动动嘴,拍拍马屁就行了.
但是做这一行, 找产品,上产品, 买货,发货, 回邮件,回客人, 一天能坐下来的时间并不多, 动手写程序的时间更是少的可怜. 我写程序的时候,都是在夜深人静的时候. 一是因为我的调皮女儿睡着了,二是耳边没有那个唐僧了.
先说一下界面, 这个工具借用了 JsonView 的一个控件, 从CodePlex 上下来的JsonView 用的是 Newtonsoft.Json 1.1.1.0 , 但是在 API 内,我用的是 4.5.0.0 的DLL去解析 API 返回的数据, 这样就造成了DLL版本不一致的问题. 要解决这个问题,需要在 APP.config 里加一段:
1 <configuration> 2 3 <runtime> 4 5 <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> 6 7 <dependentAssembly> 8 9 <assemblyIdentity name="Newtonsoft.Json"/> 10 11 <codeBase version="1.1.1.0" href="v1/Newtonsoft.Json_1.dll"/> 12 13 <codeBase version="4.5.0.0" href="Newtonsoft.Json.dll"/> 14 15 </dependentAssembly> 16 17 </assemblyBinding> 18 19 </runtime> 20 21 </configuration>
将 1.1.1.0 的 DLL 放到程序目录下面的 V1 文件夹下, 版本冲突就解决了.
大至的一个结构:
Methods 下的每个类对应 API 里的每个方法, 大致如下:
class="code_img_closed" src="/Upload/Images/2013083010/0015B68B3C38AA5B.gif" alt="" />logs_code_hide('c7686fa5-d4af-4c02-9fe6-14e8c85e3961',event)" src="/Upload/Images/2013083010/2B1B950FA3DF188F.gif" alt="" />1 public class OrderQueryList : MethodBase<OrderList> { 2 3 4 5 protected override string APIName { 6 7 get { return "api.findOrderListQuery"; } 8 9 } 10 11 12 13 private int pageSize = 50; 14 15 16 17 [ParamName("pageSize", Required = true)] 18 19 public int PageSize { 20 21 get { 22 23 return pageSize; 24 25 } 26 27 set { 28 29 this.pageSize = value < 1 ? 1 : (value > 50 ? 50 : value); 30 31 } 32 33 } 34 35 36 37 private int page = 1; 38 39 40 41 [ParamName("page", Required = true)] 42 43 public int Page { 44 45 get { 46 47 return this.page; 48 49 } 50 51 set { 52 53 this.page = value < 1 ? 1 : value; 54 55 } 56 57 } 58 59 60 61 [ParamName("createDateStart")] 62 63 [AliDateTimeParamFormatter("MM/dd/yyyy")] 64 65 public DateTime? CreateBegin { get; set; } 66 67 68 69 [ParamName("createDateEnd")] 70 71 [AliDateTimeParamFormatter("MM/dd/yyyy")] 72 73 public DateTime? CreateEnd { get; set; } 74 75 76 77 [ParamName("orderStatus")] 78 79 public OrderStatus? Status { get; set; } 80 81 } 82 83View Code
带 ParamName 特性的属性即API 说明列出的 API 方法所需要的参数, 在 MethodBase 里有个虚方法 Execute 及 GetResult.
绝大部分API方法不需要重写这两个方法, 但是有两个特例(到目前为止,我遇到的): 和上传图片有关的两个方法.
http://gw.api.alibaba.com/dev/doc/api.htm?ns=aliexpress.open&n=api.uploadTempImage&v=1
大家可以看看, Ali 的人真是省事, 就几句话了事. 光凭这几句话, 打死我也想不出要怎么个上传法. 我费劲巴啦的耗了几个小时按照网页上传图片的方法对 RequestHelper 类进行修改,然后建个测试网站做测试, 改完后发现牙的根本就不是这样上传的, 结果死都是500,未找到文件.
后来在阿里巴巴的论坛里找到了某同志的回贴, 原来和从网页上传图片完全不搭调.
1 [NeedAuth] 2 public override string GetResult(Auth auth) { 3 var url = auth.GetApiUrl(this.APIName).SetUrlKeyValue("srcFileName", this.FileName); 4 using(var client = new WebClient()) { 5 try { 6 var result = client.UploadData(url, this.UploadData); 7 return Encoding.UTF8.GetString(result); 8 } catch(WebException ex) { 9 return Encoding.UTF8.GetString(ex.Response.GetResponseStream().GetBytes()); 10 } 11 } 12 }View Code
原来是直接将文件的字节数组 Post 到特定格式的网址里, 真的是很晕,我熬夜到3点多,尽然是多此一举.
另外, 由于精力有限, 目前我只对照返回结果写了几个对应的实体, 其它的没有用到的,我不打算写, 如果各位有兴趣的话,可以反编译一下: AsNum.Aliexpress.API.dll 这个DLL, 源码我也不准备放出, 因为真的是很简单(只是有些繁琐而以), 有需要的可以自行反编译一下.
使用之前需要从菜单里设置一下 AppKey 和 SecretKey , 当然你需要有一个 Aliexpress 的账户.