# HTML forms: sending form data

Let's continue the Microblog project by working on the form users will submit to create new entries.

HTML forms have 3 main parts to them:

  • The <form> element itself, which describes how the form behaves in terms of sending data.
  • A button used to submit the form, and send data as described in the <form> element.
  • Form inputs, each of which is comprised of a label and a field.

Let's begin by talking about the <form> element itself.

# The form element

There are two ways of submitting data in forms: using a GET request (the default), or using a POST request. This is called the method.

In addition to the method, we can specify an action, which is the URL that will receive the form data.

This form uses GET, and the form data is sent to /entry:

<form action="/entry"></form>

If we don't specify an action attribute, then data is sent to the current URL:

<form></form>

We can manually specify the method (with or without an action):

<form method="GET" action="/entry"></form>

And we can use POST instead of GET:

<form method="POST" action="/entry"></form>

# Sending data with a form

But what are the differences between GET and POST? To understand this, let's add a text field and a submit button to our form:

<form>
    <label for="sample-field">Sample:</label>
    <input type="text" name="sample" id="sample-field" />
    <button type="submit">Submit</button>
</form>

If we open an HTML file containing this with our browser, we'll see something like this:

IMAGE

Let's type something in our field, and press Submit:

IMAGE

Now notice that the page seemingly refreshes. The form is emptied. That's because the form sent the data to the URL defined in the action attribute. But since we didn't add an action attribute, the default is the current URL.

However, notice that the URL changed slightly. We ended up with ?sample=Bob at the end (if you typed "Bob" in the field).

That is the form data that the form sent to the current URL.

So the form sent the data to the current URL, which means that it made another request to our HTML file. Our HTML file doesn't use the form data for anything (we'll learn how to do that later), so all that happened is the browser loaded the HTML contents and painted them again.

# GET requests and query string parameters

Whenever we send form data using GET, the data will be appended to the URL as query string parameters.

Query string parameters are key-value pairs appended at the end of a URL. They are a standard way of sending non-sensitive data in web requests.

If you have more than one, they'll be separated by ampersands:

?sample=Bob&last_name=Smith

# POST requests

If we change the form's method to "POST", reload the page, and submit again, you'll see no query string parameters.

When we send data with POST, data is included in the body, a different part of the request, instead of being part of the URL.

Data in the body is a bit more secure because it's not visible in the URL. For sensitive information, we should use POST.

Also, there are limits to the size of URLs which means that for very long forms, GET might not be viable.

# Conclusion

We've learned how to send data using HTML forms. In a later section, after we learn about back-end development with Flask, we'll learn about how to receive and use form data!