最近在做一个项目,需要用到别人的接口,但是遇到一个问题,这个接口只能在服务器上访问,不支持外网访问,这让人有点头疼,本地开发没有对应的环境,不好调试,写好代码封装好发布到服务器,在进行前期测试太麻烦了,有没有什么好的办法可以在本地调试。在网上找了一下,确实有,那就是请求转发,大概原理是这样的,在服务器上布置一个接口访问程序,专门访问接口的,服务器是可以通过外网进行访问,那么可以通过服务器布置的程序去访问接口,再把返回的数据传输到本地进行测试。具体流程如下:

具体如何实现,我们可以使用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; }
}
}

 

C# HttpClient 请求转发的更多相关文章

  1. .Net Core 3.0后台使用httpclient请求网络网页和图片_使用Core3.0做一个简单的代理服务器

    目标:使用.net core最新的3.0版本,借助httpclient和本机的host域名代理,实现网络请求转发和内容获取,最终显示到目标客户端! 背景:本人在core领域是个新手,对core的使用不 ...

  2. .NET Core HttpClient请求异常详细情况分析

    前言 最近项目上每天间断性捕获到HttpClient请求异常,感觉有点奇怪,于是乎观察了两三天,通过日志以及对接方沟通确认等等,查看对应版本源码,尝试添加部分配置发布后,观察十几小时暂无异常情况出现, ...

  3. 源码分析Gateway请求转发

    本期我们主要还是讲解一下Gateway,上一期我们讲解了一下Gateway中进行路由转发的关键角色,过滤器和断言是如何被加载的,上期链接: https://www.cnblogs.com/guoxia ...

  4. 用 IIS 实现请求转发

    最近部门要开发一个简单的APP,部分数据是现有项目已经存在的,为了方便维护,希望只提供一个交互的入口,并且协议的规则不变. 基于这个需求,有两套解决方案: 1.用代码将现有的api封装一层,对请求数据 ...

  5. Java Web中请求转发和请求包含

    1.都是在一个请求中跨越多个Servlet 2.多个Servlet在一个请求中,他们共享request对象.就是在AServle中setAttribute()保存数据在BServlet中由getAtt ...

  6. nginx实现请求转发

    反向代理适用于很多场合,负载均衡是最普遍的用法. nginx 作为目前最流行的web服务器之一,可以很方便地实现反向代理. nginx 反向代理官方文档: NGINX REVERSE PROXY 当在 ...

  7. spring mvc 请求转发和重定向(转)

    spring mvc controller间跳转 重定向 传参 url:http://zghbwjl.blog.163.com/blog/static/12033667220137795252845/ ...

  8. SpringMVC源码剖析(四)- DispatcherServlet请求转发的实现

    SpringMVC完成初始化流程之后,就进入Servlet标准生命周期的第二个阶段,即“service”阶段.在“service”阶段中,每一次Http请求到来,容器都会启动一个请求线程,通过serv ...

  9. 微信内嵌浏览器sessionid丢失问题,nginx ip_hash将所有请求转发到一台机器

    现象微信中打开网页,图形验证码填写后,经常提示错误,即使填写正确也会提示错误,并且是间歇性出现. 系统前期,用户使用主要集中在pc浏览器中,一直没有出现这样的问题.近期有部分用户是在微信中访问的,才出 ...

随机推荐

  1. python删除x天前文件及文件夹

    #!/usr/bin/env python # -*- coding:utf-8 -*- import os, time, sys, shutil def delFiles(beforeSec, di ...

  2. Genymotion使用分析

    1.从官网下载Genymotion Genymotion官方下载地址:https://www.genymotion.com/#!/download 没有注册,先进行注册 公司规模选择个人 2.Andr ...

  3. Jmeter的参数配置

    Ramp-up Period(in seconds) [1]决定多长时间启动所有线程.如果使用10个线程,ramp-up period是100秒,那么JMeter用100秒使所有10个线程启动并运行. ...

  4. [MVC 4] ActionResult 使用示例

    在控制器 HomeController.cs 中使用以下代码 public ActionResult Contact() { ViewBag.Message = "Your contact ...

  5. app crawler1

    app crawler简介 执行 java -jar appcrawler-2.1.3.jar 查看相关参数 -a, --app Android或者iOS的文件地址, 可以是网络地址, 赋值给appi ...

  6. CentOS防火墙中端口的开启和关闭

    1.开启端口(以80端口为例) 方法一: /sbin/iptables -I INPUT -p tcp --dport -j ACCEPT 写入修改 /etc/init.d/iptables save ...

  7. MySQL创建函数报“ERROR 1418 ”错误,不能创建函数

    MySQL创建函数报ERROR 1418错误,不能创建函数,根据官方提示是说,不能创建函数可能是一个安全设置方面的配置或功能未开启原因,下面我们一起来看.   错误 ERROR 1418 (HY000 ...

  8. vconsole使用

    <html> <head> <meta http-equiv="Content-Type" content="text/html; char ...

  9. IOS AudioServicesPlaySystemSound 后台锁屏播放

    AudioServicesPlaySystemSound 想在锁屏后台播放报警提示音. 添加了UIBackgroundModes,audio,官方审核不通过! IOS的闹钟是怎么实现的,锁屏不能播放声 ...

  10. VB.Net条形码编程的方法

    一.条形码的读取用过键盘口式的扫条码工具的朋友就知道,它就如同在鍵盘上按下数字鍵一样,基本不需任何编程和处理.但如果你使用的是其它接口的话,可能你就要为该设备编写通讯代码了.以下有一段简单的25针串口 ...