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; }
}
}
C# HttpClient 请求转发的更多相关文章
- .Net Core 3.0后台使用httpclient请求网络网页和图片_使用Core3.0做一个简单的代理服务器
目标:使用.net core最新的3.0版本,借助httpclient和本机的host域名代理,实现网络请求转发和内容获取,最终显示到目标客户端! 背景:本人在core领域是个新手,对core的使用不 ...
- .NET Core HttpClient请求异常详细情况分析
前言 最近项目上每天间断性捕获到HttpClient请求异常,感觉有点奇怪,于是乎观察了两三天,通过日志以及对接方沟通确认等等,查看对应版本源码,尝试添加部分配置发布后,观察十几小时暂无异常情况出现, ...
- 源码分析Gateway请求转发
本期我们主要还是讲解一下Gateway,上一期我们讲解了一下Gateway中进行路由转发的关键角色,过滤器和断言是如何被加载的,上期链接: https://www.cnblogs.com/guoxia ...
- 用 IIS 实现请求转发
最近部门要开发一个简单的APP,部分数据是现有项目已经存在的,为了方便维护,希望只提供一个交互的入口,并且协议的规则不变. 基于这个需求,有两套解决方案: 1.用代码将现有的api封装一层,对请求数据 ...
- Java Web中请求转发和请求包含
1.都是在一个请求中跨越多个Servlet 2.多个Servlet在一个请求中,他们共享request对象.就是在AServle中setAttribute()保存数据在BServlet中由getAtt ...
- nginx实现请求转发
反向代理适用于很多场合,负载均衡是最普遍的用法. nginx 作为目前最流行的web服务器之一,可以很方便地实现反向代理. nginx 反向代理官方文档: NGINX REVERSE PROXY 当在 ...
- spring mvc 请求转发和重定向(转)
spring mvc controller间跳转 重定向 传参 url:http://zghbwjl.blog.163.com/blog/static/12033667220137795252845/ ...
- SpringMVC源码剖析(四)- DispatcherServlet请求转发的实现
SpringMVC完成初始化流程之后,就进入Servlet标准生命周期的第二个阶段,即“service”阶段.在“service”阶段中,每一次Http请求到来,容器都会启动一个请求线程,通过serv ...
- 微信内嵌浏览器sessionid丢失问题,nginx ip_hash将所有请求转发到一台机器
现象微信中打开网页,图形验证码填写后,经常提示错误,即使填写正确也会提示错误,并且是间歇性出现. 系统前期,用户使用主要集中在pc浏览器中,一直没有出现这样的问题.近期有部分用户是在微信中访问的,才出 ...
随机推荐
- UEditor自定义toolbar工具条
使用ueditor的同学都知道,ueditor里有很多功能,很全面,但有时候我们的编辑器不需要太多的功能,比如前台评论或者留言,就不需要这么多功能了,那我们怎么去定制自己想要的工具呢?官方给出了两个方 ...
- bzoj 2007 [Noi2010]海拔——最小割转最短路
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2007 一个点的高度一定不是0就是1.答案一定形如一个左上角的连通块全是0的点.一个右下角的连 ...
- Spring 部署Tomcat 404 错误解决方案
将Spring项目部署到tomcat后,访问网页出现404错误 HTTP Status 404 – Not Found The origin server did not find a current ...
- ruby的代码风格
http://stylesror.github.io/ 大部分同意,有小部分,不敢苟同.
- 【转】Java 字节流与字符流的区别
字节流与和字符流的使用非常相似,两者除了操作代码上的不同之外,是否还有其他的不同呢?实际上字节流在操作时本身不会用到缓冲区(内存),是文件本身直接操作的,而字符流在操作时使用了缓冲区,通过缓冲区再操作 ...
- 七.jQuery源码解析之.toArray()
toArray()是将jQuery对象转换成数组 从源码中可以看到,这些常见的方法,都是直接从原生的 javascript中"借鉴"过来的.为什么这么说呢? 225行中,在运行时, ...
- mongodb聚合 group
MongoDB中聚合(aggregate)主要用于处理数据(诸如统计平均值,求和等),并返回计算后的数据结果.有点类似sql语句中的 count(*). 基本语法为:db.collection.agg ...
- thymeleaf 之 th:each迭代循环对象集合
thymeleaf 之 th:each迭代循环对象集合 2018年02月24日 14:32:31 阅读数:1382 th:each属性用于迭代循环,语法:th:each="obj,iterS ...
- oracle sqlplus conn 远程连接
- leetcode563
/** * Definition for a binary tree node. * public class TreeNode { * public int val; * public TreeNo ...