ESP8266: HTTP GET Requests

The objective of this post is to explain how to perform GET Requests using the ESP8266.


Introduction

The objective of this post is to explain how to perform GET Requests using the ESP8266. If you prefer a video explanation, you can check my YouTube channel:

The tests were performed using a NodeMCU board, a very cheap and easy to use ESP8266 board.


Setup

First, we need do include some libraries. Naturally, we need the ESP8266WiFi library, which provides us the methods to connect to a WiFi network.

Then, we need the ESP8266HTTPClient library, which provides methods to send HTTP requests. The header file for the ESP8266HTTPClient library can be seen here.

#include <esp8266wifi.h>
#include <esp8266httpclient.h>

On the setup function, we connect to the WiFi Network. We also start a Serial connection for debugging. More details about how to connect to a WiFi network using the ESP8266 are explained in this previous post.

const char* ssid = "yourNetworkName";
const char* password = "yourNetworkPassword";

void setup () {

  Serial.begin(115200);
  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {

    delay(1000);
    Serial.print("Connecting..");

  }

}


The main code

The code for the request will be specified in the main loop function. First, we declare an object of class HTTPClient, which we will simply call http. This class provides the methods to create and send the HTTP request.

HTTPClient http;

After that, we call the begin method on the http object and pass the URL that we want to connect to and make the GET request. The destination website specified here implements a dummy REST API for testing and prototyping.

http.begin("http://jsonplaceholder.typicode.com/users/1");

Then, we send the request by calling the GET method on the http object. This method will return the status of the operation, which is important to store for error handling. If the value is greater than 0, then it’s a standard HTTP code. If the value is less than 0, then it’s a client error, related with the connection. All available error codes for this method are listed here.

int httpCode = http.GET();

So, if the code is greater than 0, we can get and print the response payload, by calling the getString method on the http object.

String payload = http.getString();
Serial.println(payload);

Finally, we call the end method. This is very important to close the TCP connection and thus free the resources.

http.end();

The final complete code is shown bellow. You just need to put your network name and network password.

#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>

const char* ssid = "yourNetworkName";
const char* password = "yourNetworkPassword";

void setup () {

  Serial.begin(115200);
  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {

    delay(1000);
    Serial.print("Connecting..");

  }

}

void loop() {

  if (WiFi.status() == WL_CONNECTED) { //Check WiFi connection status

    HTTPClient http;  //Declare an object of class HTTPClient

    http.begin("http://jsonplaceholder.typicode.com/users/1");  //Specify request destination
    int httpCode = http.GET();                                                                  //Send the request

    if (httpCode > 0) { //Check the returning code

      String payload = http.getString();   //Get the request response payload
      Serial.println(payload);                     //Print the response payload

    }

    http.end();   //Close connection

  }

  delay(30000);    //Send a request every 30 seconds

}

The output of the program is shown in figure 1. The response corresponds to a JSON payload.

ESP8266 GET Request

Figure 1 – Output of the GET Request.

Finally, it’s important to take in consideration that the microcontroller has a limited amount of resources and thus it is not able to handle very large results. So, it is not expected that it will be used to make and process requests to sites that return a lot of information, as a typical browser would do.


Technical details

ESP8266 libraries: v2.3.0

Advertisements

