Asp.Net Core 挪用第三方Open API查询物流数据的示例

  在我们的业务中不行制止要与第三方的系统举办交互,挪用他们提供的API来获取相应的数据,那么对付这样的环境该奈何举办处理惩罚呢?下面就团结本身对接超过速运接口来获取一个发运单完整的物流信息为例来说明如安在Asp.Net Core中通过代码实现。虽然在他们的官方网站上面会给出详细的API挪用方法以及参数名目,作为挪用方只需要按拍照应法则来举办编码即可,下面以我们查询某一个详细的发运单的物流信息为例来举办说明。

  下面以一个查询路由具体信息为例来举办说明。当前接口主要包罗:1 概述。 2 系统参数。 3  业务参数。 4 业务参数。5 返回功效。6 响应数据名目。7 挪用示例(Java语言)。这里主要是来说明如何利用C#语言来举办挪用,其它语言的思路其实也是一样的。

  一 结构HttpClient工具

  这里发起利用IHttpClientFactory这个接口来建设httpClient而不是直接new一个工具,至于详细原因网上有许多原因,详细来由也是IHttpClientFactory建设的HttpClient工具可以或许在利用完获得更好的释放资源的结果。在Asp.Net Core中直接在结构函数中注入IHttpClientFactory接口,然后回收CreateClient要领来建设工具。  

public LogisticsService(IHttpClientFactory httpClientFactory) { _httpClient = httpClientFactory.CreateClient(PartsConsts.DcsPartClientName); }

  这个CreateClient要领中需要传一个标识你此刻利用的HttpClient的名称。

  二 获取参数Token

  凭据他们的API类型中说的,在Headers中需要举办Token通报的,这个称之为请求单据,没有这个是无法举办验证的,首先我们需要界说一个用于请求Token的数据布局,同时还需要按照他们的类型来界说一个吸收Token的数据布局。

  A   请求Token的数据布局  

public class LogisticsUser { public string appkey { get; set; } public string appsecret { get; set; } }

  B 吸收Token的数据布局

public class CodeMsg { public int Code { get; set; } public string Msg { get; set; } public bool Success { get; set; } } public class TokenResult : CodeMsg { public TokenData Data { get; set; } } public class TokenData { public string Refresh_token { get; set; } public int Expire_time { get; set; } public string Token { get; set; } }

  C 同步请求要领

/// <summary> /// 同步请求post(键值对形式) /// </summary> /// <param></param> /// <param></param> /// <param></param> /// <param></param> /// <param></param> /// <returns></returns> public async Task<string> HttpPostAsync(string url, string postdate = null, List<KeyValuePair<string, string>> formData = null, string charset = "UTF-8", string mediaType = "application/json") { HttpContent content = new StringContent(postdate); content.Headers.ContentType = new MediaTypeHeaderValue(mediaType) { CharSet = charset }; foreach (var data in formData) { content.Headers.Add(data.Key, data.Value); } var response = await _httpClient.PostAsync(url, content); var result = await response.Content.ReadAsStringAsync(); return result; }

  这个要领是一个通例的异步请求要领,这里利用HttpContent作为数据载体,将一些重要的系统参数添加到Headers内里,将业务参数通报到StringContent的结构函数中去,最后挪用PostAsync异步要领发送Post请求,请求完了通过返回的Response来获取返回的数据,通过这种方法来获取完整的数据布局。这里出格需要留意假如第一次请求Token失败则可以再次请求从头刷新Token,最后将获取的Json范例Token反序列化为我们界说的TokenResult布局,这样我们就可以或许正常获取到Token数据了。

  三 获取发运单数据

  我们之前所有的事情都是为了可以或许获取到最终的业务数据,那么这里我们也是一样,首先要界说请求和吸收数据的数据布局,首先是请求的数据布局。

public class LogisticsInputModel { [JsonProperty("customerCode")] public string CustomerCode { get; set; } [JsonProperty("waybillNumbers")] public string[] WaybillNumbers { get; set; } }

  这内里CustomerCode是我们用户编码,这个是独一的,这是超过速运官方给以的用户凭证,第二个WaybillNumbers 就是我们需要查询的发运单的荟萃,这里的接口支持一次性查询多个发运单数据,所以接口利用string[ ]数组范例。

  下面来说一下按照官方界说来界说查询物流信息的接口界说。

/// <summary> /// 超过速运查询物流信息接口 /// </summary> public class LogisticInfoModel { public string Code { get; set; } public string Msg { get; set; } public bool? Success { get; set; } public DataInfo Data { get; set; } public string TraceId { get; set; } } public class DataInfo { public string ResultCount { get; set; } public IList<EsWayBillInfo> EsWayBill { get; set; } } public class EsWayBillInfo { public EsWayBillInfo() { ExteriorRouteList = new List<ExteriorRoute>(); } public string WaybillNumber { get; set; } public string ProductCode { get; set; } public string ReceiveDate { get; set; } public string Receiver { get; set; } public string ExpectedDate { get; set; } public string MailingTime { get; set; } public string ServiceMode { get; set; } public string MailingAddress { get; set; } public string ReceivingAddress { get; set; } public string Addressee { get; set; } public string Sender { get; set; } public string TotalFreightAmount { get; set; } public string Count { get; set; } public string FreightWeight { get; set; } public decimal? Size { get; set; } public IList<ExteriorRoute> ExteriorRouteList { get; set; } } public class ExteriorRoute { public int Id { get; set; } public string RouteStep { get; set; } public string RouteDescription { get; set; } public string UploadDate { get; set; } }

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wsjjpj.html