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

    xiaoxiao2022-12-10  53

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

    接下来查看存到硬盘上的请求信息和响应信息

    最新回复(0)