最近在作一個項目,須要用到別人的接口,可是遇到一個問題,這個接口只能在服務器上訪問,不支持外網訪問,這讓人有點頭疼,本地開發沒有對應的環境,很差調試,寫好代碼封裝好發佈到服務器,在進行前期測試太麻煩了,有沒有什麼好的辦法能夠在本地調試。在網上找了一下,確實有,那就是請求轉發,大概原理是這樣的,在服務器上佈置一個接口訪問程序,專門訪問接口的,服務器是能夠經過外網進行訪問,那麼能夠經過服務器佈置的程序去訪問接口,再把返回的數據傳輸到本地進行測試。具體流程以下: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; } } }