2016-07-08 166 views
1

我试图做一个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); 
      } 

     } 
    } 

回答

2

对于这样的任务,使用WebClient可能会更容易。它有很多帮助方法,使得像字符串一样下载和上传内容非常简单。

另外,不要试图通过连接字符串来构建JSON有效载荷,只需使用Newtonsoft.Json即可。

我重构了使用WebClientJsonConvert的方法。现在更简单了!我将调试留在原地,但是您可以在测试后删除控制台日志记录行:

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