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, 0, data.Length);
            }
        }
        return request.GetResponse() as HttpWebResponse;

    }
}

调用代码:

[TestClass]
public class CouponAPIUT
{

    int _entId = 400060;
    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(1 == 1);
        }
        var dto = new APICommon.PreReceiveDTO
        {
            EntId = _entId,
            CouponCodes = list.First().CouponCode,
            LoginAccount = _loginAccount,
            BizProduct = biz.ToString(),
            OrderNo = _orderNo,
            OrderStatus = "YDZ",
            OrderAmount = 100
        };
        string targetUrl = "http://localhost:5550/CouponAPI/PreReceive"; //
        string param = JsonConvert.SerializeObject(dto);
        var response = HttpRequestAction.CreatePostHttpResponse(targetUrl, param, 10000, 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 = 0;
        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());
}
时间: 2024-08-25 22:51:30

Post方式的Http流请求调用的相关文章

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

我负责运维一个短信接口站点sms.调用上游短信供应商下发短信后,他们会给我们推送发送报告.报告是类似DELIVRD.DI:9432这样的码.为了方便识别,系统里有一个报告码与其描述的关系,一开始是写死在程序里的.这样的弊端是,后期每次添加了这个映射关系后,都要更新网站程序,增大了维护成本.为了降低维护成本,我做了改进方案.将这个映射关系保存到一个文本文件ReportCodeMapper.txt里,提供一个页面来允许修改这个文件的内容. 对于使用的逻辑,声明一个静态的Dictionary,初始化时

基于Web Service的客户端框架搭建一:C#使用Http Post方式传递Json数据字符串调用Web Service

引言 前段时间一直在做一个ERP系统,随着系统功能的完善,客户端(CS模式)变得越来越臃肿.现在想将业务逻辑层以下部分和界面层分离,使用Web Service来做.由于C#中通过直接添加引用的方来调用Web Service的方式不够灵活,故采取手动发送Http请求的方式来调用Web Service.最后选择使用Post方式来调用Web Service,至于安全性和效率暂不考虑.在学习使用的过程,遇到了很多问题,也花了很长时间来解决,网上相关的帖子很少,如果各位在使用的过程中有一些问题难以解决,可

C# 使用 HttpPost 请求调用 WebService

原文:C# 使用 HttpPost 请求调用 WebService 之前调用 WebService 都是直接添加服务引用,然后调用 WebService 方法的,最近发现还可以使用 Http 请求调用 WebService.这里还想说一句,还是 web api 的调用简单. WebService 服务端代码: public class WebServiceDemo : System.Web.Services.WebService { [WebMethod] public string Hello

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

转自 https://www.cnblogs.com/Brambling/p/7266482.html 之前调用 WebService 都是直接添加服务引用,然后调用 WebService 方法的,最近发现还可以使用 Http 请求调用 WebService.这里还想说一句,还是 web api 的调用简单. WebService 服务端代码: public class WebServiceDemo : System.Web.Services.WebService { [WebMethod] p

EzHttp 流传输调用代码示例

EzHttp框架提供的内置接口,用于文件流等传输 流传输调用代码示例 内置接口: public interface IEzStreamHandler { Task<byte[]> GetData(string id); } 服务端: EzDefaultStreamHandler.MapFile("thefilekeyabcdefg", "input.txt"); EzHttp.EzServer server = new EzHttp.EzServer()

ajax 请求调用问题

http://localhost/dev/list 和  http://127.0.0.1/dev/list 最近在架构整体常规通用系统的解决方案,遭遇AJAX请求不执行的问题,刚开始以为Spring Security权限设置那里有问题 ajax 请求调用问题: 问题情景: 在http://127.0.0.1/dev/list页面中调用了http://localhost/dev/listUser 接口,,, 使用chrome显示跨域, response for preflight is inva

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

ffmpeg强制使用TCP方式处理rtsp流,参考网上资料,得知可以使用如下命令: “ffmpeg -rtsp_transport tcp -i rtsp://admin.......” 可以是使用抓包工具进行验证一下是否强制使用了TCP方式. 参考: https://freshventure.wordpress.com/?s=ffmpeg ----------------------------------------------------------- https://freshventu

怎么在yar的server端任何地方获得client请求调用的方法

先说下碰到的问题吧:上周调查个问题发现,在rpc server端解析client上传上来的post数据,解包,找函数,执行都在Yar_Server的函数handle中执行了.没有向后面的系统或者服务传递上下文的方法.为了调查问题我们只能在函数调用里面记录哪个方法被调用了. 那么是不是可以在Yar_Server里面试着增加个静态变量保存内容,限于自身能力,现只增加了一个方法,返回了调用的method,用于server端向后面传递. 如下, 小改之后就可以通过 Yar_Server::getCall

php+ajax简单实现跨域(http+https)请求调用

当一个网站 a站 需要调用另一个网站 b站 列表文章时 比如:www.a123.com 调用 www.b456.com 文章 在 a站 建立php文件获取 b站 资源文章到本地后,再传递a站前端 在网站 b456 下Doc文件为 <ul class="ls_wz"> <li><a href="#" target="_blank" title="title1" >内容1</a>&l