c# - 寻找 C# 或 curl 示例如何在 SendGrid 更新 HTML 模板

标签 c# httpclient sendgrid

我在通过 Templates API (Web API) 更新模板时遇到问题。这是我的代码:

CURL(删除用户和密码):

$ curl -d '{"name":"NameRemoved","html_content":"<%body%>",
  "plain_content":"<%body%>","subject":"<%subject%>"}' 
  https://api.sendgrid.com/v3/templates/GuidRemoved/versions

收到 400 错误 BAD REQUEST

{"error": "A <%body%> tag is required in html content"}

同样,我的 C# 代码导致了同样的错误:

using (var client = new HttpClient())
{
  client.BaseAddress = new Uri("https://api.sendgrid.com/");
  client.DefaultRequestHeaders.Accept.Clear();
  client.DefaultRequestHeaders.Accept.Add(
         new MediaTypeWithQualityHeaderValue("application/json"));
  client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue(
    "Basic",
    Convert.ToBase64String(
    Encoding.ASCII.GetBytes(String.Format("{0}:{1}", 
      credentials.UserName, credentials.Password))));

  var data = new NewTemplate()
  {
    html_content = "<%body%>",
    name = template.name + "_" + template.Versions.Count(),
    plain_content = "<%body%>",
    subject = "<%subject%>"
  };

  var content = JsonConvert.SerializeObject(data) as string;
  var response = await client.PostAsync(
      String.Format("v3/templates/{0}/versions", template.id), 
      new StringContent(content));
}

我确实注意到,当我检索当前默认模板时,内容有些编码。

{"id":"GuidRemoved",
 "template_id":"GuidRemoved",
 "active":1,
 "name":"NameRemoved", 
 "html_content":"\u003c%body%\u003e",
 "plain_content":"\u003c%body%\u003e",
 "subject":"\u003c%subject%\u003e",
 "updated_at":"2014-06-03 21:40:43"}

所以我也尝试这样编码,但它也不起作用。

非常感谢任何帮助。

更新

在指定了 StringContent 的 ContentType 之后,C# 代码就可以工作了:

new StringContent(content,Encoding.UTF8,"application/json")

最佳答案

这是一个示例代码,可用于各种任务与 SendGrid 交互:

获取请求:

    private static async Task<TReturn> GetAsync<TReturn>(string getString)
    {
        TReturn data = default(TReturn);
        using (var client = new HttpClient())
        {
            client.BaseAddress = new Uri("https://api.sendgrid.com/");
            client.DefaultRequestHeaders.Accept.Clear();
            client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
            client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue(
                "Basic",
                Convert.ToBase64String(Encoding.ASCII.GetBytes(String.Format("{0}:{1}", credentials.UserName, credentials.Password))));
            HttpResponseMessage response = await client.GetAsync(getString);
            if (response.IsSuccessStatusCode)
            {
                string t = await response.Content.ReadAsStringAsync();
                data = JsonConvert.DeserializeObject<TReturn>(t);
            }
        }
        return data;
    }

POST 请求:

    private static async Task<TReturn> PostAsync<TReturn>(string postUri, object data)
    {
        TReturn ret = default(TReturn);
        using (var client = new HttpClient())
        {
            client.BaseAddress = new Uri("https://api.sendgrid.com/");
            client.DefaultRequestHeaders.Accept.Clear();
            client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
            client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue(
                "Basic",
                Convert.ToBase64String(Encoding.ASCII.GetBytes(String.Format("{0}:{1}", credentials.UserName, credentials.Password))));
            HttpResponseMessage response = await client.PostAsync(postUri, new StringContent(JsonConvert.SerializeObject(data), Encoding.UTF8, "application/json"));
            if (response.IsSuccessStatusCode)
            {
                string t = await response.Content.ReadAsStringAsync();
                ret = JsonConvert.DeserializeObject<TReturn>(t);
            }
        }
        return ret;
    }

示例用法

获取所有模板

GetAsync<TemplatesCollection>("v3/templates");

获取事件模板

GetAsync<TemplateVersion>(String.Format("v3/templates/{0}/versions/{1}", template.id, template.Versions.Single(s1 => s1.active.Equals("1")).id));

上传模板的新版本

    private static async Task<TemplateVersion> UpdateTemplate(Template template, string fileName)
    {
        var data = new BaseTemplate
                   {
                       html_content = File.ReadAllText(fileName),
                       name = String.Format("{0}_{1:yyyyMMddHHmmss}", template.name, DateTime.Now),
                       plain_content = "<%body%>",
                       subject = "<%subject%>"
                   };
        return await PostAsync<TemplateVersion>(String.Format("v3/templates/{0}/versions", template.id), data);
    }

辅助类

internal class TemplatesCollection
{
    #region Public Properties

    public List<Template> templates { get; set; }

    #endregion
}

internal class TemplateVersion : BaseTemplate
{
    #region Public Properties

    public string id { get; set; }

    public string updated_at { get; set; }

    #endregion
}

internal class BaseTemplate
{
    #region Public Properties

    public string html_content { get; set; }

    public string name { get; set; }

    public string plain_content { get; set; }

    public string subject { get; set; }

    #endregion
}

internal class Template
{
    #region Public Properties

    public Version[] Versions { get; set; }

    public string default_version_id { get; set; }

    public string id { get; set; }

    public string name { get; set; }

    #endregion
}

internal class Version
{
    #region Public Properties

    public string active { get; set; }

    public string id { get; set; }

    public string name { get; set; }

    public string template_id { get; set; }

    public string updated_at { get; set; }

    #endregion
}

关于c# - 寻找 C# 或 curl 示例如何在 SendGrid 更新 HTML 模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24026149/

相关文章:

安卓文件下载慢

ASP.NET WebApi - HttpClient - 找不到方法

SendGrid API V3 返回 400 Bad Request

c# - ListView 错误 C#

类似于 PHP 的 C# 多维数组

c# - 如何将对象值转换为类型值?

ruby-on-rails - 设计将确认电子邮件发送到错误的 Heroku 应用程序

c# - Linq:GroupBy、Sum 和 Count

java - 忽略 Apache HTTPClient 4.5 中的自签名证书

twilio - SendGrid 模板不包含必需的占位符