如何向包含多部分 HTTP POST 的 SendGrid Web API 发出请求
How to make a request to SendGrid web api which includes a multipart HTTP POST
我知道有类似的问题,但我仍然无法让它工作或理解我应该做什么。
我用C++编写应用程序并使用QtCreator。我正在尝试使用 SendGrid Web api 发送一封附加了 html 文件的电子邮件。到目前为止,我已经能够发送电子邮件,但是在将文件附加到其中时遇到问题(该文件是本地的)。文档说:
我文件内容必须是分段 HTTP POST 的一部分。 例如:
files[file1.jpg]=file1.jpg&files[file2.pdf]=file2.pdf'
不确定这是什么意思,所以我研究了多部分 http 帖子是什么并看到了示例,但我看不出如何让它与我正在做的事情一起工作。到目前为止,我需要做的就是调用 post,输入请求的链接和 post 数据:
api_user=your_sendgrid_username&api_key=your_sendgrid_password&to=destination@example.com&toname=Destination&subject=Example_Subject&text=testingtextbody&from=info@domain.com
我不明白多部分 HTTP 帖子会在哪里出现,以及它如何替换当前的帖子数据,我看到了在多部分 HTTP 帖子中设置标题和正文之类的东西,但我看不出这些与我正在做的事情或我应该做什么有什么关系。
有人可以给我一个例子,说明如何在Qt C++中将本地文件附加到对SendGrid的后期调用
更新:这是我对贾斯汀·斯蒂尔(Justin steele)指示的解释:
char speechMk = '"';
QString boundary = "----------------------------123456789abc";
QByteArray data(QString("--" + boundary + "rn").toLatin1());
data.append(QString("Content-Disposition: form-data; name=" + QString(speechMk) + "api_user" + QString(speechMk) + "rn").toLatin1());
data.append("myuser");
data.append("rn");
data.append("--" + boundary + "rn");
data.append("Content-Disposition: form-data; name=" + QString(speechMk) + "api_key" + QString(speechMk) + "rn" );
data.append("mypassword");
data.append("rn");
data.append("--" + boundary + "rn");
data.append("Content-Disposition: form-data; name=" + QString(speechMk) + "to" + QString(speechMk) + "rn");
data.append("myemail@hotmail.co.uk");
data.append("rn");
data.append("--" + boundary + "rn");
data.append("Content-Disposition: form-data; name=" + QString(speechMk) + "toname" + QString(speechMk) + "rn");
data.append( "Destination");
data.append("rn");
data.append("--" + boundary + "rn");
data.append("Content-Disposition: form-data; name=" + QString(speechMk) + "subject" + QString(speechMk) + "rn");
data.append("eSubject");
data.append("rn");
data.append("--" + boundary + "rn");
data.append("Content-Disposition: form-data; name=" + QString(speechMk) + "text" + QString(speechMk) + "rn");
data.append("eBody");
data.append("rn");
data.append("--" + boundary + "rn");
data.append("Content-Disposition: form-data; name=" + QString(speechMk) + "from" + QString(speechMk) + "rn");
data.append("noreply@randomdomain.com");
data.append("rn");
data.append("--" + boundary + "rn");
data.append("Content-Disposition: form-data; name=" + QString(speechMk) + "files[1]" + QString(speechMk) + "; filename=" + QString(speechMk) + "TodayRoute.html" + QString(speechMk) + "rn");
data.append("Content-Type: application/octet-stream");
data.append("rn");
QFile file1(path);
if (!file1.open(QFile::ReadOnly)){
qDebug() << "could not open";
} else {
data.append(file1.readAll().toBase64() + "rn");
}
data.append("--" + boundary + "rn");
file1.close();
QNetworkAccessManager theMan;
QNetworkRequest req = QNetworkRequest(QUrl("https://api.sendgrid.com/api/mail.send.json"));
req.setHeader(QNetworkRequest::ContentTypeHeader, QVariant("multipart/form-data; boundary=" + boundary));
theMan.post(req,data);
这是我之前(下面)的,它会发送一封带有附件的电子邮件,但附加文件不包含我想要的内容。
QByteArray data(QString("api_user=myuser&").toLatin1());
data.append("api_key=mypassword&");
data.append("to=myemail@hotmail.co.uk&");
data.append("toname=Destination&");
data.append("files[TodayRoute.html]=");
QFile file(path);
if (!file.open(QIODevice::ReadOnly)){
qDebug() << "QFile Error: File not found!";
// return data;
} else { qDebug() << "File found, proceed as planned"; }
data.append(file.readAll());
data.append("&subject=Example_Subject&");
data.append("text=testingtextbody&");
data.append("from=noreply@domainrandom.com");
QUrl mResultsURL = QUrl("https://api.sendgrid.com/api/mail.send.json");
QNetworkAccessManager mNetworkManager;
QNetworkRequest request(mResultsURL); //our server with php-script
mNetworkManager.post(request,data);
file.close();
我用 C# 玩了一下,了解到在 Content-Disposition: 行和值之间需要一个空行"\r"。我相信您还需要在文件的内容类型:行之后添加一个。最后一个边界以"--"结尾。
char speechMk = '"';
QString boundary = "----------------------------123456789abc";
QByteArray data(QString("--" + boundary + "rn").toLatin1());
data.append(QString("Content-Disposition: form-data; name=" + QString(speechMk) + "api_user" + QString(speechMk) + "rn").toLatin1());
data.append("rn");
data.append("myuser");
data.append("rn");
data.append("--" + boundary + "rn");
data.append("Content-Disposition: form-data; name=" + QString(speechMk) + "api_key" + QString(speechMk) + "rn" );
data.append("rn");
data.append("mypassword");
data.append("rn");
data.append("--" + boundary + "rn");
data.append("Content-Disposition: form-data; name=" + QString(speechMk) + "to" + QString(speechMk) + "rn");
data.append("rn");
data.append("myemail@hotmail.co.uk");
data.append("rn");
data.append("--" + boundary + "rn");
data.append("Content-Disposition: form-data; name=" + QString(speechMk) + "toname" + QString(speechMk) + "rn");
data.append("rn");
data.append( "Destination");
data.append("rn");
data.append("--" + boundary + "rn");
data.append("Content-Disposition: form-data; name=" + QString(speechMk) + "subject" + QString(speechMk) + "rn");
data.append("rn");
data.append("eSubject");
data.append("rn");
data.append("--" + boundary + "rn");
data.append("Content-Disposition: form-data; name=" + QString(speechMk) + "text" + QString(speechMk) + "rn");
data.append("rn");
data.append("eBody");
data.append("rn");
data.append("--" + boundary + "rn");
data.append("Content-Disposition: form-data; name=" + QString(speechMk) + "from" + QString(speechMk) + "rn");
data.append("rn");
data.append("noreply@randomdomain.com");
data.append("rn");
data.append("--" + boundary + "rn");
data.append("Content-Disposition: form-data; name=" + QString(speechMk) + "files[1]" + QString(speechMk) + "; filename=" + QString(speechMk) + "TodayRoute.html" + QString(speechMk) + "rn");
data.append("Content-Type: application/octet-stream");
data.append("rn");
data.append("rn");
QFile file1(path);
if (!file1.open(QFile::ReadOnly)){
qDebug() << "could not open";
} else {
data.append(file1.readAll().toBase64() + "rn");
}
data.append("--" + boundary + "--rn");
file1.close();
QNetworkAccessManager theMan;
QNetworkRequest req = QNetworkRequest(QUrl("https://api.sendgrid.com/api/mail.send.json"));
req.setHeader(QNetworkRequest::ContentTypeHeader, QVariant("multipart/form-data; boundary=" + boundary));
theMan.post(req,data);
相关文章:
- 用于将C++代码转换为 Web 程序集的脚本未终止
- C# DLL 从C++应用程序调用 SOAP Web 服务
- OpenCV(C++)处理来自JavaScript / Web Assembly的图像数据
- 用于 progmem 的C++和头文件压缩的 Web 文件字节数组
- 来自带有mbedtls TLS的Mongoose Web服务器的错误消息
- 使用 ESP8266/8285 将字符串从 Web 服务器转换为字节数组
- 在 c++ WWSAPI Web 服务中处理 WS-Security PasswordDigest 模式
- libtorrent是否支持带摘要身份验证的http web种子
- 我的web应用程序的用户需要在浏览器上手动启用本机客户端吗
- Java JNI GDAL 本机库在重新部署为 Web 应用程序时出现类加载器错误
- 如何捕获从 MFC Web 浏览器 c++ 发出的 GET/POST 请求
- 在能够从 Web 浏览器访问大型数组数据的同时存储它的最可行方法是什么?
- 如何为C Web开发配置LAMPP
- 在C/C 接受JSON中创建REST Web服务
- Boost-Beast 异步 Web 套接字 服务器-客户端异步读写 不在控制台上写入输出
- 用于管理 CATIA 文件的 Web 应用程序
- 从QT的Web服务中解析未命名的JSON数组
- 可能在OpenShift3上部署C Web服务器
- 如何使用boost :: asio访问Web服务
- 如何向包含多部分 HTTP POST 的 SendGrid Web API 发出请求