如何编写HTTP请求

您好我尝试在C#(Post)中编写HTTP请求,但我需要帮助解决错误

Expl:我想将DLC文件的内容发送到服务器并重新获取解密的内容。

C#代码

public static void decryptContainer(string dlc_content) { HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://dcrypt.it/decrypt/paste"); request.Method = "POST"; request.ContentType = "application/x-www-form-urlencoded"; request.Accept = "Accept=text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"; using (StreamWriter writer = new StreamWriter(request.GetRequestStream(), Encoding.ASCII)) { writer.Write("content=" + dlc_content); } HttpWebResponse response = (HttpWebResponse)request.GetResponse(); using (StreamReader reader = new StreamReader(response.GetResponseStream())) { Console.WriteLine(reader.ReadToEnd()); } } 

在这里我收到了html请求

 

错误信息:

 { "form_errors": { "__all__": [ "Sorry, an error occurred while processing the container." ] } } 

如果有人可以帮助我解决问题,那将非常有帮助!

您尚未设置内容长度,这可能会导致问题。 您也可以尝试直接将字节写入流而不是首先将其转换为ASCII。(这与您目前的工作方式相反),例如:

 public static void decryptContainer(string dlc_content) { HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://dcrypt.it/decrypt/paste"); request.Method = "POST"; request.ContentType = "application/x-www-form-urlencoded"; request.Accept = "Accept=text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"; byte[] _byteVersion = Encoding.ASCII.GetBytes(string.Concat("content=", dlc_content)); request.ContentLength = _byteVersion.Length Stream stream = request.GetRequestStream(); stream.Write(_byteVersion, 0, _byteVersion.Length); stream.Close(); HttpWebResponse response = (HttpWebResponse)request.GetResponse(); using (StreamReader reader = new StreamReader(response.GetResponseStream())) { Console.WriteLine(reader.ReadToEnd()); } } 

我个人发现这样的post在过去有点“狡猾”。 您还可以尝试在请求上设置ProtocolVersion。

我会简化你的代码,像这样:

 public static void decryptContainer(string dlc_content) { using (var client = new WebClient()) { var values = new NameValueCollection { { "content", dlc_content } }; client.Headers[HttpRequestHeader.Accept] = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"; string url = "http://dcrypt.it/decrypt/paste"; byte[] result = client.UploadValues(url, values); Console.WriteLine(Encoding.UTF8.GetString(result)); } } 

它还确保正确编码请求参数。

 public string void decryptContainer(string dlc_content) //why not return a string, let caller decide what to do with it. { HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://dcrypt.it/decrypt/paste"); request.Method = "POST"; request.ContentType = "application/x-www-form-urlencoded"; request.Accept = "Accept=text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";//sure this is needed? Maybe just match the one content-type you expect. using (StreamWriter writer = new StreamWriter(request.GetRequestStream(), Encoding.ASCII)) { writer.Write("content=" + Uri.EscapeDataString(dlc_content));//escape the value of dlc_content so that the entity sent is valid application/x-www-form-urlencoded } using(HttpWebResponse response = (HttpWebResponse)request.GetResponse())//this should be disposed when finished with. using (StreamReader reader = new StreamReader(response.GetResponseStream())) { return reader.ReadToEnd(); } } 

实际发送的内容仍然存在问题。

我立即看到的一个问题是您需要URL编码content参数的值。 使用HttpUtility.UrlEncode() 。 除此之外,可能还有其他问题,但很难说不知道服务是做什么的。 错误过于笼统,可能意味着什么

request.ContentLength也应该设置。

另外,有没有理由你是ASCII编码vs UTF8?

首先获取与响应关联的流,然后将其传递到Streamreader,如下所示:

  Stream receiveStream = response.GetResponseStream(); using (StreamReader reader = new StreamReader(receiveStream, Encoding.ASCII)) { Console.WriteLine(reader.ReadToEnd()); } 

因为我不能评论Jon Hanna的解决方案。 这解决了我:Uri.EscapeDataString

  // this is what we are sending string post_data = "content=" + Uri.EscapeDataString(dlc_content); // this is where we will send it string uri = "http://dcrypt.it/decrypt/paste"; // create a request HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri); request.KeepAlive = false; request.ProtocolVersion = HttpVersion.Version10; request.Method = "POST"; // turn our request string into a byte stream byte[] postBytes = Encoding.ASCII.GetBytes(post_data); // this is important - make sure you specify type this way request.ContentType = "application/x-www-form-urlencoded"; request.ContentLength = postBytes.Length; Stream requestStream = request.GetRequestStream(); // now send it requestStream.Write(postBytes, 0, postBytes.Length); requestStream.Close(); // grab te response and print it out to the console along with the status code HttpWebResponse response = (HttpWebResponse)request.GetResponse(); Console.WriteLine(new StreamReader(response.GetResponseStream()).ReadToEnd()); Console.WriteLine(response.StatusCode);