Skocz do zawartości

Zmiana funkcji na wysyłanie przez httpCliemt.PATCH


Pomocna odpowiedź

Jak zrobię tak:

typedef struct suplaRel {
     String *adress;
     String *code;
     String *action;
 };
suplaRel suplaBaza[2] = {
    {"https://svrxx.supla.org/direct/x", "x", "toggle"},
    {"https://svrx.supla.org/direct/x", "x", "toggle"}
 };

to dostaję w kompilacji:

 

Zrzut ekranu 2024-12-18 192226.png

17 minut temu, SOYER napisał:

Jak zrobię tak:

typedef struct suplaRel {
     String *adress;
     String *code;
     String *action;
 };
suplaRel suplaBaza[2] = {
    {"https://svrxx.supla.org/direct/x", "x", "toggle"},
    {"https://svrx.supla.org/direct/x", "x", "toggle"}
 };

to dostaję w kompilacji:

 

Zrzut ekranu 2024-12-18 192226.png

ale gdzie tu const char?

To działa:

const char* suplaAdres[2] = {
    {"https://svrx.supla.org/direct/xx"},
    {"https://svrx.supla.org/direct/xx"}
 };
const char*  suplaCode[2] = {
    {"xx"},
    {"xx"}
 };
 const char*  suplaAction[2] = {
    {"xx"},
    {"xx"}
 };

void httpPOSTsupla() {
  WiFiClientSecure client1;
  HTTPClient http1;
  client1.setInsecure();
  http1.begin(client1, suplaAdres[1]);
  http1.addHeader("Content-Type", "application/json");
  http1.addHeader("Accept", "application/json");
JsonDocument doc;
String track;
doc["code"] = suplaCode[1];
doc["action"] = suplaAction[1];
serializeJson(doc, track);
  int httpResponseCode = http1.PATCH(track);

  String payload = "{}"; 
  
  if (httpResponseCode>0) {
    Serial.print("HTTP Response code: ");
    Serial.println(httpResponseCode);
    payload = http1.getString();
  }
  else {
    Serial.print("Error code: ");
    Serial.println(httpResponseCode);
  }
  client1.stop();
  http1.end();
}

a to nie:

  struct suplaRel {
     const char *adress;
     const char *code;
     const char *action;
 };
suplaRel suplaBaza[2] = {
    {"https://svrxx.supla.org/direct/xx", "xx", "toggle"},
    {"https://svrx.supla.org/direct/x", "x", "toggle"}
 };

void httpPOSTsupla() {
  WiFiClientSecure client1;
  HTTPClient http1;
  client1.setInsecure();
  http1.begin(client1, suplaBaza[1].adress);
  http1.addHeader("Content-Type", "application/json");
  http1.addHeader("Accept", "application/json");
JsonDocument doc;
String track;
doc["code"] = suplaBaza[1].code;
doc["action"] = suplaBaza[1].action;
serializeJson(doc, track);
  int httpResponseCode = http1.PATCH(track);

  String payload = "{}"; 
  
  if (httpResponseCode>0) {
    Serial.print("HTTP Response code: ");
    Serial.println(httpResponseCode);
    payload = http1.getString();
  }
  else {
    Serial.print("Error code: ");
    Serial.println(httpResponseCode);
  }
  client1.stop();
  http1.end();
}

Nie wiem czemu.

(edytowany)

@SOYER , stworzyłeś strukturę "suplaRel" zawierającą 3 wskaźniki do obiektów typu "String", po czym wskazałeś nimi na ciągi "const char *", które takimi obiektami nie są, dlatego kompilator nie zgadza się. Jeżeli upierasz się na obiekty typu String:

struct suplaRel {
	String adress, code, action; // obiekty, nie wskaźniki do obiektów
};

suplaRel suplaBaza[/* tu możesz zadeklarować rozmiar tablicy, ale nie musisz */] = {
		{"https://svrxx.supla.org/direct/xxx", "xxxxxx1", "toggle"},
		{"drugi adres", "xxx2", "toggle"},
		{"trzeci adres", "xxx3", "toggle"} // na końcu nie ma przecinka
	};

/*
wtedy np.
"xsuplaBaza[0].adress" zawiera "https://svrxx.supla.org/direct/xxx"

xsuplaBaza[1].code => "xxx2"

itd.
*/


Możesz obiekty typu string zrobić "stałymi", żeby nie zmienić przez przypadek wartości, kompilator też sypnie wtedy jakimiś błędami.

struct suplaRel {
	const String adress, code, action;
};
Edytowano przez orb777
  • Pomogłeś! 1
(edytowany)
1 godzinę temu, SOYER napisał:

a to nie:

A co gada? Trochę trudno połapać się.

Tu np. przestrzeliłeś index, odniosłeś się do nieistniejącego => http1.begin(client1, suplaBaza[1].adress).

 

Edytowano przez orb777

Cześć, to działa, tzn. kompiluje się i wysyła prawidłowego PATCHa, serwer reaguje kodem 202:

String suplaAdres[2] = {
    {"https://svrx.supla.org/direct/xx"},
    {"https://svrx.supla.org/direct/xx"}
 };
