C# HttpClient 请求转发
最近在作一个项目,须要用到别人的接口,可是遇到一个问题,这个接口只能在服务器上访问,不支持外网访问,这让人有点头疼,本地开发没有对应的环境,很差调试,写好代码封装好发布到服务器,在进行前期测试太麻烦了,有没有什么好的办法能够在本地调试。在网上找了一下,确实有,那就是请求转发,大概原理是这样的,在服务器上布置一个接口访问程序,专门访问接口的,服务器是能够经过外网进行访问,那么能够经过服务器布置的程序去访问接口,再把返回的数据传输到本地进行测试。具体流程以下:web
具体如何实现,咱们能够使用HttpClicent ,在服务器部署一个中转接口,本地访问中转接口,中转接口访问没有对外开放的数据接口。如下代码基于Asp.netapi
1.作中转接口,能够使用asp.net webapi、webservice。服务器
2.添加一个webapi控制器。编写以下代码。asp.net
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 | using System.Collections.Generic; using System.Net; using System.Net.Http; using System.Web.Http; namespace TransferPortProject.Controllers { [RoutePrefix( "api/transfer" )] public class TransferController : ApiController { private HttpClient client = new HttpClient(); /// <summary> /// 使用Get请求获取用户信息 /// </summary> /// <param name="url">只容许服务器访问的接口地址</param> /// <returns></returns> [HttpGet] [Route( "user" )] public HttpResponseMessage GetUser([FromUri] string url) { return client.GetAsync(url).Result.EnsureSuccessStatusCode(); //请求转发 } /// <summary> /// 使用Post请求转发获取部门数据 /// </summary> /// <param name="url">只容许服务器访问的接口地址</param> /// <param name="parameter">附加的请求参数</param> /// <returns></returns> [HttpPost] [Route( "department" )] public HttpResponseMessage GetDepartment([FromBody] string url, string parameter) { return client.PostAsync(url, Request.Content).Result.EnsureSuccessStatusCode(); } /// <summary> /// 使用Post转发获取学生数据,用form-data,注意,此处请求中转的是用普通请求,中转访问内部接口使用form-fata的方式请求数据 /// </summary> /// <param name="url">只容许服务器访问的接口地址</param> /// <param name="parameter">附加的请求参数列表</param> /// <returns></returns> [HttpPost] [Route( "student" )] public HttpResponseMessage GetStudent([FromBody] string url,List<ParameterEntity> parameter) { var formData= new MultipartFormDataContent(); if (parameter!= null ) { foreach ( var d in parameter) { formData.Add( new StringContent(d.Value),d.Name); //序列化对象 } } return client.PostAsync(url, formData).Result.EnsureSuccessStatusCode(); } /// <summary> /// 使用Post转发上传文件 /// </summary> /// <param name="url">只容许服务器访问的接口地址</param> /// <returns></returns> [HttpPost] [Route( "file" )] public HttpResponseMessage GetFile( string url) { if (!Request.Content.IsMimeMultipartContent()) { //若是请求不是multipart/form-data类型,抛出异常 throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType); } return client.PostAsync(url,Request.Content).Result.EnsureSuccessStatusCode(); } } public class ParameterEntity { /// <summary> /// 参数名称 /// </summary> public string Name { get ; set ; } /// <summary> /// 参数值 /// </summary> public string Value { get ; set ; } } } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)