Asp.Net Core 调用第三方Open API查询物流数据的示例
在我们的业务中不可避免要与第三方的系统进行交互,调用他们提供的API来获取相应的数据,那么对于这样的情况该怎样进行处理呢?下面就结合自己对接跨越速运接口来获取一个发运单完整的物流信息为例来说明如何在Asp.NetCore中通过代码实现。当然在他们的官方网站上面会给出具体的API调用方式以及参数格式,作为调用方只需要根据相应规则来进行编码即可,下面以我们查询某一个具体的发运单的物流信息为例来进行说明。
下面以一个查询路由详细信息为例来进行说明。当前接口主要包括:1概述。2系统参数。3 业务参数。4业务参数。5返回结果。6响应数据格式。7调用示例(Java语言)。这里主要是来说明如何使用C#语言来进行调用,其它语言的思路其实也是一样的。
一构造HttpClient对象
这里建议使用IHttpClientFactory这个接口来创建httpClient而不是直接new一个对象,至于具体原因网上有很多原因,具体理由也是IHttpClientFactory创建的HttpClient对象能够在使用完得到更好的释放资源的效果。在Asp.NetCore中直接在构造函数中注入IHttpClientFactory接口,然后采用CreateClient方法来创建对象。
publicLogisticsService(IHttpClientFactoryhttpClientFactory){ _httpClient=httpClientFactory.CreateClient(PartsConsts.DcsPartClientName); }
这个CreateClient方法中需要传一个标识你现在使用的HttpClient的名称。
二获取参数Token
按照他们的API规范中说的,在Headers中需要进行Token传递的,这个称之为请求票据,没有这个是无法进行验证的,首先我们需要定义一个用于请求Token的数据结构,同时还需要根据他们的规范来定义一个接收Token的数据结构。
A 请求Token的数据结构
publicclassLogisticsUser{ publicstringappkey{get;set;} publicstringappsecret{get;set;} }
B接收Token的数据结构
publicclassCodeMsg{ publicintCode{get;set;} publicstringMsg{get;set;} publicboolSuccess{get;set;} } publicclassTokenResult:CodeMsg{ publicTokenDataData{get;set;} } publicclassTokenData{ publicstringRefresh_token{get;set;} publicintExpire_time{get;set;} publicstringToken{get;set;} }
C同步请求方法
//////同步请求post(键值对形式) /// ////// /// /// /// /// publicasyncTask HttpPostAsync(stringurl,stringpostdate=null,List >formData=null, stringcharset="UTF-8",stringmediaType="application/json"){ HttpContentcontent=newStringContent(postdate); content.Headers.ContentType=newMediaTypeHeaderValue(mediaType){ CharSet=charset }; foreach(vardatainformData){ content.Headers.Add(data.Key,data.Value); } varresponse=await_httpClient.PostAsync(url,content); varresult=awaitresponse.Content.ReadAsStringAsync(); returnresult; }
这个方法是一个常规的异步请求方法,这里使用HttpContent作为数据载体,将一些重要的系统参数添加到Headers里面,将业务参数传递到StringContent的构造函数中去,最后调用PostAsync异步方法发送Post请求,请求完了通过返回的Response来获取返回的数据,通过这种方式来获取完整的数据结构。这里特别需要注意如果第一次请求Token失败则可以再次请求重新刷新Token,最后将获取的Json类型Token反序列化为我们定义的TokenResult结构,这样我们就能够正常获取到Token数据了。
三获取发运单数据
我们之前所有的工作都是为了能够获取到最终的业务数据,那么这里我们也是一样,首先要定义请求和接收数据的数据结构,首先是请求的数据结构。
publicclassLogisticsInputModel{ [JsonProperty("customerCode")] publicstringCustomerCode{get;set;} [JsonProperty("waybillNumbers")] publicstring[]WaybillNumbers{get;set;} }
这里面CustomerCode是我们用户编码,这个是唯一的,这是跨越速运官方给予的用户凭证,第二个WaybillNumbers就是我们需要查询的发运单的集合,这里的接口支持一次性查询多个发运单数据,所以接口使用string[]数组类型。
下面来说一下根据官方定义来定义查询物流信息的接口定义。
//////跨越速运查询物流信息接口 /// publicclassLogisticInfoModel{ publicstringCode{get;set;} publicstringMsg{get;set;} publicbool?Success{get;set;} publicDataInfoData{get;set;} publicstringTraceId{get;set;} } publicclassDataInfo{ publicstringResultCount{get;set;} publicIListEsWayBill{get;set;} } publicclassEsWayBillInfo{ publicEsWayBillInfo(){ ExteriorRouteList=newList (); } publicstringWaybillNumber{get;set;} publicstringProductCode{get;set;} publicstringReceiveDate{get;set;} publicstringReceiver{get;set;} publicstringExpectedDate{get;set;} publicstringMailingTime{get;set;} publicstringServiceMode{get;set;} publicstringMailingAddress{get;set;} publicstringReceivingAddress{get;set;} publicstringAddressee{get;set;} publicstringSender{get;set;} publicstringTotalFreightAmount{get;set;} publicstringCount{get;set;} publicstringFreightWeight{get;set;} publicdecimal?Size{get;set;} publicIList ExteriorRouteList{get;set;} } publicclassExteriorRoute{ publicintId{get;set;} publicstringRouteStep{get;set;} publicstringRouteDescription{get;set;} publicstringUploadDate{get;set;} }
有了输入请求参数,当然也需要能够接受最终数据的数据接口,这些数据结构首先都要定义好,而且必须和官方保持一致,否则就无法进行反序列化操作。
有了这些准备工作我们来看看最核心的获取业务数据的过程,我们会在稍后来对其中的一些代码进行说明。
publicasyncTask>GetLogisticsInformationAsync(LogisticsInputModelinput){ varparameter=newList >(); varnowDate=(DateTime.Now.ToUniversalTime()-newDateTime(1970,1,1)).TotalMilliseconds.ToString(CultureInfo.InvariantCulture); varjsonParam=JsonConvert.SerializeObject(input); varlogisticsUser=newLogisticsUser(){ appkey=Appkey, appsecret=Appsecret }; parameter.Add(newKeyValuePair ("X-from","openapi_ap")); vartokenResult=awaitHttpPostAsync(TokenUrl,JsonConvert.SerializeObject(logisticsUser),parameter); varcodeMsg=JsonConvert.DeserializeObject (tokenResult); //Token失效,调用刷新Token接口,返回新Token if(codeMsg.Data.Expire_time<=0){ vartokenRefreshResult=awaitHttpPostAsync(RefreshTokenUrl, "{\"refresh_token\":\""+codeMsg.Data.Refresh_token+"\"}",parameter); codeMsg=JsonConvert.DeserializeObject (tokenRefreshResult); } parameter.Clear(); parameter.Add(newKeyValuePair ("appkey",Appkey)); parameter.Add(newKeyValuePair ("format",Format)); parameter.Add(newKeyValuePair ("timestamp",nowDate)); parameter.Add(newKeyValuePair ("method",QueryRoute)); parameter.Add(newKeyValuePair ("sign",MD5Hash(Sign+nowDate+jsonParam).ToUpper())); parameter.Add(newKeyValuePair ("token",codeMsg.Data.Token)); varresult=awaitHttpPostAsync(RestUrl,jsonParam,parameter); returnJsonConvert.DeserializeObject (result)?.Data?.EsWayBill; }
这里有一些需要说明的部分,首先获取nowDate的时候是获取UTC时间,其次获取sign的时候需要对内容进行MD5加密的过程。Asp.NetCore中的MD5加密比较简单,采用下面的方式即可。
//////netcore下的实现MD5加密 /// ///加密内容 /// privatestringMD5Hash(stringinput){ using(varmd5=MD5.Create()){ varresult=md5.ComputeHash(Encoding.ASCII.GetBytes(input)); varstrResult=BitConverter.ToString(result); returnstrResult.Replace("-",""); } }
这里使用Using包裹便于进行非托管对象的释放,这里需要注意,还有一些常用的const变量定义为局部变量即可,有了这些就能够创建一个完整的根据发运单号来获取完整的物流数据的第三方API对接过程了。
privateconststringAppkey="80069"; privateconststringFormat="json"; privateconststringAppsecret="XXXE034XXX355889DC68BB40BEDXXX0"; privateconststringQueryRoute="open.api.openCommon.queryRoute"; privateconststringSign="XXXE034545E355889DC68BB40BEDXXX"; privateconststringTokenUrl="https://open.ky-express.com/security/token"; privateconststringRefreshTokenUrl="https://open.ky-express.com/security/token/refresh"; privateconststringRestUrl=https://open.ky-express.com/router/rest;
最后我们来看看通过整个调用过程获取物流信息并在系统中进行展示的效果。
以上就是Asp.NetCore调用第三方OpenAPI查询物流数据的示例的详细内容,更多关于Asp.NetCore调用第三方API的资料请关注毛票票其它相关文章!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。