C#实现Http通信

前言

最近一直在做C# winform客户端项目,因为涉及到和服务器交互,所以研究了一下C#的HTTP网络编程。

Http通信是通过Http请求报文和Http应答报文来实现的。

由于我开发的是客户端,所以主要工作就在于封装Http请求报文,以及收到应答报文后解析数据。

Http请求报文是什么样的

如果你使用的是chrome浏览器,按F12就可以开启调试模式。现在主流的浏览器应该都支持这个功能。随便打开一个网页,触发一个超链接请求,应该就能抓取到Http请求报文。

举个例子,以下是一个Http请求报文的截取内容。

我们可以看到请求报文中有很多参数,这里不一一详解各个参数的意义。

C#中实现Http请求

我个人认为,发送Http请求报文主要有四个步骤

1.       初始化HttpWebRequest(需要引用System.Net)

2.       封装Http cookie

3.       封装Http报文头

4.       封装请求内容,并将封装好的请求报文用Stream类写入流(需要引用System.IO

5.       接收应答报文

接下来,我们一步一步来讲解如何在C#中完成Http请求报文的封装。

初始化HttpWebRequest

使用请求地址作为参数,初始化一个HttpWebRequest实例。

// 初始化HttpWebRequest
HttpWebRequest httpRequest = (HttpWebRequest)HttpWebRequest.Create(strRequestUri);

封装Http cookie

首先,简单说明一下Cookie。有时也用其复数形式Cookies,指某些网站为了辨别用户身份、进行session跟踪而储存在用户本地终端上的数据(通常经过加密)。本文为了示例,就以比较简单的形式展现。

在C#中,使用Cookie类来封装cookie,以键值对的形式保存。

然后,将这个封装好的cookie添加到CookieContainer容器中,最后填入HttpWebRequest。既然是容器,顾名思义,可以添加多个cookie。

// 封装Cookie
Uri uri = new Uri(strRequestUri);
Cookie cookie = new Cookie("Name", strCookie); // 设置key、value形式的Cookie
CookieContainer cookies = new CookieContainer();
cookies.Add(uri, cookie);
httpRequest.CookieContainer = cookies;

封装Http Header

根据自己要发送的请求报文类型来填充Http报文头。

以下是一个简单范例:

// 封装Http Header
httpRequest.Method = "Post";
httpRequest.Referer = strReferer;
httpRequest.UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.89 Safari/537.36";
httpRequest.Accept = "text/plain, */*; q=0.01";
httpRequest.ContentType = "application/x-www-form-urlencoded; charset=UTF-8";
httpRequest.Timeout = 1000 * 30;
httpRequest.KeepAlive = true;

填充Http content,并写入流

首先,将要写入的内容转为byte数组(假设是文本内容)。将数组长度填入HttpWebRequest的ContentLength字段。

通过GetRequestStream()获取HttpWebRequest的请求流。使用这个流对象写入数组内容。

最后,千万不要忘记关闭流。本人在开发C#客户端和Java服务器交互过程中,就遇到这个问题。由于忘记关闭流,Java服务器在解析请求报文时,总是提示不能识别流的结尾。

// 通过流写入请求数据
byte[] bytes = System.Text.Encoding.UTF8.GetBytes(strContent); // 编码形式按照个人需求来设置
httpRequest.ContentLength = bytes.Length;
Stream requestStream = httpRequest.GetRequestStream();
requestStream.Write(bytes, 0, bytes.Length);
requestStream.Close(); // 不要忘记关闭流

获得应答报文

通过流将请求报文发出去后,可以通过HttpWebRequest的GetResponse()方法来获取HttpWebResponse

// 获得应答报文
HttpWebResponse httpResponse = (HttpWebResponse)httpRequest.GetResponse();
Stream responseStream = httpResponse.GetResponseStream();
StreamReader reader = new StreamReader(responseStream, System.Text.Encoding.UTF8);
string strResponse = reader.ReadToEnd();
reader.Close();
responseStream.Close();

至此,Http请求过程结束。大家有疑问的地方,欢迎和我探讨。

过两天,我再整理一下上传文件的 Http方法。

附上完整方法

时间: 2024-10-10 20:01:07

C#实现Http通信的相关文章

Java网络编程之tcp的socket通信

1.客户端MyClient.java 1 import java.io.*; 2 import java.net.*; 3 4 public class MyClient 5 { 6 public static void main(String[] args)throws Exception 7 { 8 Socket s = new Socket("192.168.1.1" , 30000); 9 // 客户端启动ClientThread线程不断读取来自服务器的数据 10 new Th

Android实现组件之间同步的回调通信

Android开发中,有时会遇到组件之间相互通信回调的问题.一般都是通过Android提供的ResultReceiver来实现(ResultReceiver的使用方法很简单,这里就不多提了). 但之前在工作中,遇到了一个组件间回调的问题,ResultReceiver无法满足需求.简单描述一下问题:service中打开了一个activity,activity需要将一个变量值回调给service,而且这个回调必须是同步的.也就是说activity在确认service接收到了这个变量值后,才能继续向下

Java多线程编程核心技术读书笔记(3)-线程通信

线程是操作系统中独立的个体,但是这些个体如果无法经过特殊的处理就不能成为一个整体.线程间通信可以实现线程间的信息互换.相互唤起等功能,是系统的交互性更加强大,大大提高CPU的利用率,同时还能让开发者对各个线程任务有清晰的把控和监督,最常用的线程通信方法就是--等待/通知机制. 一.等待/通知机制 1.wait() / notify() 等待/通知机制在生活中比比皆是,例如:厨师/服务员的菜品传递台.生产者/消费者模式,JDK中通过Object里面的两个方法 wait() / notify() 来

Android-Messenger跨进程通信

http://blog.csdn.net/lmj623565791/article/details/47017485 一.概述 我们可以在客户端发送一个Message给服务端,在服务端的handler中会接收到客户端的消息,然后进行对应的处理,处理完成后,再将结果等数据封装成Message,发送给客户端,客户端的handler中会接收到处理的结果. 有这么几个特点: 基于Message,相信大家都很熟悉 支持回调的方式,也就是服务端处理完成长任务可以和客户端交互 不需要编写aidl文件 此外,还

Vue2.0与 [百度地图] 结合使用———vue+webpack+axios+百度地图实现组件之间的通信

Vue2.0与 [百度地图] 结合使用: 1.vue init webpack-simple vue-baidu-map 2.下载axios cnpm install axios; 3.在main.js中引入axios,并使用 import axios from 'axios' /* 把axios对象挂到Vue实例上面,其他组件在使用axios的时候直接 this.$http就可以了 */ Vue.prototype.$http = axios; 4.引入百度地图的js秘钥--->最好在inde

第七课 进程通信

unix_c_07.txt================第七课 进程通信================一.基本概念------------1. 何为进程间通信~~~~~~~~~~~~~~~~~进程间通信(Interprocess Communication, IPC)是指两个,或多个进程之间进行数据交换的过程.2. 进程间通信分类~~~~~~~~~~~~~~~~~1) 简单进程间通信:命令行参数.环境变量.信号.文件.2) 传统进程间通信:管道(fifo/pipe).3) XSI进程间通信:

