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流请求调用的更多相关文章

  1. http流请求时,被请求站点HttpContext.Current为null?

    我负责运维一个短信接口站点sms.调用上游短信供应商下发短信后,他们会给我们推送发送报告.报告是类似DELIVRD.DI:9432这样的码.为了方便识别,系统里有一个报告码与其描述的关系,一开始是写死 ...

  2. C# 使用 HttpPost 请求调用 WebService

    之前调用 WebService 都是直接添加服务引用,然后调用 WebService 方法的,最近发现还可以使用 Http 请求调用 WebService.这里还想说一句,还是 web api 的调用 ...

  3. C# 使用 HttpPost 请求调用 WebService (转)

    转自 https://www.cnblogs.com/Brambling/p/7266482.html 之前调用 WebService 都是直接添加服务引用,然后调用 WebService 方法的,最 ...

  4. 小D课堂 - 新版本微服务springcloud+Docker教程_4-05 微服务调用方式之feign 实战 订单调用商品服务

    笔记 5.微服务调用方式之feign 实战 订单调用商品服务     简介:改造电商项目 订单服务 调用商品服务获取商品信息         Feign: 伪RPC客户端(本质还是用http)    ...

  5. 小D课堂 - 新版本微服务springcloud+Docker教程_4-02 微服务调用方式之ribbon实战 订单调用商品服务

    笔记 2.微服务调用方式之ribbon实战 订单调用商品服务     简介:实战电商项目 订单服务 调用商品服务获取商品信息         1.创建order_service项目         2 ...

  6. android中用get和post方式向服务器提交请求

    通过get和post方式向服务器发送请求首先说一下get和post的区别get请求方式是将提交的参数拼接在url地址后面,例如http://www.baidu.com/index.jsp?num=23 ...

  7. EzHttp 流传输调用代码示例

    EzHttp框架提供的内置接口,用于文件流等传输 流传输调用代码示例 内置接口: public interface IEzStreamHandler { Task<byte[]> GetD ...

  8. ffmpeg强制使用TCP方式读取rtsp流

    ffmpeg强制使用TCP方式处理rtsp流,参考网上资料,得知可以使用如下命令: “ffmpeg -rtsp_transport tcp -i rtsp://admin.......” 可以是使用抓 ...

  9. ajax 请求调用问题

    http://localhost/dev/list 和  http://127.0.0.1/dev/list 最近在架构整体常规通用系统的解决方案,遭遇AJAX请求不执行的问题,刚开始以为Spring ...

随机推荐

  1. Process 执行shell 脚本

    概述: Process类是一个抽象类(所有的方法均是抽象的),封装了一个进程(即一个执行程序). Process 类提供了执行从进程输入.执行输出到进程.等待进程完成.检查进程的退出状态以及销毁(杀掉 ...

  2. 【转】MySQL的各种timeout

    因为最近遇到一些超时的问题,正好就把所有的timeout参数都理一遍,首先数据库里查一下看有哪些超时: root@localhost : test 12:55:50> show global v ...

  3. 三大基础排序算法BubbleSort、SelectSort、InsertSort

    public class Strategy { public static void main(String[] args) { int [] array=new int[]{26,25,15,42, ...

  4. SQL Server简洁查询正在运行的进程SQL

    通常我们可以使用 sp_who2 我们希望更加简洁的信息,下面这个查询使用系统表sys.sysprocesses,以及sys.dm_exec_sql_text做OUTER APPLY. T-SQL是这 ...

  5. Java程序,取随机数的两种实现方法

    1.随机数的第一种程序(取0-9的整型随机数) public class random_1 { public static void main(String[] args) { Random r=ne ...

  6. 【Visual Lisp】人机交互与数据处理(表除外)-lisp

    ;;本专题所讲述的内容是人机交互以及常规数据处理技术;;★★★01.人机交互★★★;;△△△键盘输入交互△△△(getint "请输入整数");;从键盘输入整数,如果不是整数则重复 ...

  7. React Native填坑之旅--与Native通信之iOS篇

    终于开始新一篇的填坑之旅了.RN厉害的一个地方就是RN可以和Native组件通信.这个Native组件包括native的库和自定义视图,我们今天主要设计的内容是native库方面的只是.自定义视图的使 ...

  8. 关于java8 interface的default方法

    转自鸟窝 博主写的挺详细,不了解的看一看啊 以前经常谈论的Java对比c++的一个优势是Java中没有多继承的问题. 因为Java中子类只能继承(extends)单个父类, 尽管可以实现(implem ...

  9. [Java基础]字符串

    1.字符串特点 字符串是常量,创建之后不能修改: 字符串的内容一旦修改,就会马上创建一个新的对象: 字符串实际为一个char value[]={'a','a'};数组: 2.==与equal判断字符串 ...

  10. 多线程NSInvocationOperation(NSOperationQueue)的基本用法

        #import "ViewController.h" @interface ViewController () @end @implementation ViewContr ...