Skocz do zawartości

Zmiana funkcji na wysyłanie przez httpCliemt.PATCH


SOYER

Pomocna odpowiedź

Cześć, kto pomoże bo za bardzo nie kumam.

Mam taką funkcję, pięknie działa i zmienia stan przekaźnika na innym esp poprzez serwer supli:

void httpPOSTsupla() {
  WiFiClientSecure client1;
  HTTPClient http1;
  client1.setInsecure();
  http1.begin(client1, "https://svrxx.supla.org/direct/x/xxx/toggle");
  //http1.addHeader("Content-Type", "application/json");
  //http1.addHeader("Accept", "application/json");
  int httpResponseCode = http1.GET();
  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();

}

Jak ją przerobić na taką wysyłającą PATCH, podobno jest bezpieczniejsza od zwykłego linku bezpośredniego.

Oto dane które musimy zawrzeć, zresztą są też w funkcji powyżej

curl -s -H "Content-Type: application/json" -H "Accept: application/json" -X PATCH -d '{"code":"KOD TWOJEGO LINKU","action":"toggle"}' https://svrxx.supla.org/direct/xxx

Jak to napisać? Zawołam @ethanak bo on ma takie rzeczy w małym palcu.

Edytowano przez SOYER
Link do komentarza
Share on other sites

Żeby Cię @ethanak za bardzo nie męczyć , to już nadmieniam, że będzie kilka takich adresów, czyli contentType zostaje taki sam, Accept podobnie zmienia się adres https..... i zmienia się code i action. Wprawdzie po ostatniej Twojej lekcji powinienem i umiem(?) utworzyć strukturę i z niej korzystać w funkcji, ale tylko piszę żebyś wiedział co robię(robimy).

Link do komentarza
Share on other sites

(edytowany)

Przygotowałem strukturę:

const struct suplaRel {
    const char *code;
    const char *action;
    const char *adress;
} 
   suplaRelays[4] = {
    {"xxx","open-close","https://svrxx.supla.org/direct/xx1"},//brama1
    {"xxx","open-close","https://svrxx.supla.org/direct/xx2"},//brama2
    {"xxx","toggle","https://svrxx.supla.org/direct/xx3"},//lampoa1
    {"xxx","toggle","https://svrxx.supla.org/direct/xx4"},//lampa2
   };

 

Nie wiem jak zbudować PATCHa...

Edytowano przez SOYER
Link do komentarza
Share on other sites

30 minut temu, SOYER napisał:

Nie wiem jak zbudować PATCHa...

Co rozumiesz przez "zbudować PATCHa"? Bo robi się to tak samo jak POST, tylko wywołujesz httpCliemt.PATCH a nie httpClient.POST

Fragment pliku HTTPClient.h (zajrzałem do Twojego dysku i tam znalazłem):

    /// request handling
    int GET();
    int PATCH(uint8_t * payload, size_t size);
    int PATCH(String payload);
    int POST(uint8_t * payload, size_t size);
    int POST(String payload);
    int PUT(uint8_t * payload, size_t size);
    int PUT(String payload);
    int sendRequest(const char * type, String payload);
    int sendRequest(const char * type, uint8_t * payload = NULL, size_t size = 0);
    int sendRequest(const char * type, Stream * stream, size_t size = 0);

    void addHeader(const String& name, const String& value, bool first = false, bool replace = true);

 

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

(edytowany)

Dzięki za zainteresowanie tematem.

Już wyjaśniam moją niewiedzę.

W mojej funkcji mamy:

http1.begin(client1, "https://svrxx.supla.org/direct/x/xxx/toggle");

http1.begin(client1, "xxx");

co wstawić zamiast xxx i dlaczego, z tego wspomnianego ciągu:

curl -s -H "Content-Type: application/json" -H "Accept: application/json" -X PATCH -d '{"code":"KOD TWOJEGO LINKU","action":"toggle"}' https://svrxx.supla.org/direct/xxx

potem mamy jak rozumiem:

