亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

タオバオオープンプラットフォーム開発ドキュメント / 平臺(tái)技術(shù)-API批量調(diào)用簡(jiǎn)介

平臺(tái)技術(shù)-API批量調(diào)用簡(jiǎn)介

1、為什么要批量調(diào)用

可以提高應(yīng)用性能,更快的響應(yīng)                                                                                         
比如做一個(gè)頁(yè)面需要調(diào)用7個(gè)不同的HSF服務(wù)拉取數(shù)據(jù),然后渲染頁(yè)面。這種情況下, 如想加快頁(yè)面響應(yīng),可能會(huì)考慮并發(fā)發(fā)起7次HSF調(diào)用等到數(shù)據(jù)都返回來(lái)再進(jìn)行頁(yè)面渲染。但是這樣的編程模型對(duì)于調(diào)用者來(lái)說(shuō)響應(yīng)時(shí)間會(huì)比較長(zhǎng)且調(diào)用繁瑣,如果TOP把7次的HSF調(diào)用通過(guò)內(nèi)部串行方式由TOP直接來(lái)完成,1次調(diào)用返回多個(gè)數(shù)據(jù)結(jié)果,那則可以大大提高每次請(qǐng)求響應(yīng)時(shí)間。那對(duì)于某些復(fù)雜的API調(diào)用(單次調(diào)用RT可能會(huì)達(dá)到100MS的業(yè)務(wù)),那么就有很好的優(yōu)化效果

使用更少的流量                                                                      
單次API調(diào)用會(huì)傳重復(fù)的系統(tǒng)或者業(yè)務(wù)入?yún)?,比如:sign、method、時(shí)間戳、fileds等參數(shù),在很多情況下這些重復(fù)參數(shù)占用了請(qǐng)求體里面的大部分空間。API批量調(diào)用可以將這些參數(shù)在協(xié)議層面上進(jìn)行合并,實(shí)現(xiàn)參數(shù)的復(fù)用。對(duì)于移動(dòng)端調(diào)用、服務(wù)端高并發(fā)調(diào)用中優(yōu)化網(wǎng)絡(luò)使用是很有幫助的。

2、批量調(diào)用API特性

  • 支持目前所有安全和業(yè)務(wù)特性
  • 支持除文件上傳外的所有API自由組合調(diào)用
  • 支持多session混合調(diào)用
  • 調(diào)用結(jié)果互不干擾
  • API響應(yīng)順序和請(qǐng)求順序完全一致,無(wú)需排序或按編號(hào)查詢結(jié)果
  • 極速體驗(yàn),M次交易API+N次商品API調(diào)用,RT約為1次交易API調(diào)用(假設(shè)交易API RT> 商品API)
  • Servlet、HSF、HTTP混合全異步化調(diào)用模式,平穩(wěn)支撐低RT + 高RT混合場(chǎng)景,提高服務(wù)端吞吐能力
  • 公共參數(shù)和方法名稱可進(jìn)行合并,精簡(jiǎn)請(qǐng)求報(bào)文
  • 簡(jiǎn)單的調(diào)用協(xié)議,不用SDK也能快速實(shí)現(xiàn)批量API調(diào)用

3、批量調(diào)用技術(shù)簡(jiǎn)介

3.1 協(xié)議內(nèi)容

請(qǐng)求URL:

http://gw.api.taobao.com/router/batch

POST:

http://gw.api.taobao.com/router/batch?sign=5336DB2C525E1A3AD1013BC82C4437B2&timestamp=2016-01-05+10%3A15%3A15&v=2.0&app_key=4272&sign_method=hmac&format=json &session=6102b110f51625dcd2d1921ba80c6d2b43a2a5a37e7c7c73627811065
Content-Type :
text/plain;charset=UTF-8

PAYLOAD:

  • Payload以from的形式去承載每個(gè)API,默認(rèn)以\r\n-S-\r\n進(jìn)行分割;參數(shù)值需要進(jìn)行URL Encode
  • 自定義分隔符方式:httpHeader.put(“top-api-separator”,”????”)
  • 第一行#PUBLIC#開始,可提取公共參數(shù)和API名稱,為可選。如不需要提取公共參數(shù),同時(shí)去掉#PUBLIC#行和第一個(gè)分隔符
  • 參數(shù)優(yōu)先級(jí):API行參數(shù)  ===覆蓋===> #PUBLIC#參數(shù)  ===覆蓋===> URL參數(shù)
  • 簽名方式,類似于rest簽名:hmac(其他類似) byte2hex (hmac(key1value1key2value2...payloadsecret))
  • 占位符:假設(shè)你把一個(gè)API的所有參數(shù)都抽象到了#PUBLIC#區(qū)域,請(qǐng)放入一個(gè)占位符N,標(biāo)示我其實(shí)是一個(gè)API;如上所示

