Как получить ответ JSON от REST API с помощью Edu8266 Arduino Framework - PullRequest
0 голосов
/ 22 февраля 2019

Я пытаюсь использовать Beyond Verbal RST API для публикации данных голосового образца по методу HTTP post из ESP8266.Первым шагом для обмена данными API является получение токена доступа с помощью метода POST.Вы можете проверить следующие коды.С этим кодом я просто получаю ответ «не удалось опубликовать» на последовательном выходе.

#include <ArduinoJson.h>
#include <ESP8266WiFi.h>
#include <WiFiClientSecure.h>
#include <ESP8266HTTPClient.h>
const char *ssid = "xxxxxx";
const char *pass = "xxxxxx";
String token;

HTTPClient https;
WiFiClientSecure client;
String getRecordID(String stoken);

void setup() {

Serial.begin(115200);
Serial.println("connecting to network..");
WiFi.begin(ssid, pass);

while (WiFi.status() != WL_CONNECTED) {
      delay(500);
      Serial.print(".");
}
Serial.println("conntected to network..");
}



void loop() {

String ret;
token = getAccessToken();
delay(2000);
Serial.println(token);
}




String getAccessToken(){
//    client.setInsecure();
  const char * host = "token.beyondverbal.com";
  const uint16_t port = 443;
  const char * path = "/token";

  StaticJsonBuffer<1000> jb;
  String res;
  Serial.println("conntecting to server..");

  if (https.begin(client, host, port, path)) {
    https.addHeader("Content-Type", "x-www-formurlencoded");
    int httpsCode = https.POST("grant_type=client_credentials&apiKey=1d0956a4-3deb-431a-b3e0-45f5c371fe99");
        if (httpsCode > 0) {
              if (httpsCode == HTTP_CODE_OK) {
                JsonObject& obj = jb.parseObject(https.getString());
                String token = obj["access_token"];
                if (obj.success()) {
                   res =  token;
                } else {
                    res = "failed to parse json";
                }                
              }
        } else {
            res = "failed to Post";
        }
   } else {
    res = "failed to connect to server";
   } 
https.end();
return res;
}

Ознакомьтесь с документацией к руководству и ознакомьтесь с разделом аутентификации.Я следовал за шагами и попробовал несколькими способами, но все еще не удача.

Но мой код API и другие параметры в порядке.Я попробовал метод публикации API из аддона Mozilla Firefox и другой платформы.Отовсюду я успешно получил токен.Но я все еще не могу получить токен с моим кодом.

Пожалуйста, проверьте и мне решение этой проблемы.

1 Ответ

0 голосов
/ 22 февраля 2019

Используйте эти библиотеки. ESPAsyncTCP , asyncHTTPrequest

, затем используйте следующий код.Код для образца.

#include <ESPAsyncTCP.h>
#include <asyncHTTPrequest.h>

asyncHTTPrequest client;
asyncHTTPrequest client2;

void onClientStateChange(void * arguments, asyncHTTPrequest * aReq, int readyState) {
  Serial.println(readyState);
  switch (readyState) {
    case 0:
      // readyStateUnsent     // Client created, open not yet called
      break;

    case 1:
      // readyStateOpened     // open() has been called, connected
      break;

    case 2:
      // readyStateHdrsRecvd  // send() called, response headers available
      break;

    case 3:
      // readyStateLoading    // receiving, partial data available
      break;

    case 4:
      // readyStateDone       // Request complete, all data available.
#ifdef SERIAL_DEBUG
      Serial.println(aReq->responseHTTPcode());
#endif
      if (aReq->responseHTTPcode() != 200) {
#ifdef SERIAL_DEBUG
        Serial.println("return");
#endif
        return;
      }
      String response = aReq->responseText();
#ifdef SERIAL_DEBUG
      Serial.println(response.c_str());
#endif
      break;
  }
}

void setupClient() {
  String URL = "dummy.restapiexample.com/api/v1/create";

  client.setTimeout(5);
  client.setDebug(false);
  client.onReadyStateChange(onClientStateChange);

  client.open("POST", URL.c_str());
  client.setReqHeader("Content-Type", "application/json");
  client.send("{\"name\":\"test\",\"salary\":\"123\",\"age\":\"23\"}");

  String URL2 = "jsonplaceholder.typicode.com/users";

  client2.setTimeout(5);
  client2.setDebug(false);
  client2.onReadyStateChange(onClientStateChange);

  client2.open("GET", URL2.c_str());
  client2.send();
}

Всегда подключайтесь к асинхронному клиенту, поскольку он не будет блокировать основное выполнение, пока вы не получите ответ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...