之前写过使用Ajax向后台接口发起http请求,这是前端向后台获取数据的一种方式。另外有从后台向接口发起http请求的方式,应用的也是比较多的。简单的说就是某个业务可能需要多个服务器交互才能完成的场景。
比如有A,B,C和D这4台服务器,现在A和B有一个业务需要对接,并涉及到线上支付的服务,但A和B没有线上支付业务。这里D服务器完成了线上支付的业务功能(假设就是支付宝)并与C服务器长时间合作了。只要C服务器得到D服务器的授权,那么C服务器就可以接入其他的需要线上支付功能的客户资源。相对的,接入C服务器的价格也会比D服务器便宜。接下来就是A,B,C3台服务器对接了。流程应该是这样。A这里可以是一个Ajax向自己的后台接口发起请求,也可以是一个表单提交
业务背景大概就是这样,现在着手去简单的实现这样一个流程,有些信息会记录到磁盘中,文件写入相关的资料在笔者的其他博客有相关介绍https://blog.csdn.net/listennerBGM/article/details/90480942
(1)打开2个visual stdio,创建2个webForm站点
(2)一个站点新建一个aspx程序,这是客户端,代码如下
WebForm1.aspx代码如下
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1.aspx.cs" Inherits="WebTest2.WebForm1" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title></title>
</head>
<body>
<form id="form1" runat="server">
<div>
<input type="submit" value="提交请求"/><br />
<label>响应结果:</label><br />
<asp:Label ID="label" runat="server"></asp:Label><br />
</div>
</form>
</body>
</html>
WebForm1.aspx.cs代码如下
public partial class WebForm1 : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if(IsPostBack)
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://localhost:55481/apppay.ashx");
request.ServicePoint.Expect100Continue = false;
request.Method = "POST";
request.KeepAlive = true;
//request.Timeout = 1000;
request.ContentType = "application/x-www-form-urlencoded;charset=UTF-8";//对应服务端Response.ContentType,必须设置,否则服务端获取不到请求数据
request.Referer = "http://localhost:8080/webform.aspx";//对应服务端Response.UrlReferrer,若不设置,服务端端获取为null
request.Accept = "text/html,application/json,image/jpeg";//对应服务端Response.AcceptType,若不设置,服务器端获取为null
request.UserAgent = "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1;)";//对应服务端Response.UserAgent,若不设置,服务器端获取为null
string postData = "data={\"orderid\":\"PTB012345\",\"orderuid\":\"30001\",\"price\":\"100\"}";
//组织请求数据
byte[] bytePostData = Encoding.GetEncoding("UTF-8").GetBytes(postData);
//写入请求数据
Stream requestStream = request.GetRequestStream();
requestStream.Write(bytePostData, 0, bytePostData.Length);
requestStream.Close();
//获取响应数据
HttpWebResponse rsp = (HttpWebResponse)request.GetResponse();
// 以字符流的方式读取HTTP响应
Stream stream = rsp.GetResponseStream();
StreamReader streamReader = new StreamReader(stream);
StringBuilder result = new StringBuilder();
int ch = -1;
while ((ch = streamReader.Read()) > -1)
{
// 过滤结束符
char c = (char)ch;
if (c != '\0')
{
result.Append(c);
}
}
label.Text = result.ToString();
//将响应信息写入磁盘
FileStream file=File.Open("D:\\responseHttp.txt", FileMode.OpenOrCreate);
StreamWriter sw = new StreamWriter(file);
for(int i=0; i<rsp.Headers.Count;i++)
{
sw.WriteLine(rsp.Headers.GetKey(i) + ":" + rsp.Headers[i]);
}
sw.Close();
file.Close();
}
}
}
(3)另一个站点新建一个aspx页面,什么都不用写,用于正常启动网站,创建一个ashx文件,这是服务端
AppPay.ashx.cs代码如下
public class AppPay : IHttpHandler
{
public void ProcessRequest(HttpContext context)
{
//为了方便调试,将客户端的一些信息输出到文本文件中
context.Request.SaveAs("D:\\requestHttp.txt", true);
//设置响应的数据格式为json
//注意:这只是告诉客户端,服务器返回的是json格式的数据,但并不强制服务端返回json格式数据
//但客户端可能会因为服务器的数据返回格式而错误的解析出现异常
context.Response.ContentType = "application/json";
string data;
if(context.Request.HttpMethod=="GET")
{
data = context.Request.QueryString["data"];
}
else
{
data = context.Request.Form["data"];
}
//这里就不做相关处理了,直接返回结果
context.Response.Write(data);
}
public bool IsReusable
{
get
{
return false;
}
}
}
(4)启动2个网站,尤其注意服务端的IP地址,http://localhost:55481/apppay.ashx 不一定是我给出的这个端口,读者根据自己生成的站点端口做修改,接下来看下客户端的界面,点击这个按钮
接下来查看存到硬盘上的请求信息和响应信息