asp.net中,http的post请求的一个疑问

 APIResponse<List<APIResponse>> resp = APIResponse<List<APIResponse>>.Success();
            string Url = "http://xxxx/xxx/xxx.json";
            var httpWebRequest = (HttpWebRequest)WebRequest.Create(Url);
            httpWebRequest.ContentType = "application/json";
            httpWebRequest.Method = "POST";
            string good = "";
            string envName = "";
            try
            {
    using (var streamWriter = new StreamWriter(httpWebRequest.GetRequestStream()))//这句话没看明白,streamWriter是post的请求体的内容,
    //但是它只是被new出来的一个对象,和httpWebRequest这个对象没有任何关系,它并不是httpWebRequest的一部分,所以httpWebRequest的请求体还是空的呀。。。为什么这样可以?
                {
                    string json = interfacejson.Replace("%servicename%", servicename);
                    streamWriter.Write(json);
                    streamWriter.Flush();
                    streamWriter.Close();
                    #region
                    var httpResponse = (HttpWebResponse)httpWebRequest.GetResponse();
                    
                    

问题:
var streamWriter = new StreamWriter(httpWebRequest.GetRequestStream());
这句话没看明白,变量streamWriter是post的请求体的内容,
但是它只是被new出来的一个对象,和httpWebRequest这个对象没有任何关系,它并不是httpWebRequest的一部分,所以httpWebRequest的请求体还是空的呀。。。为什么这样可以?

阅读 4.3k
3 个回答

你的代码就是简单的读网上的JSON,然后写到本地。
代码:var streamWriter = new StreamWriter(httpWebRequest.GetRequestStream());就是把返回的值放到StreamWriter里

对于你的疑问,我认为你应该了解引用类型和值类型的区别,一个简单的例子:

class Program
    {
        static void Main(string[] args)
        {
            Student rolf = new Student("Rolf", "高三(1)班");

            Console.WriteLine("1、" + rolf.ToString());//输出:  1、姓名:Rolf,班级:高三(1)班

            Class rolf_cls = rolf.GetClass();

            rolf_cls.className = "高二(3)班";

            Console.WriteLine("2、" + rolf.ToString());//输出:  2、姓名:Rolf,班级:高二(3)班

            Console.ReadKey();
        }

        public class Student
        {
            public string name;
            public Class classInfo;

            public override string ToString()
            {
                return String.Format("姓名:{0},班级:{1}", name, classInfo.className);
            }

            public Student(string name, string className)
            {
                this.name = name;
                this.classInfo = new Class(className);
            }

            public Class GetClass()
            {
                return this.classInfo;
            }
        }

        public class Class
        {
            public Class(string name)
            {
                this.className = name;
            }
            public string className;
        }
    }

httpWebRequest.GetRequestStream()方法和上面rolf.GetClass()类似的。

希望对你有帮助。

HttpWebRequest.GetRequestStream 这个方法是获取用于写入请求数据的 Stream 对象,然后你通过实例化StreamWrite 就可以获取到请求的内容写入到默认的缓冲区里面了

楼上的小伙伴已经解释得很清楚了、我来补充总结一下。

var streamWriter = new StreamWriter(httpWebRequest.GetRequestStream())

//这段代码总的主要目的是实例化对象、那么实例化对象 new StreamWriter() 括号里的内容就是传的参数值

//知道了传的是值、我们再来看 httpWebRequest.GetRequestStream() 是个啥东东


 APIResponse<List<APIResponse>> resp = APIResponse<List<APIResponse>>.Success();
            string Url = "http://xxxx/xxx/xxx.json";
            var httpWebRequest = (HttpWebRequest)WebRequest.Create(Url);
            httpWebRequest.ContentType = "application/json";
            httpWebRequest.Method = "POST";
            string good = "";
            string envName = "";
            

//楼楼这段代码已经明确表明了 httpWebRequest 就是POST请求将要传的数据

//那么 httpWebRequest.GetRequestStream() 里的 GetRequestStream() 就是调用的一个方法了

`var streamWriter = new StreamWriter(httpWebRequest.GetRequestStream())` 
//那现在来看这段代码就好理解了、实例化一个对象 `streamWriter` 、把要传的值 `httpWebRequest.GetRequestStream()` 传给这个对象

//其实这么想来、我感觉是换了一个方式把值请求过去

//而且楼楼只贴上了代码的片段、我感觉这段代码应该别有用意、不然不会这样来写

// |^_^|

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进