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 ...
随机推荐
- Python3 升级pip
(Windows) 用 pip install --Upgrade pip进行自升级不成功,执行至卸载完再安装时出错,最后还是用get_pip.py解决了!
- css让元素居中显示
通常在absolute之后, 想让元素居中,都会采用margin-top:-[元素高度的一半]和 margin-left:-[元素宽度的一半] , 但是当我们的元素宽高不是固定的时候, 这就难办了, ...
- [fortify] 不安全的函数eregi()
PHP 5.4/5.3弃用函数eregi() memory_limit绕过漏洞 [日期:2012-04-02] 来源:Linux社区 作者:Linux [字体:大 中 小] 发布日期:2012- ...
- 简单的css js控制table隔行变色
(1)用expression 鼠标滑过变色: <style type="text/css"><!-- table { background-color:#0000 ...
- 最新基于adt-bundle-windows-x86的android开发环境筹建
最新基于adt-bundle-windows-x86的android开发环境搭建 某系统要配套做一个android客户端,来一次android开发环境快速搭建,系统Win7,具体步骤如下: 1.下载j ...
- Centos7.2 yum配置
一.yum 简介 yum,是Yellow dog Updater, Modified 的简称,是杜克大学为了提高RPM 软件包安装性而开发的一种软件包管理器.起初是由yellow dog 这一发行版的 ...
- JAVA/Android Map与String的转换方法
在Android开发中 Map与String的转换在,在一些需求中经常用到,使用net.sf.json.JSONObject.fromObject可以方便的将string转为Map.但需要导入jar包 ...
- 关于 某编译错误: This function or variable may be unsafe. Consider using strcat_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS.
每次当八月在VS2013里使用strcat的时候,基本上都会出现这个问题╮(╯▽╰)╭ 原因貌似是因为安全问题(⊙o⊙) 于是,解决方法如下: ①更改预处理定义: (这也是八月最常用的方法了,虽然貌似 ...
- Pair Project:电梯控制程序
12061160刘垚鹏 & 12061166宋天舒 1.1结对编程的优缺点结对编程相对于个人编程有很多优点.首先,督促作用,在讨论过程中能够很快投入工作,为了不耽误对方时间,我们会尽快完成各自 ...
- SpringMVC入门配置和简单实现
web.xml的配置 <!-- springmvc中央控制器 --> <servlet> <servlet-name>springmvc</servlet-n ...