1. 程式人生 > >C# HttpClient 請求轉發

C# HttpClient 請求轉發

     最近在做一個專案,需要用到別人的介面,但是遇到一個問題,這個介面只能在伺服器上訪問,不支援外網訪問,這讓人有點頭疼,本地開發沒有對應的環境,不好除錯,寫好程式碼封裝好釋出到伺服器,在進行前期測試太麻煩了,有沒有什麼好的辦法可以在本地除錯。在網上找了一下,確實有,那就是請求轉發,大概原理是這樣的,在伺服器上佈置一個介面訪問程式,專門訪問介面的,伺服器是可以通過外網進行訪問,那麼可以通過伺服器佈置的程式去訪問介面,再把返回的資料傳輸到本地進行測試。具體流程如下:

具體如何實現,我們可以使用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; }
    }
}