httpResponseCode = http1.PATCH("xxx");

i co tutaj pod iksami?

no i jest jeszcze to:

 http1.addHeader("Content-Type", "application/json");
 http1.addHeader("Accept", "application/json");

Wytłumacz, wiesz tak jak to mnie...

Cały czas opieram się na tym:

https://randomnerdtutorials.com/esp8266-nodemcu-http-get-post-arduino/

Edytowano przez SOYER
Link do komentarza
Share on other sites

(edytowany)
3 minuty temu, ethanak napisał:

A tego co ma być w payload nie wiem - nie znam się na supłach 😞

supla mówi, że ma być to:

curl -s -H "Content-Type: application/json" -H "Accept: application/json" -X PATCH -d '{"code":"KOD TWOJEGO LINKU","action":"toggle"}' https://svrxx.supla.org/direct/xxx

 

wkleiłem przecież, tylko nie wiem co gdzie wstawić...

Edytowano przez SOYER
Link do komentarza
Share on other sites

To zacznij myśleć. Masz w parametrach curla to co trzeba wysłać (jak nie wiesz gdzie to wpisz w gógla "man curl" i przestudiuj co znaczą parametry). A potem wyciągnij wniosek, że pewnie to im trzeba wysłać... a gdzie wstawić to masz tylko jedną możliwość, mianowicie jako parametr dla httpclient.PATCH

Dobra, znaj moje dobre serce: parametr -d (czyli --data).

Link do komentarza
Share on other sites

22 godziny temu, ethanak napisał:

Co rozumiesz przez "zbudować PATCHa"? Bo robi się to tak samo jak POST, tylko wywołujesz httpCliemt.PATCH a nie httpClient.POST

Kluczowe zdanie, dziękuję. Działa.

void httpPOSTsupla() {
WiFiClientSecure client1;
HTTPClient http1;
client1.setInsecure();
http1.begin(client1, "https://svrxx.supla.org/direct/xxx");
http1.addHeader("Content-Type", "application/json");
http1.addHeader("Accept", "application/json");

int httpResponseCode = http1.PATCH("{\"code\":\"xxx\",\"action\":\"toggle\"}");

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();
}

Kto mi jeszcze wyjaśni dlaczego takie wywołanie linka bezpośredniego jest bezpieczniejsze od zwykłego posta, np jeśli sterujemy czymś ważnym.

Link do komentarza
Share on other sites

Ja nie wyjaśnię dlaczego patch jest bezpeczniejszy od post. Imho to przerost formy nad treścią, w dodatku sprawia pewne problemy np. w konfiguracji proxy.

Uzywam REST  w paru dość poważnych aplikacjach (jako klient) i tam jest wszystko wysyłane normalnie przez post... no chyba że dane o temperaturze w sraczu to coś ważniejszego niż dane klienta (wrażliwe) i wystawiana faktura.

A jak jeszce raz pokażesz code > 0 to pojadę do tych Kryrów i ręcznie wyjaśnię co to są kody http 🙂

Edytowano przez ethanak
Link do komentarza
Share on other sites

23 minuty temu, ethanak napisał:

code > 0

code > 0

code > 0

code > 0

code > 0

Dla mnie to znaczy, "jeśli COKOLWIEK pojawiło się w odpowiedzi"... dlaczego to złe?

Piwko się chłodzi, zapraszam. Poważnie.

Równie poważnie zaprałem się za zrobienie tego na strukturze i mam exeption code, wiem, że to lubicie;):

#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>
#include <ArduinoJson.h>
#include <Timers.h>
#include <stdio.h>
 struct suplaRel {
    const char *adress;
    const char *code;
    const char *action;
 };
 struct suplaRel suplaBaza[1] = {
    {"https://svrxx.supla.org/direct/xxx", "xxxxxx", "toggle"},//brama1
 };
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");

  int httpResponseCode = http1.PATCH("{\"code\":suplaBaza[1].code,\"action\":suplaBaza[1].action}");
  
  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();
}

