2.3 HTTP Post Request with fetch() - Working with Data and APIs in JavaScript

Video Statistics and Information

Video
Captions Word Cloud
Reddit Comments
Captions
[BELL RINGING] Welcome back. I don't know what you did since the last video, but I went and got a haircut. Thank you. In this video, I am going to do something important, a key feature here. What I want to do is take data from the client, the latitude and longitude, and send it to the server and have the server receive it. Ultimately, the point of this is for the server to eventually save that to a database. But I'm not there yet. I just want to say, the client executes its own client side JavaScript, gets the latitude and longitude, and sends that data to the server and the server can just console log it. I'm going to need to look at three things in order to do this, I'm going to need to look at a concept known as a routing, how do I set up a route in express. This is the place, the end point for the API, the address at which I will send the data to and later also make a request to receive some data. I need to look at adding JSON parsing to express. I need the route when it receives data to understand that data as JSON and make it readable in my code. And then I also need to look at adapting the fetch function to specify a POST request, a request that is posting data or sending data to the server. Let's start with the route. So I want to set up a route on my server. So the way that I do that is by specifying this particular route, will either be a Get or a POST. In this case I expect a POST request, so I am going to go and say app.post. Now, once I have a post, I want to specify both the address where I want to receive that POST, as well as a callback function where I'm going to look at the information coming in and send a response back. So let's set up that address, let's set up the endpoint for this particular route. Where I want to receive the post. And I could call it anything I want, like Unicorn, Cupcake, Rainbow. Let's call it Rainbow. All right, I'll give it a name that's maybe more appropriate. I'm going to call it API. API because what I'm really doing here is setting up an application programming interface. This is my API for clients to send data to me. Next, I'm going to set up a callback, request response, and I'm using the ES6, JavaScript ES6 arrow syntax. Just sort of a nice, clean way of putting this in here. So the function is here and it has two arguments, request and response. The request variable hold everything that's contained within that request, all the data that's being sent, any information I need to know about that particular client that's sending the information. The response is a variable that I can use to send things back to the client. So I'm going to need ultimately to do stuff there, but for right now, I'm just going to say console.log request, and I'm just going to leave it like that because let's at least see if we can get this working and see if we can see something console log there. The next step is to have my client send something to this particular endpoint with a post. I can now move over to the client code and setup the post itself using Fetch. So I want to fetch my post over to slash API endpoint. So the client code, remember, this is confusing, server and index.js, client and index.html. I'm going to move over here. This, what I'll do is I'll choose to send this latitude and longitude as soon as I've received it. This is what I did in the previous video. And so now, what I can do is I'll setup-- I'm just going to make up an object called Data, and what I want to send is the latitude and longitude inside of an object. So that's what I want to send. So you might think all I need to do if I were just doing a regular Fetch, right? I just wanted to fetch something, that's a Get, regular Get request like I did in previous videos, I would then just say this. Hey, fetch me the stuff from slash API, and I might actually do that a little later when I just do a Get request and get the data that's in the database. But right now, what I want to do is send a POST. In order to send a POST, I need a second argument here, which is just a JavaScript object. I'm going to call it options, and that way I can set it up separately as a variable and kind of examine it more closely. The first property that I need to put in options is the method that I'm using. And that method is a POST. Now, there's a lot of information that you can put here under Options. And if you want to look at all the possibilities, I refer you back to the MDN web docs. There's a nice page here about fetch and we can kind of see all the stuff. OK, what mode and cash and credentials, but really what I need, what I want, the key thing that I want is body. So the body of the POST request is where I'm packaging up all of my data. And you can see here, even though there are different ways to send the data, what I want to do is send it as a string text. I want to stringify, take the JavaScript object data and make it into a JSON string. So I want exactly this right here. And there's one other piece that's important. I am specifically sending data in JSON format. So it's useful to specify that in something called a header. A header is something that can be packaged along with any POST or Get request that's moving between client and server, and it's a way of adding some additional meta information. You can read more about this also on the Mozilla docs. Headers have a name, a colon, and a value. And so the one that I want to use here, I can actually just go and grab it from here, which is this content type application JSON. I'm going to grab this and I'm also going to put this here in my code. So even though there's more that I could put, I the basic pieces that I need are, hey, I want this data to get sent as JSON. I want to tell you that it's going to be JSON and I want to post it to the API. So now we're good, right? So I get the location data, I put it into a JavaScript object, I package it as a POST, and I send it to my endpoint. And in the server, I receive a console log. Let's see what happens. So I'm going to say node index.js to run the server. I'm going to go back to the browser, I'm going to refresh my page, I probably should put some console logging in the client to see-- but presumably now, it's sensing the server. I don't see an error here, I go back to the server-- whoa, so this is good news. It console-logged something. Oh, as you might have noticed, there's a ton of information as I scroll through this, crazily. While there might be points at which I need to examine certain aspects of all of the metadata that's part of the request, all I really want to look at is the body. So let me now say console log request.body. Now, one thing I should mention, by the way, is notice how I have to re-run the server every single time I change it, there is a utility that I could use called Node Mon or node monitor, and I could install it as a global node module. [MUSIC PLAYING] And if I choose to use it, I can say now, Node Mon for node monitor index.js. And anytime I change the code it's going to rewrite the-- sorry, anytime I change the code, it's going to rerun the server. So, for example, I'm going to go here and say, console.log, I got a request. And over here, you'll notice it restarted the server. Sometimes you could run into trouble with this if you're doing a lot of things at once and I often prefer to manually stop and start the server. But for right now, this might be useful. So let me leave that there for right now. Then I'm going to go over here and hit refresh. And presumably it sent the data-- oh, it must have sent the data. Presumably it sent the data. I'll go back to the server. I got a request. Undefined, undefined. Why is it undefined? I forgot one of the steps that I told you about. So I did two of them, right? I set up my route called API to receive the request. I also modified the fetch function to send data as a POST. What I did not do was add to my server the ability to parse any incoming data as JSON. The way to do that is with the express function express.json. So, similarly to how I used express.static to say, I want to host-- I want this server to host static files, I'm going to say express.json because I want this server to be able to understand incoming data as JSON. So In the code I want to do just like I did up here, app.use express.static, I'm going to say app.use express.json. And then I can actually put some options in here to control or limit what is possible in terms of receiving data. So all of that is documented here on the Express website. Let's add just as an example this limit. So Limit allows me to specify the maximum size of anybody that's coming in. So I'll say a limit. Let's just say one megabyte as a kind of starting point. So this protects against flooding my server with huge amounts of data, potentially. There's more to protecting your server than just that, but we're seeing an inkling of this here. All right. So now we can see Node Mon has restarted my server a bunch of times and I should be able to go back to the webpage and hit Refresh. And it's going to get the latitude and longitude, and now I should see the server-- ha-ha, I got a request and I got the latitude and longitude. So the server has successfully received the data. This is what I wanted to do in this video. So in a way, I'm done. Oh, that's exciting. What I've actually done here is pretty terrible in that it is required that you complete a request. So if a Get request or a POST request is coming into the server, I need to do something to complete it. The nicest thing to do if I'm trying to be polite here, which it's good for your server to be polite and send a response back. But at a minimum, I can just say response.end. So this is required to do something. What I think that I would like to do which makes more sense is say response.json, which is a function that will send data. I can also say response.send for just a short message as a string, but I want to send maybe an object back with some data in it. So I'm going to do response.json, and then I would say-- I could say like status. I'm just making this up. Success. And then maybe I'll just repeat back what was said to me. This is the therapy server, it listens and then it just repeats it back to you. So I'll say latitude, lat, longitude, lon. So this is what I want to send back now as JavaScript. OK. So then in the client I need to do something to receive this. So if I go back to index.html, what I have here calling the fetch function is where I'm sending the data, and Fetch returns a promise. So I can just say dot then, and then handle the response. Response console.log.response. All right. So let's take a look at this in the browser now. I'm going to hit refresh. It's retrieving my latitude and longitude, it's going to send this to the server, and then here we are, the response. Oh, boy. Look at this. Lat is not defined. Let's look at my code back on the server-- oh, yes. These aren't a thing. Remember, everything is in request.body. So what I could do is say data equals-- I could put this in another variable. And then I could just say data dot-- I could just say request.body.lat, data.lon. OK. There we go. Let's try this again. So the server should be restarting now any time I make changes because I'm running Node Mon, then I could just go back to the client and hit Refresh. And there is, the response. Now, this isn't what I was looking for. And if you recall from when I first looked at the Fetch function in this whole series, when Response comes back after a Fetch call, it comes in as a data stream. So it's up to you to specify how you want to read that, is it text, is it a blob, is it json, and I want to read this as JSON. So I've got a handle that in the client. And I could use another dot then, but it might be nice to make this an async function, right? This callback inside of get current position can actually be an async function with the async keyword, and then I can use-- wait, so I'm going to say const response equals await Fetch API options, then const json. I'll just maybe call it data. There's a wait response.json, and then console log that data. OK. Now I didn't change anything in the server, even if I did, Node Mon going to rerun it for me. Now I should be able to refresh here. Data has already been declared. I'm reusing-- I already use data up here, so let's just call this json. One of the nice things about using or let is it's going to enforce these kind of things to not by action use the same variable. And there it is. Status success and latitude and longitude. [BELL RINGING] We have completed this feature to review. We have now a server that hosts a static file. So when I go and load the server into my browser, I see index.html. The JavaScript HTML locates the latitude and longitude, sends that with a POST to the server, the server receives it, console logs it out, and sends it back saying, I got it. That handshake is complete, the data is exchanged. Usually when I finish these videos I like to give you a little exercise to do, so here's one. The goal, what I'm going to do with the next video is actually save the latitude and longitude along with a timestamp to a database so that I can keep this history of all of my latitude and longitudes over time. Two steps along the way to using a database is, number one, just make a variable, a variable like an array. Every time you get that latitude and longitude save that latitude and longitude into an array. That is persistence. Of course, once you quit the server and restart the server, it's lost. So another thing you could try to do, and this requires some detective work, is look up the Node file system package. Maybe you could use the node file system package to save all of the stuff in that array to a text file. And you can always load that text file, maybe it's JSON format, maybe it's plain text, maybe it's even CSV. Also, while you're doing this, whether you're saving the latitude longitude to an array or a text file, you might want to add a button to your HTML page so that every time you click that button that's when you send the latitude and longitude to the server itself. So this is something that you can really start with, and I will actually implement this and have two examples that show it just storing it an array and then saving it to a local JSON file. But what I'm going to come back to in the next video is a bit more direct. I'm going to use a database node package called NeDB to actually save to a database, and I'll talk about what a database is and what some of the advantages are in the next video. So see you there. [BELL RINGING] [MUSIC PLAYING]
Info
Channel: The Coding Train
Views: 205,418
Rating: 4.961257 out of 5
Keywords: fetch api, web development, javascript fetch api, fetch api post, fetch javascript, http post, post request, data, apis, http post and get, web development career
Id: Kw5tC5nQMRY
Channel Id: undefined
Length: 16min 1sec (961 seconds)
Published: Mon Jun 03 2019
Related Videos
Note
Please note that this website is currently a work in progress! Lots of interesting data and statistics to come.