String  suplaCode[2] = {
    {"xx"},
    {"xx"}
 };
String  suplaAction[2] = {
    {"xx"},
    {"xx"}
 };

void httpPOSTsupla() {
  WiFiClientSecure client1;
  HTTPClient http1;
  client1.setInsecure();
  http1.begin(client1, suplaAdres[1]);
  http1.addHeader("Content-Type", "application/json");
  http1.addHeader("Accept", "application/json");
JsonDocument doc;
String track;
doc["code"] = suplaCode[1];
doc["action"] = suplaAction[1];
serializeJson(doc, track);
  int httpResponseCode = http1.PATCH(track);

  String payload = "{}"; 
  
  if (httpResponseCode>0) {
    Serial.print("HTTP Response code: ");
    Serial.println(httpResponseCode);
    payload = http1.getString();
  }
  else {
    Serial.print("Error code: ");
    Serial.println(httpResponseCode);
  }
  client1.stop();
  http1.end();
}

a to:

  struct suplaRel {
    String adres;
    String code;
    String action;
 };
suplaRel suplaBaza[] = {
    {"https://svrxx.supla.org/direct/xx", "xx", "toggle"}

 };

void httpPOSTsupla() {
  WiFiClientSecure client1;
  HTTPClient http1;
  client1.setInsecure();
  http1.begin(client1, suplaBaza[1].adres);
  http1.addHeader("Content-Type", "application/json");
  http1.addHeader("Accept", "application/json");
JsonDocument doc;
String track;
doc["code"] = suplaBaza[1].code;
doc["action"] = suplaBaza[1].action;
serializeJson(doc, track);
   int httpResponseCode = http1.PATCH(track);
//"{\"code\": "+ String(suplaCode[1]) +",\"action\":" + String(suplaAction[1]) +"}"
  String payload = "{}"; 
  
  if (httpResponseCode>0) {
    Serial.print("HTTP Response code: ");
    Serial.println(httpResponseCode);
    payload = http1.getString();
  }
  else {
    Serial.print("Error code: ");
    Serial.println(httpResponseCode);
  }
  client1.stop();
  http1.end();
}

kompiluje się, ale zwraca -1

Dziękuję wszystkim za pomoc.

To teraz @ethanak napisz proszę dlaczego to niedobra jest:

if (httpResponseCode>0) {
    Serial.print("HTTP Response code: ");
    Serial.println(httpResponseCode);
    payload = http1.getString();
  }
  else {
    Serial.print("Error code: ");
    Serial.println(httpResponseCode);
  }

ja tą linijkę: if (httpResponseCode>0) rozumiem "jeśli jest odpowiedź serwera to pokaż jaka to odpowiedź( i sam sobie sprawdź co oznacza sam kod)

Dlaczego to niedobre jest tak pisać?

(edytowany)

@SOYER , dlatego: https://pl.wikipedia.org/wiki/Kod_odpowiedzi_HTTP

Serwer odpowiada różnie i na tej podstawie wiesz, czy dostałeś właściwe dane, czy nie. Raz serwer odpowie "200" (tj. masz tu dane na które czekałeś), innym razem "404", czyli "nimom tego", kiedy chociażby pomylisz coś w zapytaniu lub faktycznie nie ma tego na serwerze. To, że serwer odpowiada >0, znaczy tylko tyle, że jest online, a nie "od ręki dostępny właściwy zasób".

Edytowano przez orb777
  • Pomogłeś! 1

Znam te kody, w sensie wiem, że należy sprawdzić co oznaczają.

Jak w takim razie prawidłowo napisać ten fragment kodu? Przecież nie będziemy robić tylu if lub case i każdego opisywać. 

Uzupełniając @orb777.

Jeśli httpResponseCode < 0 to mamy jakiś błąd i nie udało się połączyć z serwerem.

Jeśli httpResponseCode > 0 to mamy połączenie z serwerem, ale niekoniecznie otrzymaliśmy dane. Tylko dla kodu "200" mamy pewność, że dane są.

if (httpResponseCode == 200) {
    payload = http1.getString();
  }
  else {
    Serial.print("Error code: ");
    Serial.println(httpResponseCode);
  }

 

  • Pomogłeś! 1

@SOYER , możesz też użyć switch, to już zależy od ciebie.

if (httpResponseCode > 0) { // sprawdza ogólnikowo, że dostałeś jakąś odpowiedź od serwera
	Serial.print("HTTP Response code: ");
	Serial.println(httpResponseCode);

	switch(httpResponseCode){
		case 200: payload = http1.getString(); break; // ok, więc zapisujesz dane
		case 404: /* jeżeli chcesz jakoś zareagować na brak zasobu */ break;
		// itd
		default: /* to ogarnia resztę kodów > 0, jeżeli potrzebujesz jakiejś reakcji na nie */ break;
	}
}
else {
	Serial.print("Error code: ");
	Serial.println(httpResponseCode); // w tym przypadku pewnie -1
}

 

  • Pomogłeś! 1

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...