139 Replies to “ESP8266: HTTP GET Requests”

    1. Hi! It doesn’t show anything after making the HTTP request or even at the beginning, when connecting to the WiFi network?

      If you don’t see a “Connecting..” message right after uploading the code, it’s probable that there is some problem with the hardware or the baud rate of the serial monitor is not matching the baud rate defined in the code. Is your serial monitor configured for 115200 baud?

      If it is after the request, it may have been some temporary problem with the destination website. Can you access the URL directly in your web browser?

      If you changed the example website provided in this tutorial to other website that returns a lot of content as response to the HTTP request, then the ESP may have not been capable of handling so much data.

      Like

        1. Hi,

          You are trying to do an HTTPS request, which means the connection is secured (the S stands for secure).

          The tutorial is applicable to HTTP requests, which is why it is not working for the URL you mentioned.

          I haven’t yet tried HTTPS on the ESP8266 but there was an example in the Arduino libraries:
          https://github.com/esp8266/Arduino/blob/master/libraries/ESP8266WiFi/examples/HTTPSRequest/HTTPSRequest.ino

          https://github.com/esp8266/Arduino/blob/master/doc/esp8266wifi/client-secure-examples.rst

          I remember that at the time the HTTPS support was very limited on the ESP8266 due to memory constraints. For example, it was not possible to validate the whole certificate chain, which is crucial when working with HTTPS.

          I don’t know if things have evolved since then on the ESP8266, but I can confirm however that HTTPS works well on the ESP32:
          https://techtutorialsx.com/2017/11/18/esp32-arduino-https-get-request/

          The ESP32 is more capable for handling the computation and memory requirements needed for secure connections, so if you are looking for something scalable which needs HTTPS I would recommend you to check the ESP32.

          Hope this helps,
          Nuno Santos

          Like

      1. Hi!

        Did you run the code multiple times? maybe it was a temporary unavailability on the website. Or is it occurring always?

        Are you able to send requests to other websites with the code from the tutorial?

        Like

  1. Pingback: techtutorialsx
    1. Hi! This already has the full code. Do you mean putting it all together from the beginning to the end in a section of the post, like I’ve been doing in more recent posts? If so, sure, I will update the post as soon as I can with a section listing all the code.

      Like

        1. Hi, I think there is no problem with sending a request per second. Nevertheless, if you need to guarantee that rate, maybe you should go to something a little more optimized, such as direct socket connection. That way, you don’t have the overhead of the HTTP protocol and the need to connect / disconnect each time you are sending a request. With the socket, you can leave it open while you need.

          I don’t know of a way to directly send the data to a SQL database using the ESP. The protocols used to access the DB are different, unless you can find a way to expose the database functionality directly over HTTP.

          So, for using the code shown here, the easiest way is to develop a server application (for example, in Python or Java) that receives the data from the ESP via HTTP and then inserts it on the MySQL database using a suitable protocol.

          Hope it helps

          Like

          1. Thank you for your reply!
            I am using php to insert data into mysql. The process of sending a request is about 2 to 3 seconds. The is not what i want. Direct socket connection? How to use it?

            Like

            1. Hi!

              Sockets are lower level mechanisms to allow computers (and now, microcontrollers such as the ESP8266) to communicate through a network. So, HTTP is actually a protocol that works on top of socket communication. You can read a lot about sockets around the web, it’s a very well known and documented mechanism.

              I have no tutorial yet on how to use them, but in the libraries for the Arduino IDE there is a very nice example that you can adapt, for the ESP8266:
              https://github.com/esp8266/Arduino/blob/master/libraries/ESP8266WiFi/examples/WiFiClient/WiFiClient.ino

              But please note that in the example they are building the HTTP protocol by hand, on top of the socket connection, which would have the same result. In your case, moving to socket oriented communication with increased performance would need some changes, both in the ESP code and the server, to keep the connection alive. Probably you may not want to do this kind of changes.

              In your case, it seems that you are having performance issues, maybe with the php server, which you can try to optimize in order to achieve the desired rate. Have you tried to make the request to your php page from other tool, just to confirm if you can do a request per second? That way you can confirm if the problem is on the ESP8266 side or on the php server side.

              Do you insert the data on the database synchronously? If so, you leave the ESP8266 waiting for the procedure to conclude, which takes some time. One approach could be returning an immediate response to the ESP and then inserting the data asynchronously.

              You can also try to measure the execution time of the different procedures you have in your php page, to check where it is taking more time and trying to optimize.

              Like

  2. Hey, I have a working http request working, except what you don’t cover in this tutorial is the ability to use specific json data. I have been searching everywhere to achieve this, but without any results. Can you please help me how I would get the value of a json key, such as street name, and save it in a variable. Thanks in advance!

    Liked by 1 person

  3. Hey, I have a working http request working, except what you don’t cover in this tutorial is the ability to use specific json data. I have been searching everywhere to achieve this, but without any results. Can you please help me how I would get the value of a json key, such as street name, and save it in a variable. Thanks in advance!

    Liked by 1 person

  4. Hi!

    You can check this previous tutorial on how to parse JSON content on the ESP8266. You can use it to parse incoming JSON content, as a result of your request:
    https://techtutorialsx.com/2016/07/30/esp8266-parsing-json/

    Here is a more advanced tutorial, were is explained how to parse JSON arrays:
    https://techtutorialsx.com/2016/08/06/esp8266-parse-json-arrays/

    In case you need it in the future, here is explained how to encode JSON messages in the ESP8266. You can used to POST content in JSON format:
    https://techtutorialsx.com/2016/08/10/esp8266-encoding-json-messages/

    Please let me know if it helps. Also, let me know if you get any compiling errors. I’ve been changing the aspect of the coding sections of those posts and sometimes WordPress removes stuff between less than and greater than signals, which may cause unexpected errors, such as loosing includes.

    Like

    1. Hi!

      I think the error may be related to the fact that the website you are trying to reach uses HTTPS. This is a secure version of the HTTP protocol and it means that the connections are encrypted.

      The example shown in this tutorial works only for HTTP (the not secure version where the data is sent in plain text)

      I haven’t yet played with HTTPS in the ESP8266, but you have here an example, from the ESP libraries:
      https://github.com/esp8266/Arduino/blob/master/libraries/ESP8266WiFi/examples/HTTPSRequest/HTTPSRequest.ino

      Note that in that example the fingerprint of the digital certificate of the website you are trying to reach is hardcoded. If the digital certificate of the website expires, then the code will stop working.

      In real world HTTPS, the client validates the digital certificate of the website (typically your browser is the client) to check if that certificate can be trusted. This is done by contacting a chain of certificate authorities.

      This is a heavy process that would not be trivial to implement in a device with limited resources, such as the ESP8266. I haven’t yet found a library that does this efficiently. Maybe with the new ESP32 this will be easier to implement

      Nevertheless, you can follow the thread about SSL support for the ESP8266 on the github page of the ESP libraries for the Arduino IDE. I opened the issue 2 years ago 🙂
      https://github.com/esp8266/Arduino/issues/43

      Liked by 1 person

  5. Hi, I tried your code, but my monitor show things like this:
    ———————————————————————————–
    Connecting..
    Connecting..
    Connecting..
    200 // httpCode

    ——————————————————————————————
    My payload is strange, do you know what’s the problem?

    Liked by 1 person

  6. html
    head
    meta http-equiv=’refresh’ content=’1; url=http://jsonplaceholder.typicode.com/users/3&arubalp=91c4147b-74cb-4485-8af4-a79f9975fc’
    /head
    /html

    Like

        1. My browser can receive the payload correctly as shown in the tutorial.The problem is my ESP8266, My URL is correct but my ESP8266 still prints the HTML tags as payload(not the texts my browser shows). I don’t know why.

          Like

        2. After refreshing to the new URL, my httpCode change to 302(redirect), with no payload, I currently stuck at here, don’t know how to response to httpCode 302

          Like

          1. Hi! That’s really weird, I’ve just copied and pasted the code on my IDE and uploaded it to a ESP8266 NodeMCU board and it works just fine.

            Can you please tell me which version of the Arduino libraries are you using? Can you please also paste the main loop function here?

            Maybe there is a problem with the character encoding or something with the Arduino IDE. May I ask in what language is your IDE? I never faced a problem like this but if you are copying and pasting the code without success, there may be something with the URL characters.

            Can you send requests to other websites?

            Like

            1. I finally solve the problem… that all because I connected to a network that is not working, I change another available WiFi and everything just works perfectly. Thanks for helping me with this somehow silly problem 🙂

              Liked by 1 person

  7. Hi, I would like to control a LED based on the contents of a google document. I need to read that file- which is basically a single line file. I tried your code and it is working fine. Now the problem is how to get that json parsing line (“http://jsonplaceholder.typicode.com/users/1”). I searched a lot, but in vain. Can you please help me..

    Liked by 1 person

    1. Hi! Awesome, never tried to make a request to a google document!

      As for the parsing of JSON, check here in another post how to do it with the ESP8266 and a very easy to use library:
      https://techtutorialsx.com/2016/07/30/esp8266-parsing-json/

      If you need more complex parsing, such as arrays:
      https://techtutorialsx.com/2016/08/06/esp8266-parse-json-arrays/

      If you need the other way around, check here how to encode JSON with the ESP8266:
      https://techtutorialsx.com/2016/08/10/esp8266-encoding-json-messages/

      Hope it helps!

      Like

    1. Hi!

      I’m sorry I’m not sure if I understood your question. In this code we don’t use any digital pins of the board.

      If you are asking about using the ESP8266 in the Arduino IDE, then it is done for us in the background, we don’t need to worry about the details. Basically, the Arduino IDE will know that the code is being compiled for the ESP8266, and use the correct compiler / set of tools needed.

      This code was designed to work in a ESP8266 board, not in a Arduino one.

      Hope it answers your question. If not, please let me know.

      Like

      1. Yes it did thank you a lot. I mixed it up for I am using the ESP8266 WiFi module connected to an Arduino UNO board. Speaking of which, I stumbled trying to send a GET request but I’m out of luck. It doesn’t seem to work and I’ve tried and searched through many links.
        I successfully connected to a website using “AT+CIPSTART” command but after that I can’t figure out exactly what needs to be done. I used the “AT+CIPSEND=” but I can’t really tell the exact structure of the GET request string before getting its length. I am really sorry I know my problem became off topic with respect to your post but I’m desperate for help and would highly appreciate it.

        Liked by 1 person

        1. No problem, let me see if I can help 🙂

          First of all, what you are seeing here is code for the ESP8266 and not for the Arduino boards, as I’ve mentioned.

          Nevertheless, we are using the Arduino development environment because Ivan Grokhotkov started a project to support the ESP8266 development on the Arduino IDE that has grown a lot with the support of the community. So, we don’t need to worry about setting complicated toolchains and we can use the Arduino language / development environment we are used to, in order to program the ESP8266.

          So, if you want to start programming your ESP8266 from scratch instead of using the pre-loaded AT commands firmware you are using, please consult the tutorial bellow. Just take in consideration that if you upload a program to the ESP8266, the AT commands firmware will be erased.
          https://techtutorialsx.com/2016/02/28/esp8266-uploading-code-from-arduino-ide/

          I really recommend that approach since you will have much more control of your programs and you can develop them to suit your needs.

          I used the AT commands firmware a couple of years ago, when the ESP8266 was still being sold as a Arduino serial to Wifi adapter and we didn’t now it was a fully programmable microcontroller. At that time, the firmware was considerably unstable and so I moved to the Arduino environment, as many others did.

          I only recently used the firmware again to do some tests on a board and I think its much more stable, but I still prefer to develop under the Arduino environment or other, such as mycropython.

          Hope I have convinced you to change to another environment 🙂 but if not, I think the best way is that you build the HTTP request string in a variable and simply get the size with the function bellow:
          https://www.arduino.cc/en/Reference/StringLength

          You will need to figure out the structure of the whole HTTP request for the site you are trying to reach, put it into a string and then getting the length. If your request is dynamic, you will need to build the string with the different parts and then get the size in the end.

          Note that what the firmware is doing with the AT commands is establishing a socket connection with the server, and you are going to need to send the whole HTTP request on top of that.

          Also, take in consideration that we cannot connect to HTTPS websites, because of the encryption.

          Like

          1. Hello again and thanks for your effort in replying.
            I am actually trying to send the http GET request manually through writing the AT commands directly onto the serial monitor before moving to code. Testing wise I found it better this way before
            the implementation of the code. All respective commands for ESP8266-01 – Website communication are done successfully except for the GET request part.
            The first link you put is good in case I am using the ESP8266-01 module as a generic board, but I am not. Actually it’s connected to the RX TX of the Arduino UNO board along with other sensors and components.
            I took the length of the GET request now what remains is actually sending it but once I receive the “>” sign on the serial monitor, I enter the request but it disappears (it doesn’t appear on the monitor when I hit enter) and though it shows “SEND OK” it still did not send anything (the path of the link is a tested PHP script that adds a value to a database).
            Thanks for your advice but unfortunately I’m still out of luck. The website I’m trying to the send the request to is also not encrypted.

            Liked by 1 person

            1. Hi! As for the link, as long as you can program the ESP8266, you can develop the architecture of the system as you want. The only difference is that instead of using a pre-built firmware, you develop your own program for the ESP. You can still develop a program to receive data from an Arduino Uno, connect to a website, send the data, receive the response and send it back to the Arduino, I did something similar in a smart medication dispenser I built some time ago, where the Arduino Mega was running all the sensors and the ESP was just dealing with the communication. Nevertheless, I developed a custom program from the ESP, for more control.

              As for your problem with the AT command, maybe it is related with the delay between you sending the CIPSEND command, receive the “>” and then sending the actual data. I used the firmware a long ago for socket connections, but I have a slight idea of facing some problems with the command on the serial monitor.

              Other thing, are you sending the \r\n at the end of the actual data? It may be also needed and also accounted in the size of the content passed to the CIPSEND.

              Also, just for debugging, have you tried to send the command to other website, just for checking if something happens?

              I’ve been also searching for some libraries for the Arduino and I think you can use one similar to the shown bellow to interact with the ESP8266. It hides some of the AT commands details and probably guarantees the synchronization of the send command.
              https://github.com/itead/ITEADLIB_Arduino_WeeESP8266

              Like

  8. I think my problem is with the ESP8266-01 module itself. I bought 2 so far and couldn’t get them to work. I tried literally everything but the modules I have aren’t of good quality they started lagging and not always they were able to recognize the DNS. My friends are working with the ESP8266 NodeMCU board and I’m thinking of getting one. What’s your opinion? And also does this post should (if not must) work with that latter board right?

    Thank you for your time and help. I am probably switching hardware and thanks for convincing me! (if that’s what you meant earlier by changing to another environment).

    Liked by 1 person

    1. Just to clarify a thing, both the ESP8266-01 and the NodeMCU use the same microcontroller, the ESP8266. Those are just different boards built around the same microcontroller.

      So, all the code you see in my blog in the “ESP8266” category should work fine in any of them. Naturally, there may be a detail or another, but I try to leave a warning when we need to consider something additional specific to a certain board.

      The NodeMCU is a very good board and I have been using it for most of my posts on the ESP8266. The advantage is that it already has an USB header and you just need an USB cable to interact with it, which includes programming it.

      Besides that, it has all of the pins of the ESP8266 exposed, so you can use it as an “arduino”. Many people use the ESP8266 just as a Serial to WiFi converter, but the ESP8266 is actually much more powerful than most of the microcontrollers used in the Arduino boards. Most of the things you can do with an Arduino board you can do with an ESP8266 board, with the advantage of having WiFi built in.

      I think it is a very good option for you to move to the NodeMCU, but I also recommend you to program it with the Arduino IDE instead of using the AT commands. That’s what I meant when recommending you to change the environment 🙂 The AT commands have always been a little unstable and you typically end up with a more complex program because you need to be parsing strings from the answers of the commands.

      The link I shared before with the tutorial to move to the Arduino IDE covers the ESP-01 as hardware because at the time I wrote it it was the most used board. Now with the NodeMCU boards, we really just need an USB cable to connect it to a computer.

      Nevertheless, from the Arduino IDE Configuration section bellow are the generic instructions for installing the ESP8266 support for the Arduino IDE. You will only need to choose the correct board on the boards manager (in your case it will be the NodeMCU) because the upload configurations may vary from board to board. But the IDE takes care of everything as long as we choose the correct board.
      https://techtutorialsx.com/2016/02/28/esp8266-uploading-code-from-arduino-ide/

      I think it’s still working fine, but the latest instructions from the creators of the ESP8266 libraries for the Arduino IDE are bellow, if you prefer:
      https://github.com/esp8266/Arduino#installing-with-boards-manager

      Let me know if you succeed with the NodeMCU 🙂

      Like

      1. Actually I’ve managed to solve my issue thanks to your advice (really this time). Approaching it by code, the http GET request was sent correctly. I thought it’s a ESP8266-01 since I followed several tutorials that used AT commands and successfully sent a request but mine did not. Eventhough I tried several Arduino IDE approaches (by code) I wasn’t successful at first until now

        Still, I will get a NodeMCU just as a backup plan and I will follow your instructions. Thanks a lot if it wasn’t for you I would’ve have gave it another try with the Arduino IDE.

        Here’s the link that I followed http://blog.huntgang.com/2015/01/20/arduino-esp8266-tutorial-web-server-monitor-example/#comment-5758

        Now that remains is that I need to get the response from the ESP-01 and type it again just to keep track in front of me of what’s happening. That link was great but it didn’t get back the responses.. I guess this is my next step. Thanks again for your assistance mate.

        Liked by 1 person

        1. You’re welcome, I’m glad it is working fine 🙂 I think you will like the NodeMCU, it’s much more easy to use than the ESP-01.

          Also, if you like Internet of Things, keep an eye for the ESP32 boards, it’s the ESP8266 big brother and it’s much much more powerful. 🙂

          Good luck with your project!

          Like

  9. Thank you so much. It helped me so much to understand this ESP8266 beast. 🙂 Such blogs really help people like me who try to learn something without programming background and proceed with their enthusiasm.

    Once again. thanks a lot. much appreciated.

    Liked by 1 person

    1. Thank you very much for your feedback 🙂 It’s important for me to know that you are finding the content useful and easy to understand.

      Best regards,
      Nuno Santos

      Like

  10. Hi,
    Firstly, I wanna commend you on this great post. I’ve been working on something similar but not entirely. I’m using an arduino, esp8266 and some sensors. the aim is to send data from the sensors to a server (not to a jsoplaceholder). I got it right when I’M sending data to a thingspeak channel (through an example code of course!)

    SoftwareSerial SerialS(8, 9) ;
    #include "ESP8266.h"
    ESP8266 wifi(SerialS,9600);
    
    

    The library I used was from ITEAD, and not your prescribed library in your tutorial,

    #define SSID "AndroidAP"      //name of wireless access point to connect to
    #define PASSWORD "*******"  //wifi password
    #define IP "184.106.153.149"                  
    
    
    String GET_start = "GET /update?key=";
    String writeAPIKey = "D*************SJ";    
    String GET_end1 =  "&field1=";                 // field1 for the Celcius
    String GET_end2 =  "&field2=";                 // field2 for the fahrenheit
    String GET_end3 =  "&field3=";
    String GET_end4 =  "&field4=";
    String GET_end5 =  "&field5=";
    
    String GET = GET_start + writeAPIKey + GET_end1 ;
    
    

    Here is one challenge I will be facing, the write API key is what I can’t substitute because heroku doesn’t have one.
    below is the remainder of the code for the sending of strings to the thingspeak server

        char buffer1[10];
        char buffer2[10];
        char buffer3[10];
        char buffer4 [10];
        char buffer5 [10];
        String light = dtostrf(ldr, 4, 1, buffer1);
        String voltBatt = dtostrf(vin1, 4, 1, buffer2);
        String voltSolar = dtostrf(vin2, 4, 1, buffer3);
        String hum = dtostrf(h, 4, 1, buffer4);
        String temp = dtostrf(t, 4, 1, buffer5);
        updateTemp(light,voltBatt,voltSolar,hum,temp);
    }
    
    void updateTemp(String temp1, String temp2, String temp3, String temp4, String temp5 ){
    
       if (wifi.createTCP(IP, (80))) {
         //   Display.print("create tcp ok \r\n");
         //Display.print(field);
        } else {
         //   Display.print("create tcp err\r\n");
        }
    
      String cmd = GET;
      cmd += temp1;
      cmd += GET_end2;
      cmd += temp2;
      cmd += GET_end3;
      cmd += temp3;
      cmd += GET_end4;
      cmd += temp4;
      cmd += GET_end5;
      cmd += temp5;
      cmd += "\r\n";
    
      ESPserial.print("AT+CIPSEND=");
      ESPserial.println(cmd.length());
      if(ESPserial.find(">")){
        Serial.print(">");
        Serial.print(cmd);
        ESPserial.print(cmd);
      }
    
      if(ESPserial.find("OK")){
        Serial.println("RECEIVED: OK");
      }else{
        Serial.println("RECEIVED: Error");
      }
    
      if (wifi.releaseTCP()) {
        //Display.print("release tcp ok \r\n");
      } else {
        //Display.print("release tcp err\r\n");
      }
    }
    
    

    But now, I have deployed on heroku and used firebase as my database server, and I want to make this code send my sensor data to my deployed server. Do you have any solution you can help me with? I’ll be forever grateful. Thanks!

    Kay.

    Liked by 1 person

    1. Hi! Thanks for your feedback, I’m glad you found this post useful 🙂

      As for your application, I haven’t yet worked with Heroku (although I definitely want to take a look as soon as I have some time), but I’m assuming you are deploying an application there with a endpoint that will receive your sensor data, right?

      First of all, you need to confirm that you are not using HTTPS on your application, if so you will not be able to send the data because of the encryption. So, you will need to be using just HTTP.

      I haven’t used ITEAD’s library, so I can’t be of much help in that part, but from what I’m seeing it is using AT commands.

      So, my suggestion is more of on how to approach the problem. Since you’re moving to a new platform, you should start by doing something really simple before sending the sensor data, in order to be able to debug.

      So, my recommendation is that you put a simple route in your Heroku app that just does something as simple as returning a “hello world” string. Thus, you can confirm that you can reach the server and send an HTTP request and get the answer.

      So, your command would be something like
      String GET = “GET /hello\r\n”;

      If you can reach the server like this, then you can build the remaining application on top of it. After that, you could do a route that receives your parameters as query strings, like you are doing in that code in the /update. First you can try if it works with your browser, and then move to the ESP/Arduino code.

      From my understanding of your code / application, if you set a /update route similar to the one you have on ThingsSpeak, you just need to remove the ?key= from the Get_start variable and in the following line of code remove the + writeAPIKey.

      String GET = GET_start + writeAPIKey + GET_end1 ;

      It would then be:
      String GET_start = “GET /update”;
      String GET_end1 = “?field1=”;
      (…)
      String GET = GET_start + GET_end1 ;
      (…)

      But you should test sending the request from a browser first to avoid having complicated debugging on the Arduino / ESP. If the problem is in the server, you need to solve it first.

      So, the bottom line is that if your backend doesn’t need an API key, you just don’t need to send one. Just send the remaining query parameters.

      Also, if you are not familiarized with why you are sending the ?field1=something&field2=something… do a quick search about how query parameters work. It’s very important to understand your code.

      Basically, it is a way for sending parameters to the server on the URL. In the code you are showing me, you can do the same request to ThingsSpeak from a web browser by typing the following on the search bar:

      http://184.106.153.149/update?key=YourAPIKey&field1=YourFieldValue&field2=YourFieldValue

      and so on for the remaining values (all in the same line).

      Hope it helps!

      Like

    1. Hi! Thank you very much for your feedback 🙂 I’m glad these posts are being useful, I will try to keep posting more content about the ESP8266.

      Best regards,
      Nuno Santos

      Like

  11. Hi Antepher, Your post is very useful for newcomers like me……….My problem is I don’t know whether I can use this library with ESP01 serial wifi transceiver SO I wanted to know can I use this library that you prescribed with ESP-01? If yes than How should I connect ESP01 to My arduino Mega? I am trying to send data to mySQL server it’s an RFID based logging system so I need to read the confirmation echo back from the server too….please guide me on that…..thank you

    Liked by 1 person

    1. Hi! Thanks for your feedback 🙂 Yes, you should be able to use it with the ESP01.

      These tutorials are for the ESP8266 microcontroller, which is found at those ESPXX boards (and many others).

      So, in theory, it should work as long as the microcontroller is the ESP8266, as it is the case of the ESP01.

      Naturally, in other programs where we use specific pins of the ESP8266, they may not be exposed in some boards, so you need to be careful with that. In this case we don’t use any GPIO.

      For the ESP01, you can check the tutorial bellow on how to program it with the Arduino IDE:
      https://techtutorialsx.com/2016/02/28/esp8266-uploading-code-from-arduino-ide/

      It’s a bit old, but I think it still applies to the ESP01. I can’t confirm since I’ve not been using the ESP01’s for a while. Due to the relatively complicated process of uploading code to the ESP01, I’ve started using other simpler to program ESP8266 boards.

      Let me know if it works.

      Best regards,
      Nuno Santos

      Like

    1. Hi! It’s not a dumb question, many people have the same doubt 🙂

      This is the ESP8266 on its own, you don’t need an Arduino uno board or any other board.

      Although in the beginning, the ESP8266 was sold as an Arduino WiFi to serial bridge, the community quickly discovered that it was actually a very powerful microcontroller with WiFi support that could be programmed and used without any additional board.

      So, one of the projects that was first initiated was adding support on the Arduino IDE to program it. This was an awesome initiative since the original set of tools was very complicated and the Arduino was a well known environment for the community.

      So, to sum up, you just need an ESP8266 board (there are plenty of them on the market with usb headers for programming without external hardware) and the Arduino IDE and you can follow this tutorial.

      Hope this clarifies your doubt.

      Best regards,
      Nuno Santos

      Like

    1. Hi! Can you please share a description of the problem you are experiencing? Due to security reasons, I usually don’t follow links to uploaded files, hope you understand.

      Best regards,
      Nuno Santos

      Like

      1. Hi, I have a same problem to. baud rate is ok but I can not see the data correctly. data in serial monitor is some thing like this : #?# . what is the problem ? note that I use the same URL as yours and some other URL but results are the same.

        Liked by 1 person

        1. Hi!

          That’s weird, I’ve not been able to reproduce the issue.

          Maybe some problem with your units or cable? Or are you able to do regular serial prints of string without any problem?

          Best regards,
          Nuno Santos

          Like

          1. Yes, I am able to print Strings in serial monitor without any problem!! but when I use http.getString() I have problems in printing on serial monitor. note that I found a solution for my problem. I changed my access point and every thing is ok now! That’s so weird, do you have any idea about it? what is the problem of my old Access Point? it was a regular 4G/LTE TP-Link router!

            Liked by 1 person

            1. Hi!

              That’s really weird, I’ve never experienced that type of problem. Nonetheless, I’ve always used the ESP with my Thomson router.

              But I’m glad you were able to solve it. 🙂

              My suggestion is that you post your issue in the Git Hub page of the Arduino core, maybe someone there has faced the same issue and has a solution or ideia about the cause.

              Best regards,
              Nuno Santos

              Like

  12. Hello!
    I have tried running your code on a private network, and it works. However, whenever I use a public network, I get the following error.

    Connecting..Connecting..Connecting..
    Stylesheet for Squid Error pages
    Adapted from design by Free CSS Templates
    http://www.freecsstemplates.org
    Released for free under a Creative Commons Attribution 2.5 License
    */

    /* Page basics */
    * {
    font-family: verdana, sans-serif;
    }

    html body {
    margin: 0;
    padding: 0;
    background: #efefef;
    font-size: 12px;
    color: #1e1e1e;
    }

    /* Page displayed title area */
    #titles {
    margin-left: 15px;
    padding: 10px;
    padding-left: 100px;
    background: url(‘http://www.squid-cache.org/Artwork/SN.png’) no-repeat left;
    }

    /* initial title */
    #titles h1 {
    color: #000000;
    }
    #titles h2 {
    color: #000000;
    }

    /* special event: FTP success page titles */
    #titles ftpsuccess {
    background-color:#00ff00;
    width:100%;
    }

    /* Page displayed body content area */
    #content {
    padding: 10px;
    background: #ffffff;
    }

    /* General text */
    p {
    }

    /* error brief description */
    #error p {
    }

    /* some data which may have caused the problem */
    #data {
    }

    /* the error message received from the system or other software */
    #sysmsg {
    }

    pre {
    font-family:sans-serif;
    }

    /* special event: FTP / Gopher directory listing */
    #dirmsg {
    font-family: courier;
    color: black;
    font-size: 10pt;
    }
    #dirlisting {
    margin-left: 2%;
    margin-right: 2%;
    }
    #dirlisting tr.entry td.icon,td.filename,td.size,td.date {
    border-bottom: groove;
    }
    #dirlisting td.size {
    width: 50px;
    text-align: right;
    padding-right: 5px;
    }

    /* horizontal lines */
    hr {
    margin: 0;
    }

    /* page displayed footer area */
    #footer {
    font-size: 9px;
    padding-left: 10px;
    }
    body :lang(fa) { direction: rtl; font-size: 100%; font-family: Tahoma, Roya, sans-serif; float: right; } :lang(he) { direction: rtl; } –> ERROR The requested URL could not be retrieved The following error was encountered while trying to retrieve the URL: http://jsonplaceholder.typicode.com/users/1

    ICAP protocol error.

    The system returned: [No Error] This means that some aspect of the ICAP communication failed. Some possible problems are: The ICAP server is not reachable. An Illegal response was received from the ICAP server. Generated Sun, 24 Sep 2017 01:23:48 GMT by px019.st.vc.core.wifi.inet (squid/3.1.23)
    ERROR: The requested URL could not be retrieved <!– /*

    Like

    1. Hi! It seems like the public network you are trying to use has some kind of authentication page that you have to fill, and by trying to connect using the ESP library it is giving you some error. That HTML you are seeing is most likely an error page.

      If you try to connect to that network from your computer, don’t you need to fill a form or something similar on your browser?

      Like

      1. Hi! Thank you for the reply!

        Yes, an authentication is required. However, there’s an option to register the devices’ MAC addresses so that there is no need to authenticate. So, is it possible that the devices’ MAC addresses are wrong or not being supported (btw raspberry pi’s seem to work just fine..)? Are there any other suggestions? Is there a way to connect then authenticate using the ESP library without having to register the MAC address for example?

        Liked by 1 person

        1. You’re welcome 🙂

          Unfortunately I never tried to connect the ESP to a public network, so I don’t know an alternative way to solve the issue you are running into.

          But do you have access to the network to add the MAC address? If so you can easily get the MAC address of the ESP8266:
          https://techtutorialsx.com/2017/04/09/esp8266-get-mac-address/

          Another alternative is asking around the GitHub page for the ESP Arduino core:
          https://github.com/esp8266/Arduino

          It is very likely that someone has already tried it and may have a solution.

          Hope this helps.

          Best regards,
          Nuno Santos

          Like

  13. Hi there,
    first of all, thanks for the tutorial, it is great.
    Based on it, I have my own code and it works flawlessly. The problem is that the code wont start when I power the bord on. I need to connect to it through serial and then it works like a charm, but again, if i powercycle, nothing happens unless I start putty and connect to it again.
    Do you know what to do with it? My code has the same structure. consts, setup and loop as in your tutorial
    My board is https://www.banggood.com/NodeMcu-Lua-WIFI-Internet-Things-Development-Board-Based-ESP8266-CP2102-Wireless-Module-p-1097112.html?rmmds=myorder
    Geekcreit® NodeMcu Lua WIFI Internet Things Development Board Based ESP8266 CP2102 Wireless Module

    Thanks for help!

    Liked by 1 person

      1. Hi Martin! Thanks for the feedback 🙂

        I’m glad you were able to solve the issue.

        Through my time in embedded systems development, I’ve also spent a fair amount of time looking for issues in the software that were actually being caused by hardware problems. 🙂

        Best regards,
        Nuno Santos

        Like

  14. Please take a look at my error. I don’t know where the problem is.
    When i uploaded your code, i had this error.
    error: failed reading byte
    warning: espcomm_send_command: cant receive slip payload data
    error: failed reading byte
    warning: espcomm_send_command: cant receive slip payload data
    error: failed reading byte
    warning: espcomm_send_command: cant receive slip payload data
    error: failed reading byte
    warning: espcomm_send_command: cant receive slip payload data
    error: failed reading byte
    warning: espcomm_send_command: cant receive slip payload data
    error: failed reading byte
    warning: espcomm_send_command: cant receive slip payload data
    error: failed reading byte
    warning: espcomm_send_command: cant receive slip payload data
    error: failed reading byte
    warning: espcomm_send_command: cant receive slip payload data
    error: failed reading byte
    warning: espcomm_send_command: cant receive slip payload data
    warning: espcomm_sync failed
    error: espcomm_open failed
    error: espcomm_upload_mem failed
    error: espcomm_upload_mem failed
    I used PL2302 to upload code for ESP8266v1.
    And my connections:
    ESP8266 USB UART
    TX RX
    RX TX
    Vcc 3.3V
    GND GND
    CH_PD 3.3V
    Thank you.

    Liked by 1 person

  15. Hi, just a question, maybe not relate with this post.
    is it possible my UNO connect to Firebase via NodeMCU. My UNO act as a main controller, and i wan my nodemcu act as just a gateway for UNO to connect to Wifi. And i wan the code is on the UNO instead of on nodemcu.
    Hopefully, will get some idea from you. Thanks you. =D

    Liked by 1 person

    1. Hi!

      I don’t know which protocols Firebase supports, but I’m assuming it is one that can be used on the ESP (such as HTTP).

      If so, you should be able to what you mentioned.

      You need to send the data you want from the uno to the ESP and then the ESP should build the HTTP request from that data and send it to firebase.

      The easiest way to make the uno and the NodeMCU talk is by serial communication.

      Note however that the ESP works with 3.3 V and Uno with 5 V (at least the older versions) so you will need to perform level conversion.

      Nonetheless you will need to program the NodeMCU to do it in the most efficient way.

      The only alternative for not programming the NodeMCU is using the ESP AT commands, but I would recommend against it since they are not very reliable or flexible (at least they weren’t a couple of time ago).

      Bottom line, my recommendation is that you take a while to learn how to program the ESP8266 and think about using only it.

      The ESP8266 if far more powerful than the Uno and if you develop a program to it you will not need to worry about the level conversion and converting from serial to HTTP.

      Hope it helps,
      Nuno Santos

      Like

  16. Hey,
    I’m using the esp8266 to get data from an API that the dutch railways provide, they return some xml data, however I can connect to the api. I am using the ESP8266HTTPClient library but the http.connected() is always 0. How do I get it to be a usable number? And how can I process XML data with the ESP8266?
    Thanks in advance for your help!

    Liked by 1 person

    1. Hi!

      In the code from this tutorial I’m not making any call to the http connected method. Are you using a modified version?

      Nonetheless, that method should return true if the tcp connection is ok and false otherwise, so you may be experiencing some problems with the connection.

      Are you able to use the same ESP8266 code to reach other websites with success? And are you able to reach the railway api and get the response with other tool, such as Postman or cURL?

      Regarding the XML processing, I’m not aware of any good parser for the ESP8266 or the Arduino. Only know for JSON format.

      Best regards,
      Nuno Santos

      Like

      1. Thanks for replying!
        I think I have some new ideas and I will try a few new things. Thanks for telling me about Postman and cURL, I will definitely try them and maybe use them in future projects.

        Liked by 1 person

  17. Hey,
    I’m using the esp8266 to get data from an API that the dutch railways provide, they return some xml data, however I can connect to the api. I am using the ESP8266HTTPClient library but the http.connected() is always 0. How do I get it to be a usable number? And how can I process XML data with the ESP8266?
    Thanks in advance for your help!

    Like

    1. Hi!

      Well, you can do some sort of polling mechanism where you use an HTTP request to ask the server if you should connect your relay or not.

      Nonetheless, that would not be the most efficient approach.

      A better alternative would be setting a server on your ESP, which would in that case receive requests from a client to control the relay.

      You can check here how to get started:
      https://techtutorialsx.com/2016/10/03/esp8266-setting-a-simple-http-webserver/

      Note however that you will only be able to reach the server from inside your local network, unless you portforward your router, which may be a little bit more complicated if you are not used to such procedure, and also expose your network to some dangers.

      If you need to send commands to your relay from outside the local network, then a safer way may be opening a socket connection to the server and receive the commands from that interface.

      But it’s a matter of deciding which plays best for the requirements of your application.

      Best regards,
      Nuno Santos

      Like

    1. Hi!

      What do you mean by receiving the 1 in the URL? Is your ESP8266 working as a webserver (thus receiving HTTP requests) or are you making a request from your ESP8266 to a URL?

      If you are making a request, then you would receive that 1 in the answer of the request.

      In that case, you would need to parse the result to an integer and check if it has the value 1.

      If it does, simply activate the pin by calling the digital write function:
      https://www.arduino.cc/reference/en/language/functions/digital-io/digitalwrite/

      As indicated in that page, don’t forget to initialize the pin as Output before using it.

      Hope this helps.

      Best regards,
      Nuno Santos

      Like

  18. hi antephar
    i need a help
    i am trying to form a cluster with nodemcu modules, where one nodemcu act as server and other nodemcus act as clients. my problem here is i want to request the data from the particular client by IP address from the server. Is it possible by the http.get() method.
    thank u

    Liked by 1 person

    1. Hi!

      I’m not sure if I understood the architecture correctly, but you will have one NodeMCU as server and the remaining as clients, right?

      If so, I think it should be the clients asking data to the server and not the other way around. At least for a typical approach 🙂

      Why do you need to have the server contacting the clients? In that case, maybe you should have the other NodeMCUs working as servers and the one that is asking working as client.

      Does this make sense for your architecture?

      Best regards,
      Nuno Santos

      Like

    1. Hi!

      Which endpoint are you trying to reach? Can you also reach it from a web browser?

      Also, is it HTTP or HTTPS? This example doesn’t work for HTTPs.

      Best regards,
      Nuno Santos

      Like

  19. Could you help me?
    I’m working with two Nodemcu. There is a server (access point) and a client. I got how to send requests from client to server, but I don’t know how to get those requests using the server.

    Liked by 1 person

    1. Hi!

      What do you mean by getting them in the server? Which library are you using?

      The typical implementations of webservers on the esp8266 / esp32 use the concept of routes.

      Whenever you receive a request on a route, it executes a route handling function, so is there that you handle the request.

      Then on those routes there are functions to access the parameters of the request.

      The parameters available will pretty much depend on the type of request (POST, GET, etc..), what you send on the query string etc..

      But let me know a little bit more about what you are doing so I can try to help 🙂

      Best regards,
      Nuno Santos

      Liked by 1 person

  20. Hi this might sound silly, but im always getting http code 302 for a particular rest API(accessible without logging in ). Also, postman app gives me response as 200 along with payload . http://jsonplaceholder.typicode.com/users/1 gives perfect response with nodeMCU.
    thus im not able to parse contents,

    Please help.!!!
    im just passing some headers along with the get request
    snippet:
    http.begin(“my rest url”); //Specify request destination
    int httpCode = http.GET(); //Send the request
    Serial.println(httpCode); // returns302
    if (httpCode > 0) { //Check the returning code

    String payload = http.getString(); //Get the request response payload
    Serial.println(payload); //Print the response payload

    }

    http.end();

    BTW, it returns -1 when any any other url is used ;(

    Liked by 1 person

    1. a bit modification:

      snippet:
      http.begin(“my rest url”); //Specify request destination does not have www including http
      http.addHeader(“Accept”, “application/json”);
      http.addHeader(“Content-Typez”, “application/json”);
      http.addHeader(“location”, “same URL including https);
      int httpCode = http.GET(); //Send the request
      Serial.println(httpCode); // returns302
      if (httpCode > 0) { //Check the returning code

      String payload = http.getString(); //Get the request response payload
      Serial.println(payload); //Print the response payload

      }

      http.end();

      Liked by 1 person

    2. Hi! That is very weird.

      When using postman, did you also send the same headers?

      Is your REST URL HTTP or HTTPS? Also, does it end with a / ? If so, are you including it? I’ve seen people having some problems with it because of not including the ending /.

      Other than that it is very weird since 302 is redirection code.

      Is the REST API public or hosted by you?

      Best regards,
      Nuno Santos

      Like

  21. Hey, thanks for this, it was very helpful! I’m using a powerbank to power the ESP8266 and I want to reduce electricity consumption, so that I can go longer without touching the setup. Would using deep sleep (or some other method) result in longer battery time, compared to delay function? Thanks again.

    Liked by 1 person

    1. Hi!

      You’re welcome 🙂

      Theoretically it should reduce the power consumption if you go to deep sleep, as long as you are not doing very frequent changes between normal operation and deep sleep.

      This is because changing between those two modes of operation usually involves some power consumption overhead that only compensates if the device stays in low power mode for a while.

      This is theoretical and what typically happens generically in microcontrollers.

      Nonetheless, I never had the chance to analyze the specifics of the ESP8266 regarding low power modes, so I’m not sure what these thresholds are.

      My recommendation is that you take a look at the ESP8266 datasheet to check if there is some information about the deep sleep mode of operation, its consumption and the power consumption to change between modes.

      Hope this helps getting you in the right track.

      Best regards,
      Nuno Santos

      Like

  22. antepher thanks for the tutorial! I’m looking for a way to receive (and process) data from the server response line – not the payload. Especial I’m intretsted in the time and date stamp from the server respond.
    Thanks

    Liked by 1 person

    1. Hi!

      You’re welcome and thank you very much for the feedback 🙂

      What do you mean by the server response line? Something like the response headers?

      Best regards,
      Nuno Santos

      Like

      1. yes exacly, The line that contains time and date info. With this info I like to set the system time An example ho to do this is welcomed 😉
        Thank you!

        Liked by 1 person

          1. Hi Nuno,
            thats exacly what I was looking for. Thank you so much!
            If you point me to the documentation of ESP8266HTTPClient documentation next time I’ll first look at before asking stupid questions
            ——————–
            Connecting..
            Connected to WiFi Network
            Sat, 09 Jun 2018 06:31:08 GMT
            cloudflare
            Sat, 09 Jun 2018 06:31:08 GMT
            cloudflare
            ——————–
            Thanks
            Jochen

            Liked by 1 person

            1. Hi!

              Awesome, you’re welcome 🙂

              It was not a stupid question at all. In fact I hadn’t yet played with the headers of the response, so it was an interesting exercise to figure it out and I think it will be useful for more people 🙂

              I’m not sure if there is some “official” documentation about the HTTP Client. The only place that has some structured documentation about the libraries that I’m aware of is the following:
              https://arduino-esp8266.readthedocs.io/en/latest/index.html

              Nonetheless, I did not find anything about the HTTPClient :/

              What I usually do to check the API of some class if actually going to the header file and check the available methods. Sometimes they are straightforward to use, but others it requires some digging on wikis, the github issues and the implementation files.

              If you want to take a look, here is the header file of the HTTP Client:
              https://github.com/esp8266/Arduino/blob/master/libraries/ESP8266HTTPClient/src/ESP8266HTTPClient.h

              I wish you good luck in your project 🙂

              Best regards,
              Nuno Santos

              Like

          2. Hi Nuno,
            I’m facing the problen to send a request to a server that insists of pfs connection set up. As this behavior will become more prominent it’s not just me beeing confronted I believe.
            Thank you

            Liked by 1 person

            1. Hi!

              When you mean pfs, are you refering to perfect forward secrecy?

              If so, at the time I was more actively working with the ESP8266, HTTPS functionalities were really limited and I’m not sure if perfect forward secrecy was ever supported.

              To be honest, I’m not sure if things have evolved much since then, but I would recommend you to take a look at the ESP32 for more robust security functionalities.

              The ESP32 is far more powerful and it is able to handle HTTPS very well. But even with the ESP32, I’m not sure if it can support perfect forward secrecy, so you would need to do some investigation or ask around the forums and git hub pages.

              But an easy way to test is to make an HTTPS request to a server that uses PFS and check if everything works.

              If I come across some information or examples regarding pfs support, I will make sure to share 🙂

              Best regards,
              Nuno Santos

              Like

              1. Hi Nuno,
                I’ve send this request to Espresif: “As perfect forward secrecy, short pfs, becomes more prominent/importand I wonder if there is a pfs implementation for the famous ESP32”
                Looking forward for an answer …

                Liked by 1 person

              2. Hi!

                Please let us know if they give back some answer, I’m also curious about what their answer will be since this is indeed something very useful to have available.

                Hopefully there is support 🙂

                Best regards,
                Nuno Santos

                Like

              3. It’s a shame, no answer yet – no positve nor negativ – jusst silenc :-((
                As my english isn’t proper and my knowledge of internet protocols is poor maybe somone can step into this request and forward it to the right community. As I said befor it’s an upcomming demand.
                Thank you for your great support. All the best
                Mhz

                Liked by 1 person

              4. Hi,

                I’m sad to hear that you haven’t yet got an answer from Espressif, it would be interesting to know their answer on this.

                Nonetheless, I think it is probable that you get some answers in forums or on the github pages of ESP8266 Projects. Here is a list of interesting places where you can ask around:
                – ESP8266 forum: https://www.esp8266.com/
                – ESP8266 Arduino core github page: https://github.com/esp8266/Arduino/issues

                Nonetheless, I would also ask around the ESP32 forum, since it is more probable that this support for pfs gets to the ESP32:
                – Forum: https://esp32.com/
                – Arduino core Github page: https://github.com/espressif/arduino-esp32
                – IDF Github Page: https://github.com/espressif/esp-idf

                Don’t worry about your English, I’m not a native speaker myself and never worry about that when asking about stuff in technical forums 🙂

                You’re welcome, and thanks for the feedback 🙂

                Best regards,
                Nuno Santos

                Like

  23. hello sir ,
    iam trying to send the url to the mysql database. but using below sketch not sending ,where i did mistake please help.

    #include
    #include

    void setup() {

    Serial.begin(115200); //Serial connection
    WiFi.begin(“iota_telecom”, “iota160616”); //WiFi connection

    while (WiFi.status() != WL_CONNECTED) { //Wait for the WiFI connection completion

    delay(500);
    Serial.println(“Waiting for connection”);

    }

    }

    void loop() {

    if(WiFi.status()== WL_CONNECTED){ //Check WiFi connection status

    HTTPClient http; //Declare object of class HTTPClient

    http.begin(“http://10.132.16.241:8080/HTTPHITURL/RequestHandler?p1=300&p2=78&p3=500&p4=600&p5=500&p6=iota66&p7=iota77&p8=iota83&p9=iota84&p10=iota45”); //Specify request destination
    http.addHeader(“Content-Type”, “text/plain”); //Specify content-type header

    int httpCode = http.POST(“http://10.132.16.241:8080/HTTPHITURL/RequestHandler?p1=300&p2=78&p3=500&p4=600&p5=500&p6=iota66&p7=iota77&p8=iota83&p9=iota84&p10=iota45”); //Send the request
    String payload = http.getString(); //Get the response payload

    Serial.println(httpCode); //Print HTTP return code
    Serial.println(payload); //Print request response payload

    http.end(); //Close connection

    }else{

    Serial.println(“Error in WiFi connection”);

    }

    delay(30000); //Send a request every 30 seconds

    }

    serial monitor:

    Waiting for connection
    state: 2 -> 0 (2)
    reconnect
    scandone
    state: 0 -> 2 (b0)
    Waiting for connection
    state: 2 -> 3 (0)
    state: 3 -> 5 (10)
    add 0
    aid 2
    cnt
    Waiting for connection
    Waiting for connection
    Waiting for connection

    connected with iota_telecom, channel 6
    dhcp client start…
    Waiting for connection
    ip:10.132.39.81,mask:255.255.0.0,gw:10.132.0.1
    Waiting for connection
    [HTTP-Client][begin] url: http://10.132.16.241:8080/HTTPHITURL/RequestHandler?p1=300&p2=78&p3=500&p4=600&p5=500&p6=iota66&p7=iota77&p8=iota83&p9=iota84&p10=iota45
    [HTTP-Client][begin] host: 10.132.16.241 port: 8080 url: /HTTPHITURL/RequestHandler?p1=300&p2=78&p3=500&p4=600&p5=500&p6=iota66&p7=iota77&p8=iota83&p9=iota84&p10=iota45
    [HTTP-Client] connected to 10.132.16.241:8080
    [HTTP-Client] sending request header
    —–
    POST /HTTPHITURL/RequestHandler?p1=300&p2=78&p3=500&p4=600&p5=500&p6=iota66&p7=iota77&p8=iota83&p9=iota84&p10=iota45 HTTP/1.1
    Host: 10.132.16.241:8080
    User-Agent: ESP8266HTTPClient
    Connection: close
    Accept-Encoding: identity;q=1,chunked;q=0.1,*;q=0
    Content-Type: text/plain
    Content-Length: 136

    —–
    [HTTP-Client][returnError] error(-11): read Timeout
    [HTTP-Client][returnError] tcp stop
    [HTTP-Client][returnError] error(-4): not connected
    -11

    [HTTP-Client][end] tcp is closed
    [HTTP-Client][begin] url: http://10.132.16.241:8080/HTTPHITURL/RequestHandler?p1=300&p2=78&p3=500&p4=600&p5=500&p6=iota66&p7=iota77&p8=iota83&p9=iota84&p10=iota45
    [HTTP-Client][begin] host: 10.132.16.241 port: 8080 url: /HTTPHITURL/RequestHandler?p1=300&p2=78&p3=500&p4=600&p5=500&p6=iota66&p7=iota77&p8=iota83&p9=iota84&p10=iota45
    [HTTP-Client] failed connect to 10.132.16.241:8080
    [HTTP-Client][returnError] error(-1): connection refused
    [HTTP-Client][returnError] error(-4): not connected
    -1

    [HTTP-Client][end] tcp is closed
    [HTTP-Client][begin] url: http://10.132.16.241:8080/HTTPHITURL/RequestHandler?p1=300&p2=78&p3=500&p4=600&p5=500&p6=iota66&p7=iota77&p8=iota83&p9=iota84&p10=iota45
    [HTTP-Client][begin] host: 10.132.16.241 port: 8080 url: /HTTPHITURL/RequestHandler?p1=300&p2=78&p3=500&p4=600&p5=500&p6=iota66&p7=iota77&p8=iota83&p9=iota84&p10=iota45
    [HTTP-Client] failed connect to 10.132.16.241:8080
    [HTTP-Client][returnError] error(-1): connection refused
    [HTTP-Client][returnError] error(-4): not connected
    -1

    I’m using nodeMCU(esp_12E)

    Like

  24. sorry sir ,my first post was not added libraries ,please help me where i did the mistake.

    #include
    #include

    void setup() {

    Serial.begin(115200); //Serial connection
    WiFi.begin(“iota_telecom”, “iota160616”); //WiFi connection

    while (WiFi.status() != WL_CONNECTED) { //Wait for the WiFI connection completion

    delay(500);
    Serial.println(“Waiting for connection”);

    }

    }

    void loop() {

    if(WiFi.status()== WL_CONNECTED){ //Check WiFi connection status

    HTTPClient http; //Declare object of class HTTPClient

    http.begin(“http://10.132.16.241:8080/HTTPHITURL/RequestHandler?p1=300&p2=78&p3=500&p4=600&p5=500&p6=iota66&p7=iota77&p8=iota83&p9=iota84&p10=iota45”); //Specify request destination
    http.addHeader(“Content-Type”, “text/plain”); //Specify content-type header

    int httpCode = http.POST(“http://10.132.16.241:8080/HTTPHITURL/RequestHandler?p1=300&p2=78&p3=500&p4=600&p5=500&p6=iota66&p7=iota77&p8=iota83&p9=iota84&p10=iota45”); //Send the request
    String payload = http.getString(); //Get the response payload

    Serial.println(httpCode); //Print HTTP return code
    Serial.println(payload); //Print request response payload

    http.end(); //Close connection

    }else{

    Serial.println(“Error in WiFi connection”);

    }

    delay(30000); //Send a request every 30 seconds

    }

    serial monitor:

    Waiting for connection
    state: 2 -> 0 (2)
    reconnect
    scandone
    state: 0 -> 2 (b0)
    Waiting for connection
    state: 2 -> 3 (0)
    state: 3 -> 5 (10)
    add 0
    aid 2
    cnt
    Waiting for connection
    Waiting for connection
    Waiting for connection

    connected with iota_telecom, channel 6
    dhcp client start…
    Waiting for connection
    ip:10.132.39.81,mask:255.255.0.0,gw:10.132.0.1
    Waiting for connection
    [HTTP-Client][begin] url: http://10.132.16.241:8080/HTTPHITURL/RequestHandler?p1=300&p2=78&p3=500&p4=600&p5=500&p6=iota66&p7=iota77&p8=iota83&p9=iota84&p10=iota45
    [HTTP-Client][begin] host: 10.132.16.241 port: 8080 url: /HTTPHITURL/RequestHandler?p1=300&p2=78&p3=500&p4=600&p5=500&p6=iota66&p7=iota77&p8=iota83&p9=iota84&p10=iota45
    [HTTP-Client] connected to 10.132.16.241:8080
    [HTTP-Client] sending request header
    —–
    POST /HTTPHITURL/RequestHandler?p1=300&p2=78&p3=500&p4=600&p5=500&p6=iota66&p7=iota77&p8=iota83&p9=iota84&p10=iota45 HTTP/1.1
    Host: 10.132.16.241:8080
    User-Agent: ESP8266HTTPClient
    Connection: close
    Accept-Encoding: identity;q=1,chunked;q=0.1,*;q=0
    Content-Type: text/plain
    Content-Length: 136

    —–
    [HTTP-Client][returnError] error(-11): read Timeout
    [HTTP-Client][returnError] tcp stop
    [HTTP-Client][returnError] error(-4): not connected
    -11

    [HTTP-Client][end] tcp is closed
    [HTTP-Client][begin] url: http://10.132.16.241:8080/HTTPHITURL/RequestHandler?p1=300&p2=78&p3=500&p4=600&p5=500&p6=iota66&p7=iota77&p8=iota83&p9=iota84&p10=iota45
    [HTTP-Client][begin] host: 10.132.16.241 port: 8080 url: /HTTPHITURL/RequestHandler?p1=300&p2=78&p3=500&p4=600&p5=500&p6=iota66&p7=iota77&p8=iota83&p9=iota84&p10=iota45
    [HTTP-Client] failed connect to 10.132.16.241:8080
    [HTTP-Client][returnError] error(-1): connection refused
    [HTTP-Client][returnError] error(-4): not connected
    -1

    [HTTP-Client][end] tcp is closed
    [HTTP-Client][begin] url: http://10.132.16.241:8080/HTTPHITURL/RequestHandler?p1=300&p2=78&p3=500&p4=600&p5=500&p6=iota66&p7=iota77&p8=iota83&p9=iota84&p10=iota45
    [HTTP-Client][begin] host: 10.132.16.241 port: 8080 url: /HTTPHITURL/RequestHandler?p1=300&p2=78&p3=500&p4=600&p5=500&p6=iota66&p7=iota77&p8=iota83&p9=iota84&p10=iota45
    [HTTP-Client] failed connect to 10.132.16.241:8080
    [HTTP-Client][returnError] error(-1): connection refused
    [HTTP-Client][returnError] error(-4): not connected
    -1
    thank you.

    Like

    1. Hi!

      Unfortunately I’m not aware how these connections to the mysql database work, so I cannot be of much assistance.

      Nonetheless, I can recommend a couple of things to try to help you debugging:
      – Can you connect to the database and send the request using another tool, such as Postman? Postman is very easy to use and helps testing HTTP requests. So if it is also not working with postman, then it is not an ESP related problem.
      – Are you sure the database accepts plain HTTP requests? Or does it work over HTTPS (note the s, from secure)?
      – Why are you sending the URL as body of your HTTP request? You should just put the content you want to send to the server in the body of your POST request.

      Hope this helps.

      Best regards,
      Nuno Santos

      Liked by 1 person

  25. hello sir how are you. this post is very useful but i have some problems like
    what is meant by http.get()
    and what is meant by http.getstring()
    please resolve this issues

    Like

    1. Hi!

      Thanks for the feedback 🙂

      As explained in the tutorial, http.GET() is used to perform the actual request and http.getString() is used to get the response returned by the server.

      What is your concrete doubt about these methods?

      Best regards,
      Nuno Santos

      Like

    1. Hi!

      You can use the addHeader method of the HTTPClient class. Below is an example in the context of making a POST request, but it works the same way for GET:
      https://techtutorialsx.com/2016/07/21/esp8266-post-requests/

      The first argument is the name of the header and the second is the value.

      But please note that this tutorial uses HTTP, which means that the request headers are sent in plain text to the server.

      HTTP is not encrypted, HTTPS is (note the additional S at the end, from Secure).

      So this basically means that sending an API key is not secure and an attacker can easily intercept the request and steal it.

      Hope this helps 🙂

      Best regards,
      Nuno Santos

      Like

  26. Hi there, thanks for the tutorial! Do you know if there’s a way of doing this with the Wifi Client library? Basically I am running a local server with a page connected to a remote server. The remote server returns a json file. However I am not able to retrieve in the code. I’ll post here just my void loop() since it’s a bit long (my full code is here – https://forum.arduino.cc/index.php?topic=559170.new#new – and I’d be really greatful if you could answer here since I’m not getting much help over there). Thanks!!

    void loop(){
    WiFiClient client = server.available();
    if (!client) {
    return;
    }

    // Wait until the client sends some data
    SPL(“new client”);
    while(!client.available()){
    delay(1);
    }

    //this doesn’t print the payload (which sould be the json. It works well in the browser)
    byte b;
    while (client.readBytes(&b, 1) > 0) {
    Serial.write(b);*
    }

    client.flush();

    // Prepare the response
    String s = “HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n”;
    s += page; //the html page hosted on the local server and which connects to the remote one
    s += “\n”;

    // Send the response to the client
    client.print(s);
    }

    Liked by 1 person

    1. Hi!

      You’re welcome 🙂

      Well that’s a complex architecture, may I ask why can’t you directly fetch the json from the remote server?

      When you mention that you are hosting a server locally, are you hosting it on a computer on the same network of the ESP8266, or are you actually hosting it in the ESP8266?

      In either cases, you should be able to do pretty much what you can with the HTTP client library with the WIFi Client library.

      HTTP works on top of sockets, and the WiFiClient basically is a socket.

      Nonetheless, it means that you need to implement everything from the HTTP protocol yourself.

      Unfortunately I don’t have code on how to use HTTP directly on top of the WiFIClient, but the Arduino core has a very simple example:
      https://github.com/espressif/arduino-esp32/blob/master/libraries/WiFi/examples/WiFiClient/WiFiClient.ino

      Nonetheless, I really don’t recommend to implement HTTP on top of the WiFiClient yourself, unless you have a really good reason to do it and a good understanding about how the protocol works.

      Sending a request to a server and returning the response is something that can be achieved with a couple of lines using the HTTP Client library.

      It may seem too much work to change your code to use the HTTP Client, but in the long term it will most likely be easier to maintain and change.

      Hope this helps getting you in the right path 🙂

      Best regards,
      Nuno Santos

      Like

  27. Hi there, I only receive -1 as httpCode, no matter which website I try (even http://www.google.com). How can it be? I’m running this inside the setup since I only need it once. Thanks!

    HTTPClient http;
    http.begin(“http://www.google.com”);
    int httpCode = http.GET();

    Serial.print(“HTTP CODE: “);
    Serial.println(httpCode); //prints out HTTP CODE: -1

    if(httpCode > 0){ //doesn’t print and payload is empty
    String payload = http.getString();
    Serial.print(“PAYLOAD: “);
    Serial.println(payload);
    }

    http.end();

    Like

    1. Hi!

      Did you previously connect the device to a WiFi network and waited for the connection to complete?

      If you test the code exactly like it is on this post, does it also return -1 in every call?

      Let me know some more details so I can try to help 🙂

      Best regards,
      Nuno Santos

      Like

  28. Hi, I’m using the script to download a binary firmware file, which I then need to pass to the upload library as ‘Stream &data’. I can check the headers and content-type using http.collecteHeaders, but can’t workout how to pass the received file into the stream – using .getString() returns an empty string.

    Liked by 1 person

    1. Hi!

      I haven’t yet worked with streams and HTTP on the ESP8266, so I cannot help much.

      My suggestion is to ask around the ESP8266 Arduino core, so maybe someone there has already done it and can help 🙂

      Best regards,
      Nuno Santos

      Like

  29. Hey,

    Im trying to get your sketch uploaded to the ESP-01 which is connected to my Arduino. I have done the connections properly(http://www.teomaragakis.com/wp-content/uploads/2015/10/uno_esp_connection.png) and also the sketch compiles successfully. The issue occurs when I try to upload the sketch. The following errors are displayed:

    warning: espcomm_sync failed
    error: espcomm_open failed
    error: espcomm_upload_mem failed
    error: espcomm_upload_mem failed

    Please do check the link and let me know if the connections are right.
    Would be great if you can help me out!Thanks cheers!

    Like

    1. Hi,

      Were you able to upload any other sketches in the past with the same hardware configuration or is it the first time that you try?

      Unfortunately I never tried to upload code to the ESP8266 using an Arduino, so I cannot help much.

      Nonetheless, here is the hardware configuration needed to directly upload code to the ESP-01, without the need of using Arduino. Note that this post already has some time, but I think it is still working 🙂
      https://techtutorialsx.com/2016/02/28/esp8266-uploading-code-from-arduino-ide/

      Best regards,
      Nuno Santos

      Like

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google+ photo

You are commenting using your Google+ account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s