C# HttpClient 請求轉發
阿新 • • 發佈:2018-12-18
最近在做一個專案,需要用到別人的介面,但是遇到一個問題,這個介面只能在伺服器上訪問,不支援外網訪問,這讓人有點頭疼,本地開發沒有對應的環境,不好除錯,寫好程式碼封裝好釋出到伺服器,在進行前期測試太麻煩了,有沒有什麼好的辦法可以在本地除錯。在網上找了一下,確實有,那就是請求轉發,大概原理是這樣的,在伺服器上佈置一個介面訪問程式,專門訪問介面的,伺服器是可以通過外網進行訪問,那麼可以通過伺服器佈置的程式去訪問介面,再把返回的資料傳輸到本地進行測試。具體流程如下:
具體如何實現,我們可以使用HttpClicent ,在伺服器部署一箇中轉介面,本地訪問中轉介面,中轉介面訪問沒有對外開放的資料介面。以下程式碼基於Asp.net
1.做中轉介面,可以使用asp.net webapi、webservice。
2.新增一個webapi控制器。編寫如下程式碼。
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; } } }