// 常用快遞調用示例代碼 - 聚合數據
// 在線接口文檔:https://www.juhe.cn/docs/api/id/43
// 代碼中JsonObject類下載地址:http://download.csdn.net/download/weixin_38668828/10220570
/// <summary>
///返回json格式的字符串 物流信息(可以查看最下面寫的json返回實例)
/// </summary>
/// <returns></returns>
public static string deliveryInfos()
{
//常用快遞查詢API
string url1 = "http://v.juhe.cn/exp/index";
var parameters1 = new Dictionary<string, string>();
parameters1.Add("com", "sto"); //需要查詢的快遞公司編號
parameters1.Add("no", "335013057****"); //需要查詢的訂單號
parameters1.Add("key", "********************");//配置您申請的appkey
parameters1.Add("dtype", "json"); //返回數據的格式,xml或json,默認json
string result1 = sendPost(url1, parameters1, "get");//你所要得到的物流信息,格式爲json字符串(可以查看最下寫的json返回實例)
JsonObject newObj1 = new JsonObject(result1);//字符串轉換爲json對象
string errorCode1 = newObj1["error_code"].Value;//錯誤碼,0表示查詢正常,其他表示查詢不到物流信息或發生了其他錯誤
if (errorCode1 == "0")
{
//newObj1["result"]["status"].Value這種寫法視爲了獲取json對象值中的對象值(寫的時候特別糾結newObj1["result"].Value獲取不到值,最後猜想這個格式和newObj1["error_code"].Value的格式不一樣,它是一個對象,抱着試一試的心態這樣寫newObj1["result"]["status"].Value,發現對了,皆大歡喜)
string status = newObj1["result"]["status"].Value;//1表示此快遞單的物流信息不會發生變化,此時您可以存儲下來,不用再調用接口(省錢,有錢任性的話可以不存);0表示有變化的可能性;
if (status=="1")
{
//對status 進行存儲操作,或者可以將返回的json字符串數據存儲下來
}
return result1;
}
#region start說明:這一整塊(到下面的end說明)可以直接用,不用修改
/// <summary>
/// Http (GET/POST)
/// </summary>
/// <param name="url">請求URL</param>
/// <param name="parameters">請求參數</param>
/// <param name="method">請求方法</param>
/// <returns>響應內容</returns>
static string sendPost(string url, IDictionary<string, string> parameters, string method)
{
if (method.ToLower() == "post")
{
HttpWebRequest req = null;
HttpWebResponse rsp = null;
System.IO.Stream reqStream = null;
try
{
req = (HttpWebRequest)WebRequest.Create(url);
req.Method = method;
req.KeepAlive = false;
req.ProtocolVersion = HttpVersion.Version10;
req.Timeout = 5000;
req.ContentType = "application/x-www-form-urlencoded;charset=utf-8";
byte[] postData = Encoding.UTF8.GetBytes(BuildQuery(parameters, "utf8"));
reqStream = req.GetRequestStream();
reqStream.Write(postData, 0, postData.Length);
rsp = (HttpWebResponse)req.GetResponse();
Encoding encoding = Encoding.GetEncoding(rsp.CharacterSet);
return GetResponseAsString(rsp, encoding);
}
catch (Exception ex)
{
return ex.Message;
}
finally
{
if (reqStream != null) reqStream.Close();
if (rsp != null) rsp.Close();
}
}
else
{
//創建請求
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url + "?" + BuildQuery(parameters, "utf8"));
//GET請求
request.Method = "GET";
request.ReadWriteTimeout = 5000;
request.ContentType = "text/html;charset=UTF-8";
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
Stream myResponseStream = response.GetResponseStream();
StreamReader myStreamReader = new StreamReader(myResponseStream, Encoding.GetEncoding("utf-8"));
//返回內容
string retString = myStreamReader.ReadToEnd();
return retString;
}
}
/// <summary>
/// 組裝普通文本請求參數。
/// </summary>
/// <param name="parameters">Key-Value形式請求參數字典</param>
/// <returns>URL編碼後的請求數據</returns>
static string BuildQuery(IDictionary<string, string> parameters, string encode)
{
StringBuilder postData = new StringBuilder();
bool hasParam = false;
IEnumerator<KeyValuePair<string, string>> dem = parameters.GetEnumerator();
while (dem.MoveNext())
{
string name = dem.Current.Key;
string value = dem.Current.Value;
// 忽略參數名或參數值爲空的參數
if (!string.IsNullOrEmpty(name))//&& !string.IsNullOrEmpty(value)
{
if (hasParam)
{
postData.Append("&");
}
postData.Append(name);
postData.Append("=");
if (encode == "gb2312")
{
postData.Append(HttpUtility.UrlEncode(value, Encoding.GetEncoding("gb2312")));
}
else if (encode == "utf8")
{
postData.Append(HttpUtility.UrlEncode(value, Encoding.UTF8));
}
else
{
postData.Append(value);
}
hasParam = true;
}
}
return postData.ToString();
}
/// <summary>
/// 把響應流轉換爲文本。
/// </summary>
/// <param name="rsp">響應流對象</param>
/// <param name="encoding">編碼方式</param>
/// <returns>響應文本</returns>
static string GetResponseAsString(HttpWebResponse rsp, Encoding encoding)
{
System.IO.Stream stream = null;
StreamReader reader = null;
try
{
// 以字符流的方式讀取HTTP響應
stream = rsp.GetResponseStream();
reader = new StreamReader(stream, encoding);
return reader.ReadToEnd();
}
finally
{
// 釋放資源
if (reader != null) reader.Close();
if (stream != null) stream.Close();
if (rsp != null) rsp.Close();
}
}
#endregion end說明:這一整塊可以直接用,不用修改
#region json返回實例
// {
// "resultcode": "200", /* 老版狀態碼,新用戶請忽略此字段 */
// "reason": "查詢物流信息成功",
// "company": "申通", /* 快遞公司名字 */
// "result": {
// "com": "sto",
// "status": "1", /* 1表示此快遞單的物流信息不會發生變化,此時您可緩存下來;0表示有變化的可能性 */
// "no": "335013057****", /* 快遞單號 */
// "list": [
// {
// "remark": "離開郴州市 發往長沙市【郴州市】", /* 物流事件的描述 */
// "datetime": "2016-06-15 21:44:04", /* 物流事件發生的時間 */
// "zone": "" /* 快件當時所在區域,由於快遞公司升級,現大多數快遞不提供此信息 */
// },
// }
// {
// "datetime": "2016-06-20 17:55:00",
// "remark": "投遞並簽收,簽收人:單位收發章 *【畢節地區】",
// "zone": ""
// ]
// },
// "error_code": 0 /* 錯誤碼,0表示查詢正常,其他表示查詢不到物流信息或發生了其他錯誤 */
//}
#endregion