Я взломал это несколько дней без удачи.
Я пытаюсь сделать безопасный (SSL / HTTPS) запрос API в среде Arduino.Контроллер, который я использую, - это ESP32, который подключается через Wi-Fi и может извлекать / публиковать данные.Однако мне не везет при подключении к безопасному API.
Я пытаюсь подключиться к этому API https://strike.acinq.co/documentation/api-reference
ПРИМЕР ЗАПРОСА СВОЙСТВА В ДОКУМЕНТАЦИИ API:
$ curl https://api.dev.strike.acinq.co/api/v1/charges \
-u sk_pJDwxFxCVw5fQJhRRMpf29jReUjjN: \
-X POST \
-d amount=42000 \
-d currency="btc" \
-d description="1%20Blockaccino"
Вот мой код Arduino, я использую библиотеки ArduinoJson.h и WiFi.h:
// Connect to HTTP server
WiFiClient client;
client.setTimeout(10000);
if (!client.connect("api.strike.acinq.co", 80)) {
Serial.println(F("Connection failed"));
return;
}
Serial.println(F("Connected!"));
// Send HTTP request
client.println(F("GET /api/v1/charges?id=MYKEY&amount=4200¤cy=btc HTTP/1.0"));
client.println(F("Host: api.strike.acinq.co"));
client.println(F("Content-Type: application/x-www-form-urlencoded"));
client.println(F("Connection: close"));
if (client.println() == 0) {
Serial.println(F("Failed to send request"));
return;
}
// Check HTTP status
char status[32] = {0};
client.readBytesUntil('\r', status, sizeof(status));
if (strcmp(status, "HTTP/1.1 200 OK") != 0) {
Serial.print(F("Unexpected response: "));
Serial.println(status);
return;
}
401 «Неверный ключ API»самый близкий у меня есть.Я знаю, что API-ключ работает, и я просто неправильно его использую.Я попытался переместить ключ на:
client.println(F("id: MYKEY"));
, но это тоже не сработало.
Я пробовал другие библиотеки, и ArduinoJson кажется лучшим.Я думаю, что проблема в том, что это безопасный сервер и схема моего запроса.Я нашел много ресурсов для подключения к открытым API на Arduino, но ничего не для подключения к безопасным.Я думаю, что я почти там с кодом ...
ОБНОВЛЕНИЕ
Итак, я обновил свой код.Я все еще пытаюсь использовать ArduinoJson.Я могу подключиться к API, но он продолжает выплевывать «HTTP / 1.1 400 BAD_REQUEST».Я не знаю, погода это потому, что это через HTTPS или форматирование моего запроса.
В API-документах -u и -X нет имени поля, например "amount = 4200", поэтому я предполагаю, что -u просто добавится client.print("?="+apiKey);
//open weather map api key
String apiKey= "myapikey";
int status = WL_IDLE_STATUS;
char server[] = "api.strike.acinq.co";
Serial.println("\nStarting connection to server...");
// if you get a connection, report back via serial:
if (client.connect(server, 80)) {
Serial.println("connected to server");
// Make a HTTP request:
client.print("POST /api/v1/charges");
client.print("?="+apiKey);
client.print("&amount=4200");
client.print("¤cy='btc'");
client.println("&description='sweets'");
client.println("Host: api.strike.acinq.co");
client.println("Connection: close");
client.println();
}
else {
Serial.println("unable to connect");
}
ОБНОВЛЕНИЕ
Я понял, что println и print на самом деле что-то значат, и впоследствии организовал мой запрос намного лучше.Это все еще возвращается с 400 Несанкционированными?
String PostData = "&description=\"car\"&amount=1000¤cy=\"sweetsandthat\"";
client.println("POST /api/v1/charges HTTP/1.1");
client.println("Host: api.strike.acinq.co");
client.println("Authorization: Basic "+apiKey);
client.print("Content-Length: ");
client.println(PostData.length());
client.println(); // blank line required
client.println(PostData);
Serial.println("POSTED DATA: " + PostData);
// client.stop();
client.println();
} else {
Serial.println("unable to connect");
}
delay(1000);
String line = "";
while (client.connected()) {
line = client.readStringUntil('999');
Serial.println(line);
Serial.println("parsingValues");
//create a json buffer where to store the json data
StaticJsonBuffer<5000> jsonBuffer;
JsonObject& root = jsonBuffer.parseObject(line);
if (!root.success()) {
Serial.println("parseObject() failed");
return;
}
//get the data from the json tree
String nextWeatherTime0 = root["id"][0];
// Print values.
Serial.println(nextWeatherTime0);
}
client.println("Connection: close");
client.stop();
}