简体   繁体   English

如何编写HTTP请求

[英]How to write a HTTP Request

Hello I try to write a HTTP Request in C# (Post), but I need help with an error 您好我尝试在C#(Post)中编写HTTP请求,但我需要有关错误的帮助

Expl: I want to send the Content of a DLC File to the Server and recive the decrypted content. Expl:我想将DLC文件的内容发送到服务器并重新发送解密的内容。

C# Code 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());
    }
}

and here I got the html request 在这里我收到了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>

Error Message: 错误信息:

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

Would be very helpfull if someone could help me solving the problem! 如果有人可以帮我解决问题,那将非常有帮助!

You haven't set a content-length, which might cause issues. 您尚未设置内容长度,这可能会导致问题。 You could also try writing bytes directly to the stream instead of converting it to ASCII first.. (do it the opposite way to how you're doing it at the moment), eg: 您也可以尝试将字节直接写入流而不是首先将其转换为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());
        }
    }

I've personally found posting like this to be a bit "fidgity" in the past. 我个人发现这样的帖子在过去有点“狡猾”。 You could also try setting the ProtocolVersion on the request. 您还可以尝试在请求上设置ProtocolVersion。

I would simplify your code, like this: 我会简化你的代码,像这样:

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));
    }
}

It also ensures that the request parameters are properly encoded. 它还确保正确编码请求参数。

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();
    }
}

There could still be a problem with what is actually being sent. 实际发送的内容可能仍然存在问题。

One issue I see right away is that you need to URL encode value of the content parameter. 我立即看到的一个问题是你需要URL编码content参数的值。 Use HttpUtility.UrlEncode() for that. 使用HttpUtility.UrlEncode() Other than that there might be other issues there, but it is hard to say not knowing what service does. 除此之外,可能还有其他问题,但很难说不知道服务是做什么的。 The error is too generic and could mean anything 错误过于笼统,可能意味着什么

request.ContentLength should be set as well. request.ContentLength也应该设置。

Also, is there a reason you are ASCII encoding vs UTF8? 另外,有没有理由你是ASCII编码vs UTF8?

As I can't comment on the solution of Jon Hanna. 因为我不能评论Jon Hanna的解决方案。 This solved it for me: Uri.EscapeDataString 这为我解决了: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);

Get the stream associated with the response first then pass that into the Streamreader as below: 首先获取与响应关联的流,然后将其传递到Streamreader,如下所示:

    Stream receiveStream = response.GetResponseStream();       

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM