繁体   English   中英

使用C#的HTTP请求

[英]HTTP request with C#

我想转换函数中收到的Object,并根据需要将其转换为对象({"some_key": "some_value"})

这是我的代码:

public HttpRequests(string url, string method, Object data)
{

   //The following prepares data, according to received parameter

    if (data is Array)
    {
        data = (Array)data;
    }
    else if (data is Dictionary<Object, Object>)
    {
        data = ((Dictionary<string, string>)data)["something"] = platform_secret;
        data = ((Dictionary<string, string>)data)["something2"] = "1";
    }

    method = method.ToUpper(); //POST or GET

    this.url = just_url + url;
    this.data = Newtonsoft.Json.JsonConvert.SerializeObject(data);
    this.method = method;

}

public Object performRequest()
{

    if (this.data != null && url != null)
    {

        WebRequest request = HttpWebRequest.Create(url);

        byte[] data_bytes = Encoding.ASCII.GetBytes(Convert.ToChar(data)[]);
        //^ this does not work. Am I supposed to do this?
        // as I said, what I want is to get an object {key: something} that can be read
        //      by $_POST["key"] in the server

        request.Method = method;
        request.ContentType = "application/x-www-form-urlencoded"; //TODO: check
        //request.ContentLength = ((Dictionary<string, string>) data);
        request.ContentLength = data_bytes.Length;

        Stream dataStream = request.GetRequestStream(); //TODO: not async at the moment

        //{BEGIN DOUBT

        dataStream.Write(data_bytes, 0, data_bytes.Length);
        dataStream.Close();

        //DOUBT: DO THIS ^ or THIS:_      ???

        StreamWriter writer = new StreamWriter(dataStream);
        writer.Write(this.data);

        //End DOUBT}

        WebResponse response = request.GetResponse();
        Stream dataResponse = response.GetResponseStream();

        writer.Close();
        response.Close();
        dataStream.Close();

        return dataResponse.

    }

我到底错过了什么?

当你最初分配this.data = Newtonsoft.Json.JsonConvert.SerializeObject(data); ,假设他的.data有类型字符串(如果不是,你可以改变)。

然后代替byte[] data_bytes = Encoding.ASCII.GetBytes(Convert.ToChar(data)[]); 你需要只写byte[] data_bytes = Encoding.ASCII.GetBytes(data);

使用完之后

//{BEGIN DOUBT

        dataStream.Write(data_bytes, 0, data_bytes.Length);
        dataStream.Close();

它将有助于使用一些数据进行调用,但它无助于解决您的问题。 request.ContentType = "application/x-www-form-urlencoded"; 不期望数据是Newtonsoft.Json.JsonConvert.SerializeObject序列化。 它期望一个字符串包含和分隔的urlencoded对。

name1=value1&name2=value2&name3=value3

因此,您需要使用此格式而不是JSON。

您需要使用第一段代码。 这是和exmaple。 但我猜,第二部分也可以奏效。 你在C#方面一无所获。 但是,问题可能出在您要转移的数据中。 例如,如果没有正确编码。

你应该做更接近这条线的事情......

void Main()
{

    var formSerializer = new FormEncodedSerializer();
    formSerializer.Add("key", "value");
    formSerializer.Add("foo", "rnd");
    formSerializer.Add("bar", "random");

    var uri = @"http://example.com";
    var contentType = @"application/x-www-form-urlencoded";
    var postData = formSerializer.Serialize();
    var http = new Http();

    Console.WriteLine (http.Post(uri, postData, contentType));
}


public class Http
{
    public string Post(string url, string data, string format)
    {
        var content = Encoding.UTF8.GetBytes(data);
        var contentLength = content.Length;

        HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
        request.ServicePoint.Expect100Continue = false;
        request.Method = "POST";
        request.AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate;
        request.ContentType = format;
        request.ContentLength = contentLength;

        using (Stream requestStream = request.GetRequestStream())
        {
            requestStream.Write(content, 0, content.Length);
        }

        using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
        using (Stream responseStream = response.GetResponseStream())
        using (StreamReader reader = new StreamReader(responseStream))
        {
            return reader.ReadToEnd();
        }
    }
}`


public class FormEncodedSerializer
{
    private Dictionary<string, string> formKeysPairs;

    public FormEncodedSerializer(): this(new Dictionary<string, string>())
    {
    }

    public FormEncodedSerializer(Dictionary<string, string> kvp)
    {
        this.formKeysPairs = kvp;
    }

    public void Add(string key, string value)
    {
        formKeysPairs.Add(key, value);
    }  

    public string Serialize()
    {
        return string.Join("", this.formKeysPairs.Select(f => string.Format("&{0}={1}", f.Key,f.Value))).Substring(1);
    }

    public void Clear()
    {
        this.formKeysPairs.Clear();
    }  
}

我真的不明白你的服务期望,你需要以哪种格式发送数据。 无论如何,如果您将ContentType设置为“application / x-www-form-urlencoded”,则必须使用此格式对数据进行编码。 您只需使用此代码即可完成此操作;

var values = ((Dictionary<string, string>)data).Aggregate(
                    new NameValueCollection(),
                    (seed, current) =>
                    {
                        seed.Add(current.Key, current.Value);
                        return seed;
                    });

所以,你的数据就像“something = platform_secret&something2 = 1”一样发送

现在,您可以简单地发送表单数据:

WebClient client = new WebClient();
var result = client.UploadValues(url, values);

我认为你的第一个函数与签名public HttpRequests(string url, string method, Object data)似乎没有任何逻辑错误,但在你的第二个函数与签名public Object performRequest()你有一些问题:

  • 如果您的HTTP方法是GET,则不需要编写内容流。
  • 如果您的方法是POST并且您的数据是JSON,则需要设置HTTP请求者,如下所示:

     request.ContentType = "application/json"; 

最后,在关闭之前刷新你的流,就像这个request.Flush();

暂无
暂无

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

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