如何编写HTTP请求
本文关键字:请求 HTTP 何编写 | 更新日期: 2023-09-27 18:12:25
你好,我试图用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 action="/decrypt/paste" method="post">
<fieldset>
<p class="formrow">
<label for="content">DLC content</label>
<input id="content" name="content" type="text" value="" />
</p>
<p class="buttonrow"><button type="submit">Submit »</button></p>
</fieldset>
</form>
错误消息:
{
"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());
}
}
我个人发现,在过去,这样的帖子有点"坐立不安"。您也可以尝试根据请求设置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();
}
}
实际发送的内容可能仍然存在问题。
我马上看到的一个问题是,您需要对content
参数的值进行URL编码。使用HttpUtility.UrlEncode()
。除此之外,可能还有其他问题,但很难说不知道服务的作用。该错误过于通用,可能意味着任何
请求。还应设置ContentLength。
此外,您使用ASCII编码与使用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);