解决  如何使用HTTPWebrequest发送请求正文

匿名的

活跃成员
已加入
2020年9月29日
留言内容
38
编程经验
Beginner
您好,最后我找到了一个POST API,它以XML格式发送和接收数据。

我的API有一个请求正文-

C#:
<Person>
<Id>12345</Id>
<Customer>John Smith</Customer>
<Quantity>1</Quantity>
<Price>10.00</Price>
</Person>


我感到困惑,因为我应该如何从代码中使用此主体来击中api-

我为此创建了一个代理类-

C#:
    [System.SerializableAttribute()]
    [System.ComponentModel.DesignerCategoryAttribute("code")]
    [System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
    [System.Xml.Serialization.XmlRootAttribute(Namespace = "", IsNullable = false)]
    public partial class Person
    {

        private ushort idField;

        private string customerField;

        private byte quantityField;

        private decimal priceField;

        /// <remarks/>
        public ushort Id
        {
            get
            {
                return this.idField;
            }
            set
            {
                this.idField = value;
            }
        }

        /// <remarks/>
        public string Customer
        {
            get
            {
                return this.customerField;
            }
            set
            {
                this.customerField = value;
            }
        }

        /// <remarks/>
        public byte Quantity
        {
            get
            {
                return this.quantityField;
            }
            set
            {
                this.quantityField = value;
            }
        }

        /// <remarks/>
        public decimal Price
        {
            get
            {
                return this.priceField;
            }
            set
            {
                this.priceField = value;
            }
        }
    }

这是我为访问API而编写的代码-

C#:
var request = (HttpWebRequest)WebRequest.Create("//reqbin.com/sample/post/xml");



            Person person = new Person();

         

            Console.WriteLine("Enter ID");

            person.Id = Convert.ToUInt16(Console.ReadLine());



            Console.WriteLine("Enter Name");

            person.Customer = Console.ReadLine();



            Console.WriteLine("Enter Quantity");

            person.Quantity = Convert.ToByte(Console.ReadLine());



            Console.WriteLine("Enter Price");

            person.Price = Convert.ToDecimal(Console.ReadLine());



       

            var data = Encoding.ASCII.GetBytes(person); ----- I am not sure about this one.

我该如何进行?
 
Last edited:

跳伞

工作人员
已加入
2019年4月6日
留言内容
2,536
地点
弗吉尼亚州切萨皮克
编程经验
10+
将您的Person对象序列化为XML字符串。发送该字符串作为请求正文。

为什么您从以前的线程中放弃使用HttpClient的想法?
 

匿名的

活跃成员
已加入
2020年9月29日
留言内容
38
编程经验
Beginner
将您的Person对象序列化为XML字符串。发送该字符串作为请求正文。

为什么您从以前的线程中放弃使用HttpClient的想法?
我想两者都学。我首先尝试使用HttpWebRequest,然后尝试使用HttpClient。

我序列化了对象,但是现在我得到了

C#:
System.Net.ProtocolViolationException:
You must provide a request body if you set ContentLength>0 or SendChunked==true.
Do this by calling [Begin]GetRequestStream before [Begin]GetResponse.

我做了以下-

C#:
    // Serialize the person into an XML string
            var serializer = new XmlSerializer(typeof(Person));
            var sb = new StringBuilder();
            using (XmlWriter xmlWriter = XmlWriter.Create(sb))
            {
                serializer.Serialize(xmlWriter, person);
            }

            // Byte array data to send
            var data = Encoding.ASCII.GetBytes(sb.ToString());


            request.Method = "POST";
            request.ContentType = "application/xml";
            request.ContentLength = data.Length;

            var response = (HttpWebResponse)request.GetResponse();

            var responseString = new StreamReader(response.GetResponseStream()).ReadToEnd();

            Console.WriteLine(responseString);

            XmlSerializer deserializer = new XmlSerializer(typeof(Response));

            Response result = new Response();

            using (TextReader reader = new StringReader(responseString))
            {
                result = (Response)serializer.Deserialize(reader);
            }

            //Console.WriteLine(name);

            Console.WriteLine("Finally we received " + result.ResponseMessage);



            response.Close();
 

匿名的

活跃成员
已加入
2020年9月29日
留言内容
38
编程经验
Beginner
错误是告诉您您到底需要做什么。如果您检查了 GetRequestStream()方法的文档,甚至包含示例代码。
谢谢,现在可以正常工作了,但是我得到了System.NotSupportedException作为长度和位置。不是停止我的申请。我的应用程序正在运行,但在调试时看到了它。

1603720653518.png
 

跳伞

工作人员
已加入
2019年4月6日
留言内容
2,536
地点
弗吉尼亚州切萨皮克
编程经验
10+
是的,这对于某些调试可视化工具是正常的。有些流是只写的,因此这些流不支持某些属性。
 
最佳 底部