设计原则
1. 容易维护扩展(不需要修改主类就可以添加新的API支持)
2. 注入型解释器(依据不同的返回格式注入相应的解释器)
3. 集中管理请求参数与参数映射
4. 以异常的方式来管理错误的响应
5. 使用泛型来做强类型编程
6. 多协议扩展支持(REST, RPC, SOAP, etc)
调用方式:
ITopClient client = new TopRestClient("http://gw.api.tbsandbox.com/router/rest", "test", "test", "json");
UserGetRequest request = new UserGetRequest();
request.Fields = "user_id,nick,sex,created,location";
request.Nick = "tbtest520";
User user = client.Execute(request, new UserGetJsonParser());
aspx:
<form id="form1" runat="server">
<asp:ScriptManager ID="ScriptManager1" runat="server" />
获得淘宝授权: <asp:LinkButton ID="LinkButton1" runat="server" PostBackUrl="LinkButtonhttp://open.taobao.com/isv/authorize.php?appkey=test">LinkButton</asp:LinkButton>
<br />
<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
<asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Text="Button" /><div>
<asp:GridView ID="GridView1" runat="server">
</asp:GridView>
</div>
</form>
.cs
protected void Button1_Click(object sender, EventArgs e)
{
string sessionKey = getSessionKey(TextBox1.Text);
if (sessionKey.StartsWith("Error"))
{
Response.Write("<script>alert('获取SessionKey失败,请更换您的授权码')</script>");<
return;
}
DataTable table = new DataTable();
DataColumn c1 = new DataColumn("订单编号", typeof(string));
table.Columns.Add(c1);
DataColumn c2 = new DataColumn("买家昵称", typeof(string));
table.Columns.Add(c2);
DataColumn c3 = new DataColumn("卖家昵称", typeof(string));
table.Columns.Add(c3);
DataColumn c4 = new DataColumn("订单状态", typeof(string));
table.Columns.Add(c4);
DataColumn c5 = new DataColumn("商品标题", typeof(string));
table.Columns.Add(c5);
DataColumn c6 = new DataColumn("价格", typeof(string));
table.Columns.Add(c6);
DataColumn c7 = new DataColumn("数量", typeof(string));
table.Columns.Add(c7);
TopXmlRestClient topClient = new TopXmlRestClient("http://gw.api.tbsandbox.com/router/rest", "test", "test");
TradesSoldGetRequest req = new TradesSoldGetRequest();
req.Fields = "tid,seller_nick,buyer_nick,status,orders.title,orders.price,orders.num";
req.PageSize = 18;
ResponseList<Trade> rsp = topClient.GetSoldTrades(req, sessionKey);
if (rsp.Content == null || rsp.Content.Count < 1)
{
Response.Write("<script>alert('此会员没有订单,请更换其他会员帐号获取授权码重试')</script>");
return;
}
List<Trade> trades = rsp.Content;
foreach (Trade trade in trades)
{
DataRow r1 = table.NewRow();
r1["卖家昵称"] = trade.SellerNick;
r1["买家昵称"] = trade.BuyerNick;
r1["订单编号"] = trade.Tid;
r1["订单状态"] = trade.Status;
if (trade.OrderList != null && trade.OrderList.Count > 0)
{
Order order = trade.OrderList[0];
r1["商品标题"] = order.ItemTitle;
r1["价格"] = order.ItemPrice;
r1["数量"] = order.ItemNum;
}
table.Rows.Add(r1);
}
GridView1.DataSource = table;
GridView1.DataBind();
}
public string getSessionKey(string auth_code)
{
try
{
// Create a request for the URL.
WebRequest request = WebRequest.Create("http://container.api.tbsandbox.com/container?authcode=" + auth_code);
// Get the response.
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
if (response.StatusCode != HttpStatusCode.OK) return "Error";
// Get the stream containing content returned by the server.
Stream dataStream = response.GetResponseStream();
// Open the stream using a StreamReader for easy access.
StreamReader reader = new StreamReader(dataStream);
// Read the content.
string responseFromServer = reader.ReadToEnd();
string[] sArray = responseFromServer.Split('&');
foreach (string i in sArray)
{
if (i.ToString().StartsWith("top_session")) return i.ToString().Substring(i.ToString().IndexOf("=") + 1);
}
// Display the content.
// Console.WriteLine (responseFromServer);
// Cleanup the streams and the response.
reader.Close();
dataStream.Close();
response.Close();
return responseFromServer;
}
catch (WebException e)
{
return "Error:" + e.Status;
}
catch (Exception e)
{
return "Error:" + e.Message;
}
}
当然系统中必须引入dll:Newtonsoft.Json.dll;Top4Net.dll