少し前までは、それは他の再ドッキングを発現することが見出された場合のドッキングは、宅配便のAPI関数によって実現自分自身を呼び出して、それはあまりにも多くの時間を無駄にされ、このインターフェイスドッキング物流問題であり、個別宅配会社の数を接続する必要があります各船は、ドッキング宅配会社は、面倒で複雑な開発努力をダース以上のインターフェースを開発する実施しました。
だから、サードパーティ製の宅配便のAPIを選択し下記の、最も合理的である鳥の表現インタフェースのAPI設計の実装を。
送信元アドレス:
https://github.com/lzy2626/LogisticsInfoTest
「クイック検索」インターフェース:
RequestDataとDataSignは、データ署名されています。他の3人は文言を固定されています。
エクスプレス鳥
リアルタイムクエリを実現するために物流鳥APIをエクスプレス
すべての鳥の1.まず、他の要件に従って、宅配便のアカウントを持って、ユーザアプリケーションを向上させます。
2.自分のニーズに応じて、サービスプロビジョニング
3. [設計要件の開発ドキュメントの「インターフェイス」によると「私のAPIインタフェース、」、、公式のデモをダウンロードし、自分のコードを編集します。
デモ要求データ:
com.zs.appパッケージ; インポートjava.io.BufferedReader; インポートにjava.io.IOException; インポートjava.io.InputStreamReader; インポートjava.io.OutputStreamWriterが、 インポートjava.io.UnsupportedEncodingException; インポートjava.net.HttpURLConnectionのザ・; インポートjava.net.URL; インポートjava.net.URLEncoder; インポートjava.security.MessageDigestの、 インポートのjava.util.HashMap; インポートjava.util.Map; / ** * *速達物流鳥はインスタントクエリインターフェイスを軌道 * * @技術QQグループ:456 320 272 * @see:http://www.kdniao.com/YundanChaxunAPI.aspx * @copyright:深セン市エクスプレス金データサービス株式会社 * * DEMO民間の電気プロバイダIDとテスト使用のみ、アカウントを分離してください正式な環境登録 *一日に500以上の単一のクエリのボリュームを、私たちは、物流がアクセスサブスクリプションプッシュインターフェイスを追跡することをお勧めします * // URL要求 *公式サイトのアプリケーションに移動するIDとキー:HTTP://www.kdniao.com/ServiceApply.aspx * / publicクラスKdniaoTrackQueryAPI { // DEMO のpublic static無効メイン(文字列[] args){ KdniaoTrackQueryAPI KdniaoTrackQueryAPI新しい新しいAPI =(); {トライ =( "ANE"、 "210 001 633 605")は、文字列api.getOrderTracesByJson結果、 System.out.print(結果)の; }キャッチ(例外E){ e.printStackTrace(); } } //電力会社ID プライベート文字列EBusinessID =「1330422」; //秘密鍵暗号の電力会社、宅配便の鳥を提供し、漏れない世話を プライベート文字列のAppKey =「7611818b-6279-4398-8747 -df2ca39e86b4を」。 プライベート文字列ReqURL =「http://api.kdniao.cc/Ebusiness/EbusinessOrderHandle.aspx」。 / ** * JSON方式查询订单物流轨迹 * @throws例外 * / パブリック文字getOrderTracesByJson(文字列expCode、列expNo)が例外をスロー{ 文字列requestData = "{ 'OrderCode': ''、 'ShipperCode': '" + expCode + " ' 'LogisticCode':'" + expNo + ""}"。 地図<文字列、文字列>のparams =新しいHashMapの<文字列、文字列>(); params.put( "RequestData"のURLEncoder(requestData、 "UTF-8")); params.put( "EBusinessID"、EBusinessID)。 params.put( "RequestType"、 "1002")。 params.put( "DataSign"のURLEncoder(dataSign、 "UTF-8")); params.put( "データ型"、 "2")。 文字列結果は= sendPost(reqURL、paramsは); //ビジネス・プロセスに応じて情報を返す...... 戻り結果; } / ** * MD5暗号化 * @paramのSTRコンテンツ * @param文字セット符号化 *例外@throws * / @SuppressWarnings( "未使用") プライベート文字列MD5(STR文字列、文字列の文字セット)がスロー例外{ するMessageDigest MessageDigest.getInstance MD =を( " MD5「); md.update(str.getBytes(文字セット)); バイト[]結果= md.digest(); ; StringBufferのStringBufferの新しい新しいSB =(32) 私はresult.lengthを<;(I = 0をint型のため、I ++){ INTヴァル=結果[I]&0xffで、 プライベート文字列のURLEncoder(文字列strは、文字列の文字セットは)にUnsupportedEncodingExceptionをスロー{ IF(ヴァル<= 0xFの){ sb.append( "0"); } sb.append(Integer.toHexString(ヴァル))。 } 。sb.toString()toLowerCaseメソッド()を返します。 } / ** * BASE64编码 * @param STR内容 * @param文字セット编码方式 * @throwsにUnsupportedEncodingException * / プライベート文字列BASE64(文字列strは、文字列文字セットが)にUnsupportedEncodingException {スロー エンコードされた文字列を= base64Encode(str.getBytes(文字セット))。 エンコード返します。 } @SuppressWarnings( "未使用") 文字列結果= URLEncoder.encode(文字列、文字セット)。 結果を返します。 } / ** *电商ログイン签名生成 * @paramコンテンツ内容 * @param keyValueのAPPKEY * @param文字セット编码方式 * @throwsにUnsupportedEncodingException、例外 * @return DataSign签名 * / @SuppressWarnings( "未使用") プライベート文字列の暗号化(文字列の内容は、文字列keyValueの、文字列の文字セットは)にUnsupportedEncodingException、例外がスロー { IF(!keyValueの= NULL) { 戻りBASE64(MD5(コンテンツ+ keyValueの、文字セット)、文字セットを)。 } Base64でリターン(MD5(コンテンツ、文字セット)、文字セット); } / ** 指定されたURLに送信された* POSTメソッドのリクエスト URL送信要求のURL * @paramの * @paramリクエストパラメータがのparamsを設定し た結果に応じて、* @returnリモートリソース * / @SuppressWarnings( "未使用") プライベートsendPost文字列(文字列のURL、地図<文字列、文字列>のparams){ のOutputStreamWriter OUT = NULL; = nullの中をBufferedReader; StringBuilderのStringBuilderの新しい新しい結果=(); 試み{ URL =新しい新RealURLはURL(URL); HttpURLConnectionのコネティカット=(HttpURLConnectionの)realUrl.openConnection(); /次の2行を送信しなければならない/ POST要求が配置され 、(真の)conn.setDoOutput (真の)conn.setDoInputします。 // POST方法 StringBuilderのPARAM =新しいStringBuilderの(); conn.setRequestMethod( "POST"); //共通設定要求属性 conn.setRequestProperty( "* / *"、 "受け入れます"); conn.setRequestProperty(「接続」、「キープアライブ」)。 conn.setRequestProperty( "ユーザーエージェント"、 "Mozillaの/ 4.0(互換; MSIE 6.0; Windows NTの5.1; SV1)"); conn.setRequestProperty( "MessContent型"、 "アプリケーション/ x-www-form-urlencodedで")。 conn.connect(); //获取URLConnectionの对象对应的输出流 アウト=新しいのOutputStreamWriter(conn.getOutputStream()、 "UTF-8"); //发送请求参数 {(!のparams = null)の場合 のparams:(のMap.Entry <文字列、文字列>エントリのため。 param.append( "&"); } param.append(entry.getKey())。 param.append( "=")。 param.append(entry.getValue())。 //System.out.println(entry.getKey()+ ":" + entry.getValue()); } //System.out.println("param: "+ param.toString())。 out.write(param.toString())。 } //フラッシュ输出流的缓冲 out.flush()。 =新しいBufferedReaderの中に( 新しいInputStreamReaderの(conn.getInputStream()、 "UTF-8")); 文字列のライン。 ((ラインIN =つつ。 result.append(ライン)。 } }キャッチ(例外e){ e.printStackTrace(); } //使用ようやく块来关闭输出流、输入流 ついに{ {みてください (!= nullのうち)場合{ out.close(); } (= NULLで!){もし in.close()。 } } キャッチ(のIOExceptionのEX){ ex.printStackTrace(); } } )(result.toString返します。 } プライベート静的文字[] base64EncodeChars =新しい文字[] { 'A'、 'B'、 'C'、 'D'、 'E'、 'F'、 'G'、 'H'、 'I'は、 ' J」、 'K'、 'L'、 'M'、 'N'、 'O'、 'P'、 'Q'、R ''、 'S'、 'T'、 'U'、 'V' 、 'W'、 'X'、 'Y'、 'Z'、 'A'、 'B'、 'C'、 'D'、 'E'、 'F'、 'G'、 'H'、 '私は' 'J'、 'K'、 'L'、 'M'、 'N'、 '' O'、 'P'、 'Q'、R ''、'秒 T」、 'U'、V ''、 'W'、 'X'、 'Y'、 'Z'、 '0'、 '1'、 '2'、 '3'、 '4'、 '5' 、 '6'、 '7'、 '8'、 '9'、 '+'、 '/'}。 公共の静的な文字列base64Encode(バイト[]データ){ StringBufferのSB =新規のStringBuffer(); int型のlen = data.length。公共の静的な文字列base64Encode(バイト[]データ){ StringBufferのSB =新規のStringBuffer(); int型のlen = data.length。公共の静的な文字列base64Encode(バイト[]データ){ StringBufferのSB =新規のStringBuffer(); int型のlen = data.length。 int型私= 0; int型のB1、B2、B3; (私がlen <){一方 B1 =データ[I ++]&0xffで、 IF(I == LEN) { LEN){ B1 =データ[I ++]&0xffで、IF(I == LEN){ LEN){ B1 =データ[I ++]&0xffで、IF(I == LEN){ sb.append(base64EncodeChars [B1 >>> 2])。 sb.append(base64EncodeChars [(B1&を0x3)<< 4])。 sb.append( "=="); ブレーク; } B2 =データ[I ++]&0xffで、 IF(I == LEN) { sb.append(base64EncodeChars [B1 >>> 2])。 sb.append(base64EncodeChars [((B1&0×03)<< 4)|)((B2&0xF0が>>> 4)])。 sb.append(base64EncodeChars [(B2&0x0Fの)<< 2])。 sb.append( "=")。 ブレーク; sb.append(base64EncodeChars [B1 >> sb.append(base64EncodeChars [((B1&0×03)<< 4)|)((B2&0xF0が>>> 4)])。 sb.append(base64EncodeChars〔)((B2&0x0Fの<< 2)|)((B3&0xc0から>>> 6)])。 sb.append(base64EncodeChars [B3&0x3fを])。 } )(sb.toStringを返します。 } }
リアルタイムクエリを達成するために[]コード
1.適用性を向上させる、私はこのクラスの宅配便を分離、公式のデモコードを変更します。
2.クラスファイルの導入、およびテストの例