no i mam ładne:

18:25:04.921 -> --------------- CUT HERE FOR EXCEPTION DECODER ---------------
18:25:05.015 -> 
18:25:05.015 -> Exception (28):
18:25:05.015 -> epc1=0x4020dca0 epc2=0x00000000 epc3=0x00000000 excvaddr=0x000003e8 depc=0x00000000
18:25:05.108 -> 
18:25:05.108 -> >>>stack>>>
18:25:05.108 -> 
18:25:05.108 -> ctx: cont
18:25:05.155 -> sp: 3ffffd60 end: 3fffffd0 offset: 0150
18:25:05.155 -> 3ffffeb0:  3ffef684 000003e8 3fffff7c 40205a90  
18:25:05.202 -> 3ffffec0:  4000050c 00000001 00000000 40201335  
18:25:05.296 -> 3ffffed0:  00000000 00000000 00000010 00000000  
18:25:05.343 -> 3ffffee0:  40010000 40001388 00000000 00000001  
18:25:05.389 -> 3ffffef0:  00000000 00000000 3fffd9d0 00000000  
18:25:05.437 -> 3fffff00:  00000000 00000000 00000000 00000000  
18:25:05.483 -> 3fffff10:  00000000 00000000 3ffef75c 0011001f  
18:25:05.530 -> 3fffff20:  80000000 00000000 00000000 00000000  
18:25:05.578 -> 3fffff30:  ffffffff 3ffee800 00000000 3ffe000a  
18:25:05.625 -> 3fffff40:  00000000 000028a1 00000000 00000000  
18:25:05.719 -> 3fffff50:  00000000 40209c34 00000000 00001388  
18:25:05.719 -> 3fffff60:  3fffdad0 00000000 00000000 00000000  
18:25:05.813 -> 3fffff70:  3ffef684 3ffef684 3ffef8fc 00000000  
18:25:05.859 -> 3fffff80:  00000000 00000000 0147ae14 3ffee850  
18:25:05.906 -> 3fffff90:  3fffdad0 3ffee748 00000000 40204c22  
18:25:05.953 -> 3fffffa0:  3fffdad0 00000000 3ffee748 40201472  
18:25:06.000 -> 3fffffb0:  00000000 00000000 3ffee824 402069b4  
18:25:06.046 -> 3fffffc0:  feefeffe feefeffe 3fffdab0 40100c39  
18:25:06.093 -> <<<stack<<<
18:25:06.093 -> 
18:25:06.093 -> --------------- CUT HERE FOR EXCEPTION DECODER ---------------

why?

Link do komentarza
Share on other sites

Dobra, miałem przecinek niepotrzebny:

 {"https://svrxx.supla.org/direct/xxx", "xxxxxx", "toggle"},//brama1

Jednak teraz mam "tylko" error code -1

czyli gdzieś coś pokaszanione z typami danych...

jakie rodzaje zmiennych w strukturach zrobić i jak to wysłać żeby łykał serwer?

Link do komentarza
Share on other sites

(edytowany)

Na pewno miałem źle napisanego PATCHa, powinno być chyba tak:

int httpResponseCode = http1.PATCH("{\"code\":"+String(suplaBaza[1].code)+",\"action\":"+String(suplaBaza[1].action)+"}");

teraz mam http code 400

zastanawia mnie ten typ danych w tablicy const char, a wysyłam jako String... 

Edytowano przez SOYER
Link do komentarza
Share on other sites

8 minut temu, ethanak napisał:

A kod 400 oznacza "coś ci się pozajączkowało".

wiem

8 minut temu, ethanak napisał:

Podawałem link.. tak ciężko przeczytać co który kod znaczy?

bo czytałem, nie pierwszy raz mam 400 więc wiem, że się pozajączkowało, ale co?

 

9 minut temu, ethanak napisał:

Masz albo const char * i wtedy podajesz długość,albo String.

tego zdania nie rozumiem

Link do komentarza
Share on other sites

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...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.