httpclientpost httpclient中PostMethod和HttpPost的区别
大家好,今天我将为大家揭秘httpclientpost和httpclient中PostMethod和HttpPost的区别的奥秘,希望我的分享能给你带来新的启发和知识。
HttpClient使用指南——POST请求
1.创建一个请求客户端:HttpClients.createDefault(),用来实际发起调用post请求,可以类比成浏览器。
2.组装表单请求数据:因需要传递文件,所以通过 MultipartEntityBuilder构造器组装表单实体请求数据。
2.1设置mode为 HttpMultipartMode.RFC6532(必须);
2.2设置字符集为UTF-8(必须);
2.3通过 addBinaryBody追加文件;
2.4通过 addTextBody追加文本参数,若文本为中文则必须指定字符集为GBK或者UTF-8。
3.创建一个post请求:通过请求构造器 RequestBuilder的post方法构造一个post请求,通过 setEntity方法向post请求里放置请求参数,通过addHeader方法向post请求里追加请求头信息,请求头信息比如双方约定的token,通过build方法返回请求对象。
4.发起post请求并获得响应:通过请求客户端的execute方法执行请求并获得返回值请求响应。
5.获取响应结果:获取响应对象的实体HttpEntity,通过 EntityUtils的 toString方法将实体转成字符串,这里一般还要指定字符集,尤其是当实体里没有指定字符集时。
注意: MultipartEntityBuilder必须指定 mode为 HttpMultipartMode.RFC6532,且必须设置字符集为 UTF-8,否则若传递的文件名包含中文,则文件名乱码;对于普通的文本参数,中文指定UTF-8或者GBK接收方均未发现乱码情况;接收方需要将请求转为 MultipartHttpServetRequest方可获取到文件,示例代码如下:
httpclient发送post请求访问需要有用户名和密码的登录界面
1.服务器认证(Server Authentication)
HttpClient处理服务器认证几乎是透明的,仅需要开发人员提供登录信息(login credentials)。登录信息保存在HttpState类的实例中,可以通过 setCredentials(String realm, Credentials cred)和getCredentials(String realm)来获取或设置。
HttpClient内建的自动认证,可以通过HttpMethod类的setDoAuthentication(boolean doAuthentication)方法关闭,而且这次关闭只影响HttpMethod当前的实例。
2.代理认证(proxy authentication)
除了登录信息需单独存放以外,代理认证与服务器认证几乎一致。用 setProxyCredentials(String realm, Credentials cred)和 getProxyCredentials(String realm)设、取登录信息。
3.认证方案(authentication schemes)
是HTTP中规定最早的也是最兼容的方案,遗憾的是也是最不安全的一个方案,因为它以明码传送用户名和密码。它要求一个UsernamePasswordCredentials实例,可以指定服务器端的访问空间或采用默认的登录信息。
C#怎么使用HttpClient来Post数据
对HttpWebResponse获取的HTML进行文字编码转换,使之不会出现乱码;
自动在Session间保持Cookie,Referer等相关信息;
模拟HTML表单提交;
向服务器上传文件;
对二进制的资源,直接获取返回的字节数组(byte[]),或者保存为文件
为了解决这些问题,我开发了HttpClient类.下面是使用的方法:
获取编码转换后的字符串
HttpClient client=new HttpClient(url);
string html=client.GetString();
GetString()函数内部会查找Http Headers,以及HTML的Meta标签,试图找出获取的内容的编码信息.如果都找不到,它会使用client.DefaultEncoding,这个属性默认为utf-8,也可以手动设置.
自动保持Cookie, Referer
HttpClient client=new HttpClient(url1, null, true);
string html1=client.GetString();
client.Url=url2;
string html2=client.GetString();
这里HttpClient的第三个参数,keepContext设置为真时,HttpClient会自动记录每次交互时服务器对Cookies进行的操作,同时会以前一次请求的Url为Referer.在这个例子里,获取html2时,会把url1作为Referer,同时会向服务器传递在获取html1时服务器设置的Cookies.当然,你也可以在构造HttpClient时直接提供第一次请求要发出的Cookies与Referer:
HttpClient client=new HttpClient(url, new WebContext(cookies, referer), true);
或者,在使用过程中随时修改这些信息:
client.Context.Cookies=cookies;
client.Context.referer=referer;
模拟HTML表单提交
HttpClient client=new HttpClient(url);
client.PostingData.Add(fieldName1, filedValue1);
client.PostingData.Add(fieldName2, fieldValue2);
string html=client.GetString();
上面的代码相当于提交了一个有两个input的表单.在PostingData非空,或者附加了要上传的文件时(请看下面的上传和文件), HttpClient会自动把HttpVerb改成POST,并将相应的信息附加到Request上.
向服务器上传文件
HttpClient client=new HttpClient(url);
client.AttachFile(fileName, fieldName);
client.AttachFile(byteArray, fileName, fieldName);
string html=client.GetString();
这里面的fieldName相当于<input type="file" name="fieldName"/>里的fieldName. fileName当然就是你想要上传的文件路径了.你也可以直接提供一个byte[]作为文件内容,但即使如此,你也必须提供一个文件名,以满足HTTP规范的要求.
不同的返回形式
字符串: string html= client.GetString();
流: Stream stream= client.GetStream();
字节数组: byte[] data= client.GetBytes();
保存到文件: client.SaveAsFile(fileName);
或者,你也可以直接操作HttpWebResponse: HttpWebResponse res= client.GetResponse();
每调用一次上述任何一个方法,都会导致发出一个HTTP Request,也就是说,你不能同时得到某个Response的两种返回形式.
另外,调用后它们任意一个之后,你可以通过client.ResponseHeaders来获取服务器返回的HTTP头.
下载资源的指定部分(用于断点续传,多线程下载)
HttpClient client=new HttpClient(url);
//发出HEAD请求,获取资源长度
int length=client.HeadContentLength();
//只获取后一半内容
client.StartPoint=length/2;
byte[] data=client.GetBytes();
HeadContentLength()只会发出HTTP HEAD请求.根据HTTP协议, HEAD与GET的作用等同,但是,只返回HTTP头,而不返回资源主体内容.也就是说,用这个方法,你没法获取一个需要通过POST才能得到的资源的长度,如果你确实有这样的需求,建议你可以通过GetResponse(),然后从ResponseHeader里获取Content-Length.
httpclient中PostMethod和HttpPost的区别
1.服务器认证(Server Authentication)
HttpClient处理服务器认证几乎是透明的,仅需要开发人员提供登录信息(login credentials)。登录信息保存在HttpState类的实例中,可以通过 setCredentials(String realm, Credentials cred)和getCredentials(String realm)来获取或设置。
HttpClient内建的自动认证,可以通过HttpMethod类的setDoAuthentication(boolean doAuthentication)方法关闭,而且这次关闭只影响HttpMethod当前的实例。
2.代理认证(proxy authentication)
除了登录信息需单独存放以外,代理认证与服务器认证几乎一致。用 setProxyCredentials(String realm, Credentials cred)和 getProxyCredentials(String realm)设、取登录信息。
3.认证方案(authentication schemes)
是HTTP中规定最早的也是最兼容的方案,遗憾的是也是最不安全的一个方案,因为它以明码传送用户名和密码。它要求一个UsernamePasswordCredentials实例,可以指定服务器端的访问空间或采用默认的登录信息。
关于httpclientpost,httpclient中PostMethod和HttpPost的区别的介绍到此结束,希望对大家有所帮助。