线程之间的通信

1.1.线程之间的通信方法 多个线程在处理统一资源,但是任务却不同,这时候就需要线程间通信.    等待/唤醒机制涉及的方法:    1. wait():让线程处于冻结状态,被wait的线程会被存储到线程池中.    2. notify():唤醒线程池中的一个线程(任何一个都有可能).    3. notifyAll():唤醒线程池中的所有线程.  备注    1.这些方法都必须定义在同步中,因为这些方法是用于操作线程状态的方法.    2.必须要明确到底操作的是哪个锁上的线程!    3.wa

三层交换机的路由功能实现VALN间通信

交换机是交换数据,只能识别MAC地址,而交换机可以转发数据包,能够识别IP地址,所以能够转发数据包.而三层交换机的也有路由功能,所以也能转发数据包.今天这堂课就有三层交换机实现不同vlan间通信来加以验证. 器材:三层交换机一台,二层交换机一台.电脑三台,带水晶头双绞线若干. 原理图: 过程: 1:连线,把PC1,PC2分别连到三层交换机的fa0/1,fa0/6.把PC3连到二层交换机fa0/1.再用一根线一端连到二层交换机的fa0/10,另一端连到三层交换机fa0/10. 2:对交换机进行配置

集群通信应用开发吐槽(2014年)

在集群通信行业两家公司开发PC应用六年了,但在对开发的理解的道路上感觉还是挺孤独的,于是想写点东西发泄下郁闷,没想到只想了一两小时就写了几十条提纲.好话说在前面,文中的提到的现象可能不全面,甚至是误会的,文中的观点更是需要审视的看待. 产品越复杂(越多硬件)越能卖出好价钱 产品便携易用,越能解决客户问题,越给客户创造价值,才越值钱.产品成本和产品价值没有直接关系,iphone的成本如果只有1元钱,就没人花45千买了? 性能问题需要测试数据来证明 在讨论某个功能的整体设计时,做嵌入式开发的常常随意

Linux下的进程通信方式(IPC)——管道通信

Unix IPC: 管道.命名管道(FIFO)      管道 1.概念 管道是单向的(半双工).先进先出.无结构的字节流,它把一个进程的输出和另一个进程的输入连接在一起. 写进程在管道的尾端写入数据,读进程在管道的首端读出数据.数据读出后将从管道中移走,其它读进程都不能再读到这些数据. 管道提供了简单的流控制机制.进程试图读一个空管道时,在数据写入管道前,进程将一直阻塞.同样,管道已经满时,进程再试图写管道,在其它进程从管道中读走数据之前,写进程将一直阻塞. 2.管道的特点 (1)单向数据通信