C#后台向接口发起http请求

之前写过使用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 不一定是我给出的这个端口,读者根据自己生成的站点端口做修改,接下来看下客户端的界面,点击这个按钮
在这里插入图片描述
在这里插入图片描述

接下来查看存到硬盘上的请求信息和响应信息
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值