如何向OpsGenie发送POST请求?
问题描述:
我试图做一个API调用工作来创建一个警报,但我不知道如何正确地做到这一点。它对我来说没有什么意义,所以我提供了下面我写的代码,但无法确定它为什么返回错误的请求错误。如何向OpsGenie发送POST请求?
这可能是因为我的请求格式不正确或什么,但我不能说,因为我从来没有做过任何与CURL做任何事情。
它应该张贴类似于一个卷曲的请求:
curl -XPOST 'https://api.opsgenie.com/v1/json/alert' -d '
{
"apiKey": "eb243592-faa2-4ba2-a551q-1afdf565c889",
"message" : "WebServer3 is down",
"teams" : ["operations", "developers"]
}'
但它不工作。
电话功能:
OpsGenie.createAlert("1b9ccd31-966a-47be-92f2-ea589afbca8e", "Testing", null, null, new string[] { "ops_team" }, null, null);
最后,它返回一个错误的请求。我不知道我是如何加入数据或任何东西,所以任何帮助将不胜感激。
public static void createAlert(string api, string message, string description, string entity, string[] teams, string user, string[] tags)
{
var request = WebRequest.Create(new Uri("https://api.opsgenie.com/v1/json/alert"));
string json = "{";
if (api != null)
json = json + "'apiKey': '" + api + "'";
if (message != null)
json = json + ", 'message': '" + message + "'";
if (description != null)
json = json + ", 'description': '" + description + "'";
if (entity != null)
json = json + ", 'entity': '" + entity + "'";
if (teams != null)
{
json = json + ", 'teams': '['" + string.Join(",", teams) + "']'";
}
if (user != null)
json = json + ", 'user': '" + user + "'";
if (tags != null)
json = json + ", 'tags': '" + tags.ToString() + "'";
json = json + "}";
Console.WriteLine(json);
request.Method = "POST";
try
{
using (var streamWriter = new StreamWriter(request.GetRequestStream()))
{
streamWriter.Write(json);
streamWriter.Flush();
streamWriter.Close();
}
var httpResponse = (HttpWebResponse)request.GetResponse();
using (var streamReader = new StreamReader(stream: httpResponse.GetResponseStream()))
{
var result = streamReader.ReadToEnd();
dynamic obj = JsonConvert.DeserializeObject(result);
var messageFromServer = obj.error.message;
Console.WriteLine(messageFromServer);
}
}
catch (WebException e)
{
if (e.Status == WebExceptionStatus.ProtocolError)
{
Console.WriteLine("Status Code : {0}", ((HttpWebResponse)e.Response).StatusCode);
Console.WriteLine("Status Description : {0}", ((HttpWebResponse)e.Response).StatusDescription);
}
else
{
Console.WriteLine(e.Message);
}
}
}
答
对于这样的任务,使用WebClient
可能会更容易。它有很多帮助方法,使得像字符串一样下载和上传内容非常简单。
另外,不要试图通过连接字符串来构建JSON有效载荷,只需使用Newtonsoft.Json即可。
我重构了使用WebClient
和JsonConvert
的方法。现在更简单了!我将调试留在原地,但是您可以在测试后删除控制台日志记录行:
public static void CreateAlert(string api, string message, string description, string entity, string[] teams,
string user, string[] tags)
{
// Serialize the data to JSON
var postData = new
{
apiKey = api,
message,
teams
};
var json = JsonConvert.SerializeObject(postData);
// Set up a client
var client = new WebClient();
client.Headers.Add("Content-Type", "application/json");
try
{
var response = client.UploadString("https://api.opsgenie.com/v1/json/alert", json);
Console.WriteLine("Success!");
Console.WriteLine(response);
}
catch (WebException wex)
{
using (var stream = wex.Response.GetResponseStream())
using (var reader = new StreamReader(stream))
{
// OpsGenie returns JSON responses for errors
var deserializedResponse = JsonConvert.DeserializeObject<IDictionary<string, object>>(reader.ReadToEnd());
Console.WriteLine(deserializedResponse["error"]);
}
}
}