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

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