如何将 JSON 数据发送到 REST API?
How to send JSON data to a REST API?
我正在使用C++中的libcurl和WooCommerce REST API安装WooCommerce插件将数据发送到Wordpress站点。数据似乎已发送,但预期结果未显示在网站上。其目的是更新(修改)产品。我的代码基于WooCommerce文档,可在此处找到。
我已经设法在单独的txt文件中从程序中获取CURLOPT_VERBOSE
文本。
这是我使用 cURL 的C++代码:
std::string URL = main_domain + "wp-json/wc/v3/products/" + product_id + "?consumer_key=" + consumer_key + "&consumer_secret=" + consumer_secret;
curl_slist* headers = NULL;
headers = curl_slist_append(headers, "Transfer-Encoding: chunked");
headers = curl_slist_append(headers, "Accept:application/json");
headers = curl_slist_append(headers, "Content-Type:application/json");
headers = curl_slist_append(headers, "charsets: utf-8");
// log file
FILE* filep = fopen("logfichier.txt", "w");
std::string toUpdate = "{"id":"" + product_id + ","name":"" + product_name + "","description":"" + product_description + "","price":"" + product_price + ""}";
curl_global_init(CURL_GLOBAL_ALL);
curl = curl_easy_init();
if (curl) {
readBuffer = "";
curl_easy_setopt(curl, CURLOPT_URL, URL.c_str());
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "PUT");
curl_easy_setopt(curl, CURLOPT_POST, 1);
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, toUpdate.c_str());
curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, toUpdate.length());
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCallback);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &readBuffer);
curl_easy_setopt(curl, CURLOPT_VERBOSE, true);
curl_easy_setopt(curl, CURLOPT_STDERR, filep);
res = curl_easy_perform(curl);
// Check for errors
if (res != CURLE_OK) {
// error handling and cleanup
}
else {
// code and cleanup
}
}
else {
// error handling and cleanup
}
我从字面上放了互联网上找到的每个标题,这些标题似乎与我试图在我的代码中完成的内容相关。 这是返回的调试文本:
* STATE: INIT => CONNECT handle 0x10870278; line 1428 (connection #-5000)
* Added connection 0. The cache now contains 1 members
* STATE: CONNECT => WAITRESOLVE handle 0x10870278; line 1464 (connection #0)
* Trying 192.XX.XX.XX...
* TCP_NODELAY set
* STATE: WAITRESOLVE => WAITCONNECT handle 0x10870278; line 1545 (connection #0)
* Connected to mywebsite.com (192.XX.XX.XX) port 443 (#0)
* STATE: WAITCONNECT => SENDPROTOCONNECT handle 0x10870278; line 1599 (connection #0)
* Marked for [keep alive]: HTTP default
* schannel: SSL/TLS connection with mywebsite.com port 443 (step 1/3)
* schannel: checking server certificate revocation
* schannel: sending initial handshake data: sending 176 bytes...
// (here was just a bunch of connexion attemps log text...)
* schannel: SSL/TLS handshake complete
* schannel: SSL/TLS connection with mywebsite.com port 443 (step 3/3)
* schannel: stored credential handle in session cache
* STATE: PROTOCONNECT => DO handle 0x10870278; line 1634 (connection #0)
> PUT /wp-json/wc/v3/products/111867?consumer_key=(the actual key)&consumer_secret=(the actual secret) HTTP/1.1
Host: mywebsite.com
Transfer-Encoding: chunked
Accept:application/json
Content-Type:application/json
charsets: utf-8
4b
* upload completely sent off: 82 out of 75 bytes
* STATE: DO => DO_DONE handle 0x10870278; line 1696 (connection #0)
* STATE: DO_DONE => WAITPERFORM handle 0x10870278; line 1823 (connection #0)
* STATE: WAITPERFORM => PERFORM handle 0x10870278; line 1838 (connection #0)
* schannel: client wants to read 16384 bytes
* schannel: encdata_buffer resized 17408
* schannel: encrypted data buffer: offset 0 length 17408
// (a few decrypting data attempts...)
* schannel: decrypted data returned 536
* schannel: decrypted data buffer: offset 0 length 16384
* HTTP 1.1 or later with persistent connection, pipelining supported
< HTTP/1.1 200 OK
< Date: Tue, 18 Jun 2019 15:27:42 GMT
* Server Apache is not blacklisted
< Server: Apache
< X-Robots-Tag: noindex
< Link: <https://mywebsite.com/wp-json/>; rel="https://api.w.org/"
< X-Content-Type-Options: nosniff
< Access-Control-Expose-Headers: X-WP-Total, X-WP-TotalPages
< Access-Control-Allow-Headers: Authorization, Content-Type
< Expires: Wed, 11 Jan 1984 05:00:00 GMT
< Cache-Control: no-transform, no-cache, must-revalidate, max-age=0
< Allow: GET, POST, PUT, PATCH, DELETE
< Transfer-Encoding: chunked
< Content-Type: application/json; charset=UTF-8
<
* schannel: client wants to read 16384 bytes
* schannel: encrypted data buffer: offset 835 length 17408
// (a few decrypting data attempts...)
* schannel: decrypted data returned 1986
* schannel: decrypted data buffer: offset 0 length 16384
* STATE: PERFORM => DONE handle 0x10870278; line 2011 (connection #0)
* multi_done
* Connection #0 to host axanti.info left intact
我从原文中删除了一些多余的部分,并保留了我认为是主要信息的内容。似乎我的 JSON 数据实际上已发送到服务器,但预期结果没有显示在我的网站上(产品应该修改,但实际上没有)。 这段代码有什么可能错的吗?还是问题出在服务器端?因为我经常应用官方文档中提到的相同内容。
如果关闭,看起来像您的有效负载。id
部分是多余的,因为您已经通过 URL 指定了要更新的产品,因此您可以删除它。此外,您试图错误地设置价格。根据 REST 文档,您需要使用regular_price
属性而不是price
(price
是只读的)。正确的有效负载应如下所示:
{
name: 'My product name',
description: 'my product description',
regular_price' : '3.50',
}
相关文章:
- Microsoft C++ 用于图形 API 的 Rest SDK
- Visual C++ and REST API
- QT 和 JIRA Rest API: /rest/api/2/issue/createmeta 意外返回韩语的 iss
- 用于连接在线 REST 服务器的 REST API
- 如何将 JSON 数据发送到 REST API?
- 使用 REST SDK 将图像从 OpenCV 3 发送到认知人脸 API C++
- 使用boost :: Beast进行CPU重的REST API,我是否应该使用异步或同步方式来实现它们以期望延迟
- 在 Firebase 中使用 Rest api(Casablanca c++) 添加子项时遇到问题
- 如何将QnetworkManager用于REST API
- 如何以编程方式为应用程序创建文件夹,以使用 BOX REST API 在其中上传内容
- 通过C#使用C++boost.asio Rest API
- 为瘦客户端设计客户端(厚)/服务器+额外的REST API
- c++ lib 与初学者的 REST API 配合使用
- 如何使用 JSON 实现带有 POCO C++ 网络库的 REST API 服务器
- 如何在卡萨布兰卡 REST API 中检索授权标头
- 使用OneDrive Rest API进行批量下载
- 在Windows上使用OpenSSL访问带有身份验证的REST API
- 如何在xcode中使用curl和c++的rest API
- 如何实现REST API服务器
- 使用REST API的JSON分阶段