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; }
    }
}
相關文章
相關標籤/搜索