C#使用POST调用接口


一、C#调用接口的三种方式

1、HttpWebRequest

HttpWebRequest类是位于System.Net命名空间下的类。对于Http请求来说功能非常齐全,能够设置Http请求中的各种信息。例如TimeOut响应时间,Header请求头信息等。该类需要与HttpWebResponse类联合使用,HttpWebResponse类也是位于System.Net命名空间下的类,用于获取HttpWebRequest类请求结果。

2、WebClient

WebClient类也是位于System.Net命名空间下的类,但是一种更高级的抽象类,相当于是HttpWebRequest将一些通用的简单的请求封装起来。所以WebClient无法设置响应时间,Header等信息。但同理WebClient使用起来非常简单,代码量少。

3、HttpClient

HttpClient类是位于System.Net.Http命名空间的类,是.Net4.5才引入的一个类。该类相比以上所述的类,优势在于多次请求,设置一次请求头信息即可。还有比较适合异步请求,HttpClient通常使用单例模式,因为HttpClient首次创建较慢,所以不适合使用New创建。

二、所遇问题

HttpWebRequest

HttpWebRequest的POST请求的类型通常有application/x-www-form-urlencoded、application/json、multipart/form-data。
application/x-www-form-urlencoded是默认的请求类型。
application/json是Json数据格式的请求类型。
multipart/form-data是表单数据的请求类型。
以上三种方式中,multipart/form-data通常用于文件上传。

默认方式所遇问题

先看代码

			HttpWebResponse response = null;
            try
            {
                HttpWebRequest request;
                request = (HttpWebRequest)WebRequest.Create(url);
                request.Method = "POST";
                request.ContentType = "application/x-www-form-urlencoded"; //跨平台调WebApi接口方式  
                request.Timeout = Convert.ToInt32(ConfigHelper.GetConfig("HttpTimeout"));
                byte[] payload;
                payload = Encoding.UTF8.GetBytes(param);
                request.ContentLength = payload.Length;
                using (Stream newStream = request.GetRequestStream())
                {
                    newStream.Write(payload, 0, payload.Length);//写入参数
                    newStream.Close();
                }
                string strValue;
                try
                {
                    response = (HttpWebResponse)request.GetResponse();

                    Stream resStream = response.GetResponseStream();
                    using StreamReader reader = new StreamReader(resStream, Encoding.UTF8);
                    strValue = reader.ReadToEnd();
                    resStream.Close();
                    response.Dispose();
                }
                catch (WebException ex)
                {
                    throw new Exception(ex.Message);
                }

                return strValue;
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }

以上代码是使用HttpWebRequest访问一个接口的代码,接口地址为url,接口传入参数为param。请求方式是POST请求,请求类型为application/x-www-form-urlencoded。

之前使用该代码访问远程接口,一直可以使用。但是今日开发时突然遇到一个问题,使用该方法请求返回结果500,检查发现参数错误。修改参数后401,然后切换各种请求类型,一直都是401。但使用JAVA的HttpPost类访是可以成功的,请求地址与请求参数均一致。则肯定是以上代码缺少信息。

request.UserAgent = "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)";

寻找一天终于找到问题,需要对Request设置UserAgent。UserAgent是客户端浏览器的原始用户代理信息。设置了该内容就可成功调用,但具体原因是为什么暂时还未知。

可能是因为远程接口地址设置了UserAgent反爬虫机制,所以需要设置该内容。而JAVA的HttpPost类可能内置了该信息。

  • 3
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值