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。但是无论出于何种原因,必须删除该行才能使重新启动命令起作用。
我正在尝试使用利用 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。但是无论出于何种原因,必须删除该行才能使重新启动命令起作用。