3.2 協(xié)議內(nèi)容-響應(yīng)

 Response:情況1

{"error_response":{"code":25,"msg":"Invalid signature","request_id":"16t6sm38r9709"}}

Response:情況2

{"time_get_response":{"time":"2016-01-05 10:53:02","request_id":"16t6sm2gxmm5q"}}
-S-
{"time_get_response":{"time":"2016-01-05 10:53:02","request_id":"16t6sm2gxmm5q"}}
-S-
{"trade_fullinfo_get_response":{"trade":{"orders":{"order":[{"adjust_fee":"0.00","buyer_rate":false,"cid":50069506,"consign_time":"2015-12-03 14:01:07","discount_fee":"0.00","end_time":"2015-12-03 16:18:19","invoice_no":"0000","is_oversold":false,"logistics_company":"電 子憑 證","num":1,"num_iid":2100727710059,"oid":193923500416510,"order_from":"TAOBAO","payment":"11.00","pic_path":"http:\/ \/img04.daily.taobao.net\/bao\/uploaded\/i4 \/TB1EG6SXXXXXXaBXXXXXXXXXXXX_!!0- item_pic.jpg","price":"11.00","refund_status":"NO_REFUND","seller_rate":false,"seller_type":"C","shipping_type":"virtual","snapshot_url":"d:193923500416510_1","status":"TRADE_FINISHED","title":" 測(cè)試發(fā)布收費(fèi)課 2015123","total_fee":"11.00"}]},"payment":"11.00","receiver_address":"15988161275","receiver_mobile":"","receiver_name":" 不****","status":"TRADE_FINISHED","tid":193923500416510,"type":"eticket"},"request_id":"16t6sm2gxmm5q"}}
-S-
{"error_response":{"code":27,"msg":"Invalid session","sub_code":"invalid-sessionkey","request_id":"16t6sm2gxmm5q"}}
  • Response,情況1:響應(yīng)報(bào)文只有一條結(jié)果;比如簽名,appkey不存在;這些都是共性,比如我們只進(jìn)行一次簽名,那么一條API簽名錯(cuò)誤,意味著所以api都會(huì)簽名錯(cuò)誤。
  • Response,情況2:響應(yīng)報(bào)文和請(qǐng)求報(bào)文里面的API個(gè)數(shù)一致,響應(yīng)順序也會(huì)和請(qǐng)求順序保持一致。比如你提交15條請(qǐng)求,可能會(huì)出現(xiàn)10條成功,3條流控,2條HSF服務(wù)提供端異常;但是我們的響應(yīng)體依然會(huì)有15條請(qǐng)求響應(yīng)。
  • 自定義分隔符方式:默認(rèn)分隔符為\r\n-S-\r\n ;自定義方式在提交請(qǐng)求是,使用httpHeader.put(“top-api-separator”,”????”);請(qǐng)求和響應(yīng)體分隔符保持一致

4 、SDK使用方式

4.1 創(chuàng)建Client

