长春网络公司做网站云南住房和城乡建设局网站
web/
2025/9/30 22:56:22/
文章来源:
长春网络公司做网站,云南住房和城乡建设局网站,宁夏网络公司排名,常州小程序开发报价组件开始设计是针对以接口的方式来定义HTTP/HTTPS访问#xff0c;虽然基于接口来操作有很大的便利性#xff0c;但定义起来就比较麻烦了。所以在1.5版本中实现了一个HttpClient类来简化调用。HttpClient 该类支持HTTP的GET,POST,DELETE和PUT操作#xff0c;通过这几个… 组件开始设计是针对以接口的方式来定义HTTP/HTTPS访问虽然基于接口来操作有很大的便利性但定义起来就比较麻烦了。所以在1.5版本中实现了一个HttpClient类来简化调用。HttpClient 该类支持HTTP的GET,POST,DELETE和PUT操作通过这几个方法可以调用HTTP请求包括application/json和上传文件等。 public class HttpClientTwhere T : IBodyFormater, new(){public HttpClient(string host){mHost HttpHost.GetHttpHost(host);}private HttpHost mHost;private Dictionarystring, string mQueryString new Dictionarystring, string(StringComparer.OrdinalIgnoreCase);private Dictionarystring, string mHeader new Dictionarystring, string(StringComparer.OrdinalIgnoreCase);private object mDataObject;private Dictionarystring, object mDataMap new Dictionarystring, object(StringComparer.OrdinalIgnoreCase);public HttpClientT Accept(string value){mHeader[accept] value;return this;}public HttpClientT Authorization(string value){mHeader[authorization] value;return this;}public HttpClientT SetHeader(string name, string value){mHeader[name] value;return this;}public HttpClientT AddQueryString(string name, object value){mQueryString[name] value.ToString();return this;}public HttpClientT SetBody(object data){mDataObject data;return this;}public HttpClientT AddBodyFile(string name, string file){AddBodyField(name, new FileInfo(file));return this;}public HttpClientT AddBodyFile(string name, UploadFile file){AddBodyField(name, file);return this;}public HttpClientT AddBodyField(string name, object data){mDataMap[name] data;return this;}public async TaskRESULT GetRESULT(string url){var response await Get(url, typeof(RESULT));return response.GetResultRESULT();}public TaskResponse Get(string url, Type bodyType null){var request mHost.Get(url, mHeader, mQueryString, new T(), bodyType);return request.Execute();}public async TaskRESULT PostRESULT(string url){var response await Post(url, typeof(RESULT));return response.GetResultRESULT();}public TaskResponse Post(string url, Type bodyType null){var request mHost.Post(url, mHeader, mQueryString, mDataObject null ? mDataMap : mDataObject, new T(), bodyType);return request.Execute();}public async TaskRESULT PutRESULT(string url){var response await Put(url, typeof(RESULT));return response.GetResultRESULT();}public TaskResponse Put(string url, Type bodyType null){var request mHost.Put(url, mHeader, mQueryString, mDataObject null ? mDataMap : mDataObject, new T(), bodyType);return request.Execute();}public async TaskRESULT DeleteRESULT(string url){var response await Delete(url, typeof(RESULT));return response.GetResultRESULT();}public TaskResponse Delete(string url, Type bodyType null){var request mHost.Delete(url, mHeader, mQueryString, new T(), bodyType);return request.Execute();}}
以上是类的完全整代码实现代码量比较少归功于组件在基础上的基础封装。为了更方便使用组件在这基础上扩展了几种常用格式调用Client类。 //二进制流处理下载文件public class HttpBinaryClient : HttpClientBinaryFormater{public HttpBinaryClient(string host) : base(host){}}//常用的Form url encoding编码,对应application/x-www-form-urlencodedpublic class HttpFormUrlClient : HttpClientFormUrlFormater{public HttpFormUrlClient(string host) : base(host){}}//用于json请求响应对应application/jsonpublic class HttpJsonClient : HttpClientJsonFormater{public HttpJsonClient(string host) : base(host){}}//等价于multipart/form-data常用于上传文件public class HttpFormDataClient : HttpClientFromDataFormater{public HttpFormDataClient(string host) : base(host){}}
可以根据自己需要来使用不同的Client。自定义Formater 有很多时候请求和响应的内容不一致这个时候就要用到自定义Formater了组件支持这样的扩展只需要FormaterAttribute对象重写相关方法即可。以下是BinaryFormater的扩展 public class BinaryFormater : FormaterAttribute{public override string ContentType application/octet-stream;public override object Deserialization(Response response, PipeStream stream, Type type, int length){var result System.Buffers.ArrayPoolbyte.Shared.Rent(length);stream.Read(result, 0, length);return new ArraySegmentByte(result, 0, length);}public override void Serialization(Request request, object data, PipeStream stream){if (data is Byte[] buffer){stream.Write(buffer, 0, buffer.Length);}else if (data is ArraySegmentbyte array){stream.Write(array.Array, array.Offset, array.Count);}else{throw new Exception(Commit data must be byte[] or ArraySegmentbyte);}}}
为了方便也可以继承已经实现的重写单个方法。使用 在使用之前需要引用BeetleX.Http.Clients引用后即可使用组件来访问HTTP/HTTPS服务。 [Fact]public async Task HttpBin_Delete(){HttpJsonClient client new HttpJsonClient(http://httpbin.org);var result await client.Delete(/delete);Assert.Equal(null, result.Exception);}[Fact]public async Task HttpBin_Get(){HttpJsonClient client new HttpJsonClient(http://httpbin.org);var result await client.Get(/get);Assert.Equal(null, result.Exception);}[Fact]public async Task HttpBin_Post(){HttpJsonClient client new HttpJsonClient(http://httpbin.org);var date DateTime.Now;client.SetBody(date);var result await client.Post(/post);JToken rdata result.GetResultJToken()[data];}[Fact]public async Task HttpBin_Put(){HttpJsonClient client new HttpJsonClient(http://httpbin.org);Employee emp DataHelper.Defalut.Employees[0];client.SetBody(emp);var result await client.Post(/post);JToken rdata result.GetResultJToken()[data];}[Fact]public async Task GetImage(){HttpClientBinaryFormater client new HttpClientBinaryFormater(http://httpbin.org);var result await client.Get(/image);var data result.GetResultArraySegmentbyte();using (System.IO.Stream write System.IO.File.Create(test.jpg)){write.Write(data.Array, data.Offset, data.Count);write.Flush();}}
以上是组件的一些用例应用代码。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/84698.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!