C# API POST 类似于 CURL

C# API POST similar to CURL

我正在尝试使用利用 CURL 的 vultr.com API。我已经通过几个不同的调用成功地完成了对他们 API 的 POST 调用,但有一个特别无效。这是他们关于 API https://www.vultr.com/api/ 的文档。

我能够让他们的 server/create 和 firewall/rule_create 使用几乎完全相同的代码正常工作,但它不适用于他们的 server/reboot 命令。现在这是我已经成功开始工作的 post 到 API 的代码。

public static void AddIpToFirewall(string ip,string fireWallGroupId)
{
    string Data = "FIREWALLGROUPID=" + fireWallGroupId + "&direction=in&ip_type=v4&protocol=tcp&subnet=" + ip + "&subnet_size=32&port=80";
    string Reponse = String.Empty;
    StreamWriter Sw = null;
    StreamReader Sr = null;
    try
    {
        HttpWebRequest Req = (HttpWebRequest)WebRequest.Create("https://api.vultr.com/v1/firewall/rule_create");
        Req.Method = "POST";
        Req.ContentType = "application/x-www-form-urlencoded";
        Req.ContentLength = Data.Length;
        Req.Headers.Add(ApiKey);
        using (var sw = new StreamWriter(Req.GetRequestStream()))
        {
            sw.Write(Data);
        }
        Sr = new
        StreamReader(((HttpWebResponse)Req.GetResponse()).GetResponseStream());
        Reponse = Sr.ReadToEnd();
        Sr.Close();
    }
    catch (Exception ex)
    {
        if (Sw != null)
            Sw.Close();
        if (Sr != null)
            Sr.Close();
        Console.WriteLine(ex.Message + "\r\n\r\n'error with vultr...");
    }
}

现在这里是行不通的代码。它与 firewall POST 命令几乎相同。

public static void RebootCommand(string subId)
{
    string Data = "SUBID=" + subId;
    string Reponse = String.Empty;
    StreamWriter Sw = null;
    StreamReader Sr = null;
    try
    {
        HttpWebRequest Req = (HttpWebRequest)WebRequest.Create("https://api.vultr.com/v1/server/reboot");
        Req.Method = "POST";
        Req.ContentType = "application/x-www-form-urlencoded";
        Req.ContentLength = Data.Length;
        Req.Headers.Add(ApiKey);
        using (var sw = new StreamWriter(Req.GetRequestStream()))
        {
            sw.Write(Data);
        }
        Sr = new
        StreamReader(((HttpWebResponse)Req.GetResponse()).GetResponseStream());
        Reponse = Sr.ReadToEnd();
        Sr.Close();
    }
    catch (Exception ex)
    {
        if (Sw != null)
            Sw.Close();
        if (Sr != null)
            Sr.Close();
        Console.WriteLine(ex.Message + " error with vultr...");
    }
}

它没有收到错误,但无法重新启动 VM。我已经联系了他们的支持人员,他们说他们的重启命令没有任何问题。有没有人以前遇到过这个问题?谢谢。

我想通了。对于我从他们的 API 完成的所有其他 POST 请求,需要行 Req.ContentLength = Data.Length。但是无论出于何种原因,必须删除该行才能使重新启动命令起作用。