BatchTaobaoClient client = new BatchTaobaoClient (“http://gw.api.taobao.com router/batch
”, “appkey”,“secret");} //注:使用該方式,需要下載最新的sdk,老的sdk暫未支持批量調(diào)用功能

4.2 創(chuàng)建BatchRequest

TaobaoBatchRequest batchRequest =       new TaobaoBatchRequest();

4.3 添加請(qǐng)求API

batchRequest.addRequest(timeGetRequest1)
                                     .addRequest(timeGetRequest2)
                                     .addRequest(timeGetRequest3)
                                     .addRequest(timeGetRequest4)
                                     .addRequest(fullinfosRequest1)
                                     .addRequest(fullinfosRequest2)
                                     .addRequest(fullinfosRequest3);

4.4 提交請(qǐng)求

TaobaoBatchResponse       response = client.execute(batchRequest);
 

4.5 遍歷結(jié)果

if (response.isSuccess()) {
                   for (int i = 0; i < response.getResponseList().size(); i++) 
                         println("body:" + response.getResponseList().get(i).getBody());
             }

4.6 隨機(jī)查詢結(jié)果

if (response.isSuccess()) {
                          TimeGetResponse resp1  =  response.getResponse(timeGetRequest1);
                           if(timeGetResponse1.isSuccess())
                                       println(“服務(wù)器時(shí)間:" + resp1.getTime());
                           TradeFullinfoGetResponse rep2 =  response.getResponse(fullinfosRequest3);
}

注:使用sdk實(shí)現(xiàn)批量api調(diào)用功能 ,需要下載最新的sdk,sdk下載及使用點(diǎn)  這里 。

5、典型使用場(chǎng)景舉例

以調(diào)用接口獲取訂單詳情為例,原來(lái)要查詢某個(gè)商家多個(gè)訂單詳情,需要重復(fù)發(fā)起多次請(qǐng)求;現(xiàn)如果使用批量方式調(diào)用,1次請(qǐng)求就可以返回多個(gè)結(jié)果,可以大大提高API調(diào)用效率。以下是常用使用場(chǎng)景sdk調(diào)用示例(java):

5.1、查詢單個(gè)商家多個(gè)訂單詳情

BatchTaobaoClient client =       new BatchTaobaoClient (       "http://gw.api.taobao.com/router/batch?","test","test");         
           
     TradeFullinfoGetRequest req1 =       new TradeFullinfoGetRequest();             
     req1.setFields(       "tid");       
      req1.setTid(6666666666661L);       //訂單1       
           
     TradeFullinfoGetRequest req2 = new TradeFullinfoGetRequest();       
      req2.setFields(       "tid");       
      req2.setTid(6666666666662L);       //訂單2       
               
     TaobaoBatchRequest req =       new TaobaoBatchRequest();       
       req.addRequest(req1);       
       req.addRequest(req2);       
              
     TaobaoBatchResponse rsp = client.execute(req,       "test");       //test表示商家的sessionkey

5.2、查詢多個(gè)商家多個(gè)訂單詳情

BatchTaobaoClient client =       new BatchTaobaoClient (       "http://gw.api.taobao.com/router/batch?","test","test");         
             
     TradeFullinfoGetRequest req1 =       new TradeFullinfoGetRequest();       
      req1.setFields(       "tid");       
      req1.setTid(6666666666661L);       //商家a的訂單1       
           
      TradeFullinfoGetRequest req2 =       new TradeFullinfoGetRequest();       
      req2.setFields(       "tid");       
      req2.setTid(6666666666662L);       //商家a的訂單2       
                 
      TradeFullinfoGetRequest req3 =       new TradeFullinfoGetRequest();       
      req3.setFields(       "tid");       
      req3.setTid(8888888888881L);       //商家b的訂單1       
      req3.setBatchApiSession(       "testtest");       //商家b的sessionkey       
                  
     TaobaoBatchRequest req =       new TaobaoBatchRequest();       
       req.addRequest(req1);       
       req.addRequest(req2);       
       req.addRequest(req3);       
          
     TaobaoBatchResponse rsp = client.execute(req,       "test");       //商家a的sessionkey

5.3、查詢多個(gè)商家訂單和商品詳情

BatchTaobaoClient client =       new BatchTaobaoClient (       "http://gw.api.taobao.com/router/batch?","test","test");         
             
     TradeFullinfoGetRequest req1 =       new TradeFullinfoGetRequest();       
      req1.setFields(       "tid");       
      req1.setTid(6666666666661L);       //商家a的訂單1       
           
      TradeFullinfoGetRequest req2 =       new TradeFullinfoGetRequest();       
      req2.setFields(       "tid");       
      req2.setTid(6666666666662L);       //商家a的訂單2       
                 
      ItemSellerGetRequest req3 =       new ItemSellerGetRequest();       
      req3.setFields(       "num_iid");       
      req3.setNumIid(8888888881L);       //商家b的商品1       
      req3.setBatchApiSession(       "testtest");       //商家b的sessionkey       
                  
     TaobaoBatchRequest req =       new TaobaoBatchRequest();       
       req.addRequest(req1);       
       req.addRequest(req2);       
       req.addRequest(req3);       
          
     TaobaoBatchResponse rsp = client.execute(req,       "test");       //商家a的sessionkey

 

FAQ

測(cè)試環(huán)境下與正式環(huán)境下的API調(diào)用量有限制嗎?