我在通过 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/