C# HttpClient 请求转发
最近在作一个项目,须要用到别人的接口,可是遇到一个问题,这个接口只能在服务器上访问,不支持外网访问,这让人有点头疼,本地开发没有对应的环境,很差调试,写好代码封装好发布到服务器,在进行前期测试太麻烦了,有没有什么好的办法能够在本地调试。在网上找了一下,确实有,那就是请求转发,大概原理是这样的,在服务器上布置一个接口访问程序,专门访问接口的,服务器是能够经过外网进行访问,那么能够经过服务器布置的程序去访问接口,再把返回的数据传输到本地进行测试。具体流程以下:web
具体如何实现,咱们能够使用HttpClicent ,在服务器部署一个中转接口,本地访问中转接口,中转接口访问没有对外开放的数据接口。如下代码基于Asp.netapi
1.作中转接口,能够使用asp.net webapi、webservice。服务器
2.添加一个webapi控制器。编写以下代码。asp.net
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; }
}
}