這個(gè)工具借用了 JsonView 的一個(gè)控件, 從CodePlex 上下來(lái)的JsonView 用的是 Newtonsoft.Json 1.1.1.0 , 但是在 API 內(nèi),我用的是 4.5.0.0 的DLL去解析 API 返回的數(shù)據(jù), 這樣就造成了DLL版本不一致的問(wèn)題.
要解決這個(gè)問(wèn)題,需要在 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 文件夾下, 版本沖突就解決了.
大至的一個(gè)結(jié)構(gòu):
Methods 下的每個(gè)類對(duì)應(yīng) API 里的每個(gè)方法, 大致如下:
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 83
帶 ParamName 特性的屬性即API 說(shuō)明列出的 API 方法所需要的參數(shù), 在 MethodBase 里有個(gè)虛方法 Execute 及 GetResult.
絕大部分API方法不需要重寫這兩個(gè)方法, 但是有兩個(gè)特例(到目前為止,我遇到的): 和上傳圖片有關(guān)的兩個(gè)方法.
http://gw.api.alibaba.com/dev/doc/api.htm?ns=aliexpress.open&n=api.uploadTempImage&v=1
大家可以看看, Ali 的人真是省事, 就幾句話了事. 光憑這幾句話, 打死我也想不出要怎么個(gè)上傳法. 我費(fèi)勁巴啦的耗了幾個(gè)小時(shí)按照網(wǎng)頁(yè)上傳圖片的方法對(duì) RequestHelper 類進(jìn)行修改,然后建個(gè)測(cè)試網(wǎng)站做測(cè)試, 改完后發(fā)現(xiàn)牙的根本就不是這樣上傳的, 結(jié)果死都是500,未找到文件.
后來(lái)在阿里巴巴的論壇里找到了某同志的回貼, 原來(lái)和從網(wǎng)頁(yè)上傳圖片完全不搭調(diào).
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 }
原來(lái)是直接將文件的字節(jié)數(shù)組 Post 到特定格式的網(wǎng)址里, 真的是很暈,我熬夜到3點(diǎn)多,盡然是多此一舉.
另外, 由于精力有限, 目前我只對(duì)照返回結(jié)果寫了幾個(gè)對(duì)應(yīng)的實(shí)體, 其它的沒(méi)有用到的,我不打算寫, 如果各位有興趣的話,可以反編譯一下: AsNum.Aliexpress.API.dll 這個(gè)DLL, 源碼我也不準(zhǔn)備放出, 因?yàn)檎娴氖呛芎?jiǎn)單(只是有些繁瑣而以), 有需要的可以自行反編譯一下.
使用之前需要從菜單里設(shè)置一下 AppKey 和 SecretKey , 當(dāng)然你需要有一個(gè) Aliexpress 的賬戶.