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 ...
随机推荐
- Windows下 maven3.3.1的安装步骤+maven配置本地仓库
简单讲下maven的安装步骤: 1.在安装maven之前,先确保已经安装JDK1.6及以上版本,并且配置好环境变量. 2.下载maven3,最新版本是Maven3.3.1 ,下载地址:http://m ...
- windows下nginx的启动关闭
Windows下Nginx的启动.停止等命令 在Windows下使用Nginx,我们需要掌握一些基本的操作命令,比如:启动.停止Nginx服务,重新载入Nginx等,下面我就进行一些简单的介绍. .启 ...
- IAR FOR ARM的安装及破解
本博文主要是介绍如何安装以及破解IAR FOR ARM . 1.下载IAR FOR ARM以及注册机 IAR FOR ARM下载:http://pan.baidu.com/s/1i5t1qF7 注册机 ...
- Java NIO 之缓冲区
缓冲区基础 所有的缓冲区都具有四个属性来 供关于其所包含的数据元素的信息. capacity(容量):缓冲区能够容纳数据的最大值,创建缓冲区后不能改变. limit(上界):缓冲区的第一个不能被读或写 ...
- some tips learn from work experience
1.you can't avoid office politics 2.you'll never have a job which you "can't quit" - if yo ...
- Python操控mysql数据库
导入库——MySQLdb 1.链接MySQL conn=MySQL.connect(host=',port=3306) 此处主机用ip地址,不能使用'localhost',不然会显示链接错误. 2.选 ...
- jquery 传递事件的自定义数据
整理一下 1. <script type="text/javascript">$(document).ready(function(){ $("input& ...
- JavaWeb 命名规则
命名规范命名规范命名规范命名规范 本规范主要针对java开发制定的规范项目命名项目命名项目命名项目命名 项目创建,名称所有字母均小写,组合方式为:com.company.projectName.com ...
- windows 录音程序(二)
(二)录音流程 Waveform APIs,流程如下: a.打开录音设备waveInOpen; b.准备wave数据头waveInPrepareHeader; c.准备数据块waveInAddBuff ...
- 【转】使用Fiddler进行HTTP断点调试。
这是Fiddler又一强大和实用的工具之一.通过设置断点,Fiddler可以做到: 1. 修改HTTP请求头信息.例如修改请求头的UA, Cookie, Referer 信息,通过“伪造”相应信息达到 ...