Post方式的Http流请求调用
HttpRequest公共类:
public static class HttpRequestAction
{
/// <summary>
/// 发送http请求并返回响应
/// </summary>
/// <param name="url">请求目标</param>
/// <param name="parameters">参数</param>
/// <param name="timeout">过期时间</param>
/// <param name="userAgent">用户地址IP</param>
/// <param name="requestEncoding">请求编码</param>
/// <param name="cookies"是否带有cookie></param>
/// <returns>返回响应对象</returns>
public static HttpWebResponse CreatePostHttpResponse(string url, string parameters, int? timeout, string userAgent, Encoding requestEncoding, CookieCollection cookies)
{
if (string.IsNullOrEmpty(url))
{
throw new ArgumentNullException("url");
}
if (requestEncoding == null)
{
throw new ArgumentNullException("requestEncoding");
}
HttpWebRequest request = null;
//如果是发送HTTPS请求
if (url.StartsWith("https", StringComparison.OrdinalIgnoreCase))
{
ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(CheckValidationResult);
request = WebRequest.Create(url) as HttpWebRequest;
request.ProtocolVersion = HttpVersion.Version10;
}
else
{
request = WebRequest.Create(url) as HttpWebRequest;
}
request.Method = "POST";
request.ContentType = "application/json;charset=utf-8";
if (timeout.HasValue)
{
request.Timeout = timeout.Value;
}
if (cookies != null)
{
request.CookieContainer = new CookieContainer();
request.CookieContainer.Add(cookies);
}
//如果需要POST数据
if (parameters != null)
{
StringBuilder buffer = new StringBuilder();
buffer.Append(parameters);
byte[] data = requestEncoding.GetBytes(buffer.ToString());
using (Stream stream = request.GetRequestStream())
{
stream.Write(data, , data.Length);
}
}
return request.GetResponse() as HttpWebResponse; }
}
客户端调用代码:
[TestClass]
public class CouponAPIUT
{ int _entId = ;
string _loginAccount = "test";
string _orderNo = "testorderno";
SysEnums.BizProduct biz = SysEnums.BizProduct.DAT; [TestMethod]
public void PreReceive()
{
var list = CouponAPIServiceUT.GetReceivableCouponsForTest();
if (list == null || !list.Any())
{
Assert.IsFalse( == );
}
var dto = new APICommon.PreReceiveDTO
{
EntId = _entId,
CouponCodes = list.First().CouponCode,
LoginAccount = _loginAccount,
BizProduct = biz.ToString(),
OrderNo = _orderNo,
OrderStatus = "YDZ",
OrderAmount =
};
string targetUrl = "http://localhost:5550/CouponAPI/PreReceive"; //
string param = JsonConvert.SerializeObject(dto);
var response = HttpRequestAction.CreatePostHttpResponse(targetUrl, param, , null, Encoding.UTF8, null);
var responseStream = response.GetResponseStream();
StreamReader readerStream = new StreamReader(response.GetResponseStream());
string result = readerStream.ReadToEnd();
readerStream.Close();
}
}
以mvc web应用程序为例,服务端的接口Action用[HttpPost]标记(直接在ie里访问http://localhost:5550/CouponAPI/PreReceive是会报404的)。其声明及获取数据的方式有两种:
方式一,不声明参数,通过Request.InputStream得到请求的参数:
[HttpPost]
public ActionResult PreReceive()
{
LogHelper.Write("接口被访问:" + Request.Url);
try
{
APICommon.PreReceiveDTO dto = GetDtoFromRequestStream<APICommon.PreReceiveDTO>(Request.InputStream);
var response = recAPI.PreReceive(dto); // 调用BLL层逻辑
return Content(response.ToString());
}
catch (ResponseErrorException ex)
{
var m = new ResponseModel(false, ex.Message);
return Content(m.ToString());
}
} public static T GetDtoFromRequestStream<T>(Stream stream) where T : class
{
using (StreamReader readerStream = new StreamReader(stream))
{
string result = readerStream.ReadToEnd();
LogHelper.Write("从流中得到的消息为:" + result);
return JsonConvert.DeserializeObject<T>(result); }
}
方式二,显式声明参数,程序里即可直接取参数的值:
[HttpPost]
public ActionResult PreReceive(int entId, string CouponCodes, string LoginAccount, string bizProduct, string orderNo, string orderStatus, string orderAmount)
{
LogHelper.Write("接口被访问:" + Request.Url);
var response = new ResponseModel(false);
try
{
decimal amt = ;
if (!string.IsNullOrEmpty(orderAmount))
{
decimal.TryParse(orderAmount, out amt);
}
var dto = new APICommon.PreReceiveDTO
{
EntId = entId,
CouponCodes = CouponCodes,
LoginAccount = LoginAccount,
BizProduct = bizProduct,
OrderNo = orderNo,
OrderStatus = orderStatus,
OrderAmount = amt
};
response = recAPI.PreReceive(dto); // 调用BLL层逻辑
}
catch (ResponseErrorException ex)
{
LogHelper.Write("执行逻辑返回:{0}", ex.Message);
response = new ResponseModel(false, ex.Message);
}
catch (Exception ex)
{
LogHelper.Write("捕获到异常:{0}", ex.Message);
response = new ResponseModel(false, ex.Message); }
return Content(response.ToString());
}
▄︻┻┳═一tomcat与jetty接收请求参数的区别
▄︻┻┳═一比较两种方式的form请求提交
▄︻┻┳═一Post方式的Http流请求调用
Post方式的Http流请求调用的更多相关文章
- http流请求时,被请求站点HttpContext.Current为null?
我负责运维一个短信接口站点sms.调用上游短信供应商下发短信后,他们会给我们推送发送报告.报告是类似DELIVRD.DI:9432这样的码.为了方便识别,系统里有一个报告码与其描述的关系,一开始是写死 ...
- C# 使用 HttpPost 请求调用 WebService
之前调用 WebService 都是直接添加服务引用,然后调用 WebService 方法的,最近发现还可以使用 Http 请求调用 WebService.这里还想说一句,还是 web api 的调用 ...
- C# 使用 HttpPost 请求调用 WebService (转)
转自 https://www.cnblogs.com/Brambling/p/7266482.html 之前调用 WebService 都是直接添加服务引用,然后调用 WebService 方法的,最 ...
- 小D课堂 - 新版本微服务springcloud+Docker教程_4-05 微服务调用方式之feign 实战 订单调用商品服务
笔记 5.微服务调用方式之feign 实战 订单调用商品服务 简介:改造电商项目 订单服务 调用商品服务获取商品信息 Feign: 伪RPC客户端(本质还是用http) ...
- 小D课堂 - 新版本微服务springcloud+Docker教程_4-02 微服务调用方式之ribbon实战 订单调用商品服务
笔记 2.微服务调用方式之ribbon实战 订单调用商品服务 简介:实战电商项目 订单服务 调用商品服务获取商品信息 1.创建order_service项目 2 ...
- android中用get和post方式向服务器提交请求
通过get和post方式向服务器发送请求首先说一下get和post的区别get请求方式是将提交的参数拼接在url地址后面,例如http://www.baidu.com/index.jsp?num=23 ...
- EzHttp 流传输调用代码示例
EzHttp框架提供的内置接口,用于文件流等传输 流传输调用代码示例 内置接口: public interface IEzStreamHandler { Task<byte[]> GetD ...
- ffmpeg强制使用TCP方式读取rtsp流
ffmpeg强制使用TCP方式处理rtsp流,参考网上资料,得知可以使用如下命令: “ffmpeg -rtsp_transport tcp -i rtsp://admin.......” 可以是使用抓 ...
- ajax 请求调用问题
http://localhost/dev/list 和 http://127.0.0.1/dev/list 最近在架构整体常规通用系统的解决方案,遭遇AJAX请求不执行的问题,刚开始以为Spring ...
随机推荐
- SQl server 关于重复插入数据的测试
最近发布的脚本,有那种防止重复插入数据(包括存在时更新,不存在是插入的处理,判断的方向可能与下面的示例相反) 使用类似下面的 SQL declare @id int, @value int if no ...
- javascript 日期转换为中文
function CNDateString(date) { var cn = ["〇","一","二","三",&quo ...
- 编译 wxWidgets-3.0.2 on Mac OS X Yosemite 出错?!的解决方法
tar -zxf wxWidgets-3.0.2.tar.bz2 //解压 //三部走 ./configure ./make 提示webKit出错 原因:有人偷懒,没试编译就发布了. 解决:找到. ...
- jquery中是否加()的问题
自己总结的,慢慢修改再: 1带上()代表立即执行 去掉()代表当有事件发生的时候,我再执行
- 为什么我坚持学习C语言?
c语言令无数人头疼,有意躲避! linux操作系统有c: glibc的c运行时库有c: mysql有c: php的底层有c: nosql层有c: 甚至其他的curl.nginx等等都有c: 每当问题追 ...
- centos 7安装配置bind
环境: 三台虚拟机,全部安装Centos 7, tony4.hadoop.com 192.168.31.223 tony5.hadoop.com 192.168.31.224 tony6.hadoop ...
- Cauchy 级数浓缩判别法
- Django提交POST表单“CSRF verification failed. Request aborted”问题的解决
1.环境 python 3.4 Django 1.7 Visual Studio 2015 PTVS 2.问题 提交表单,出现以下错误: CSRF verification failed. Reque ...
- java嵌套类
java有四种嵌套类: 静态内部类,成员内部类,局部内部类,匿名内部类 1)静态内部类: (1)类的申明加上staitc关键字.一般用public修饰 (2)只能访问外部类的静态变量和静态方法.不能访 ...
- 强大的swift字符串
Swift集百家之长,吸收了主流语言java,c,c++等的好的特性,所以它功能十分强大,今天我们就来看看它强大的字符串. 首先,我们带着这样几个问题去了解.理解swift的字符串. 1.swift字 ...