当前位置 : 主页 > 编程语言 > java >

Post方式的Http流请求调用

来源:互联网 收集:自由互联 发布时间:2022-07-07
HttpRequest公共类: public static class HttpRequestAction { /// summary /// 发送http请求并返回响应 /// /summary /// param name="url"请求目标/param /// param name="parameters"参数/param /// param name="timeout"过期时间

 

HttpRequest公共类:

Post方式的Http流请求调用_json

Post方式的Http流请求调用_数据_02

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;

}
}

View Code

 

客户端调用代码:

[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();
}
}

View Code

 

以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());
}

 

 

 

网友评论