Запрос PUT: PHP-код для Arduino HTTPClient
Я загружаю файл в хранилище BLOB-объектов Azure с помощью запроса REST API. Файл успешно загружен с помощью запроса PHP curl. Но когда я передаю код в HTTP-клиент ESP32, я получаю сообщение об ошибке аутентификации. Я также проверяю ключ HMAC, сгенерированный кодом ESP32 Arduino, в коде PHP. Я думаю, что я что-то упускаю при добавлении заголовка. Вот мой PHP-код:
$header = array (
"x-ms-blob-type: BlockBlob",
"x-ms-date: " . $date,
"x-ms-version: " . $version,
"Authorization: SharedKey account_name:" . $signature_str,
"Content-Type: text/plain; charset=UTF-8",
"Content-Length: " . strlen($fdata),
);
$url = "https://acount_name.blob.core.windows.net/container/test.txt";
$ch = curl_init ();
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt ( $ch, CURLOPT_CUSTOMREQUEST, 'PUT' );
curl_setopt ( $ch, CURLOPT_URL, $url );
curl_setopt ( $ch, CURLOPT_RETURNTRANSFER, true );
curl_setopt ( $ch, CURLOPT_HTTPHEADER, $header);
curl_setopt($ch, CURLOPT_POSTFIELDS, $fdata);
curl_setopt ( $ch, CURLOPT_HEADER, True );
echo($ch);
curl_exec ( $ch );
а вот соответствующий код Arduino IDE:
String sig = get_hmac();
Serial.println(sig);
if (WiFi.status() == WL_CONNECTED) { //Проверяем статус соединения WiFi
HTTPClient http;
http.begin("https://account_name.blob.core.windows.net/container/test.txt"); // Указываем место назначения для HTTP-запроса
http.addHeader("x-ms-blob-type", "BlockBlob");
http.addHeader("x-ms-date", Date);
http.addHeader("x-ms-version", "2018-03-28");
http.addHeader("Authorization", "SharedKey account_name:"+sig);
http.addHeader("Content-Type", "text/plain; charset=UTF-8");
http.addHeader("Content-Length", "20");
int httpResponseCode = http.PUT(d);
if (httpResponseCode > 0) {
String response = http.getString();
Serial.println(httpResponseCode);
Serial.println(response);
} else {
Serial.print("Error on sending POST: ");
Serial.println(httpResponseCode);
}
http.end(); //Свободные ресурсы
} else {
Serial.println("Error in WiFi connection");
}
Я получаю сообщение об ошибке:
Подпись MAC, найденная в HTTP-запросе 'sVrSFpplX+Gkcb4R/iSDf6eqUP4srkZuVD68/pAeYwE=' не совпадает с любым вычисленная подпись.....
Хотя подпись HMAC, созданная из той же строки, работает в PHP вот справочная страница API: https://docs.microsoft.com/en-us/rest/api/storageservices/ положить-блоб Спасибо
@Dani, 👍1
Обсуждение1 ответ
Лучший ответ:
Я получил подсказку из ответа @esoterik и смог успешно отправить запрос. Проблема заключалась в добавлении параметра заголовка:
http.addHeader("Content-Length", "20");
Это дублирует заголовок (второй добавлен в методе PUT). Я просто комментирую это, и код работает. Спасибо за каждый ответ
- HTTP POST от Arduino/ESP8266/ESP32 Как отправлять параметры (x-www-form-urlencoded)
- AsyncWebServer дает сброс wdt
- Точка доступа ESP32 и веб сервер HTTP, как отправить несколько параметров?
- esp32 http client response только 200 не получил данные после этого
- EspAsyncWebServer обрабатывает HTTPS в HTTP
- Использование ESPAsyncWebServer.h с ArduinoJson версии 6 для транзакций мастер-клиент
- ArduinoHTTPClient POST multipart/form-data с SD-карты, возвращающий 400 неверных запросов
- HTTPS GET request работает на esp32 но не на esp8266
http.PUT(d);
добавляет заголовок Content-length, заголовок Host, заголовок User-Agent, заголовок Accept-Encoding и заголовок Connection. Это нормально для авторизации SharedKey?, @JurajПохоже, что это сообщение об ошибке исходит от веб-службы; похоже, что это может быть больше отладка веб-сервиса, чем арудино. Какой код состояния вы получаете?, @esoterik
первый код использует «SharedKey mikeiot», второй код использует «SharedKey account_name:», может ли это быть проблемой? Вы также жестко кодируете длину содержимого во втором коде, возможно, вы отправляете неправильную сумму?, @esoterik
@Juraj Мне нужен собственный заголовок, как указано в коде Arduino «addHeader». Можно отправлять эти заголовки. я должен пропустить заголовок Content-length?, @Dani
@esoterik Я получаю код ответа 403 от сервера и сообщение об ошибке, показанное в сообщении, @Dani
@esoterik имя учетной записи такое же в коде, просто измените описание сообщения. Теперь я его отредактировал, @Dani