HttpWebRequest 请求 Api 及 异常处理

 

 

            HttpWebRequest request = WebRequest.CreateHttp(url);

            request.Method = "post";
            request.Headers.Add(HttpRequestHeader.Authorization, "password mima");
            request.Headers.Add("Cookie", "Cookie信息");
            request.UserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36";


            //request.ContentType = "application/json";
            //string data = JsonConvert.SerializeObject(new
            //{
            //    Id = 1,
            //    Name = "中+文",//JSON格式传递参数,"+"号依然是"+"
            //    Age = 100
            //});

            request.ContentType = "application/x-www-form-urlencoded;charset=UTF-8";

            // application/x-www-form-urlencoded 请求方式
            // form 表示参数格式是 form 表单的格式
            // urlencoded 表示该参数经过了 url 编码,注意:是经过了,而不是需要进行
            string data = "id=1&name=中+文&age=100";
            var bytes = Encoding.UTF8.GetBytes(data);
            Stream requestStream = request.GetRequestStream();
            requestStream.Write(bytes, 0, bytes.Length);
            requestStream.Close();
            var response = request.GetResponse();
            var sm = response.GetResponseStream();
            var str = string.Empty;
            using (StreamReader reader = new StreamReader(sm, Encoding.UTF8))
            {
                str = reader.ReadToEnd();
            }
            var person = JsonConvert.DeserializeObject<dynamic>(str);
            Console.WriteLine(person.Id);//1

            //服务器接收到请求后,识别出是"application/x-www-form-urlencoded"格式,
            //便认为参数中的"中+文"是经过了 url 编码,
            //因此,会自动 urldecode 解码
            //所以 "+" 变成了 " ".
            Console.WriteLine(person.Name);//中 文
            Console.WriteLine(person.Age);//100

 

补充:

如果API 返回的是 400,比如: return Request.CreateErrorResponse(HttpStatusCode.BadRequest, "没有文件耶,哥们!");

那么  var response = request.GetResponse(); 这句话直接会抛出异常

那么,我们如何能接收到返回的信息 : "没有文件耶,哥们!" 这句话呢?

答案是 try catch,代码如下:

            var result = string.Empty;
            try
            {
                HttpWebResponse response = (HttpWebResponse)request.GetResponse();
                using (StreamReader sr = new StreamReader(response.GetResponseStream(), Encoding.UTF8))
                {
                    result = sr.ReadToEnd();
                }
            }
            catch (WebException ex)
            {
                var errorSr =new StreamReader(ex.Response.GetResponseStream());
                result = errorSr.ReadToEnd();
            }
            return result;

 

posted @ 2018-03-07 00:53  热敷哥  阅读(913)  评论(0编辑  收藏  举报