Making HTTP requests
The HTTP module allows you to make standard HTTP requests from your Anvil app. It is available for both client code and server code, for both free and paid users.
Calling anvil.http.request
Begin by importing the anvil.http
module.
import anvil.http
Once you have imported the anvil.http
module, you make web requests using the anvil.http.request
function.
resp = anvil.http.request("https://api.mysite.com/foo")
print(f"Response MIME type: {resp.content_type}")
There are a range of arguments to allow you to specify the HTTP method, custom headers, data to send in the request body, and other things you need to include.
See this section of API docs for a full list of parameters.
resp = anvil.http.request(url="https://api.mysite.com/foo",
method="POST",
data="Data to post",
headers= {
"Authentication": "my-access-key",
})
print(f"Response MIME type: {resp.content_type}")
You can do this in either client or server code (be aware of Browser Restrictions when making requests from client code)
Using the response
If the HTTP status code is successful (200-299), the anvil.http.request
function returns the response body of the request.
By default, this will be a Media
object.
response = anvil.http.request("http://ip.jsontest.com")
print(f"The response body was {response.get_bytes()}")
If the json
parameter is set to True
, a JSON-decoded object will be returned.
response = anvil.http.request("http://ip.jsontest.com", json=True)
print(f"My IP address is {response['ip']}")
HTTP error codes
If the HTTP status code is an error code, an anvil.http.HttpError
will be raised. HttpError
has two attributes:
status
- The HTTP status code (a number)content
- The response body (JSON-decoded as above if possible, or aMedia
object if JSON decoding has failed)
# This code will print "Error 404":
try:
anvil.http.request("https://anvil.works/404")
except anvil.http.HttpError as e:
print(f"Error {e.status}")
URL-encoding strings
The HTTP module also contains functions for URL-encoding and URL-decoding strings. This is useful when constructing links to other sites, or URL-encoding URL hash parameters in an Anvil app.
# Prints "Hello%20there"
print(anvil.http.url_encode("Hello there"))
# Prints "Hello there"
print(anvil.http.url_decode("Hello%20there"))
Browser Restrictions
Web browsers restrict the HTTP requests you can make from form code. When the web browser disallows a request, an HttpError
is raised with a status
of 0
. The easiest solution is to make your request from a Server Module instead.
A client-side HttpError
with status 0
is usually for one of three reasons:
The URL is inaccessible (cannot connect to host).
You’re requesting an unencrypted (
http://
) URL. All Anvil apps are served over encrypted links (HTTPS), so the browser does not allow unencrypted requests from client-side code.The URL doesn’t obey the cross-origin rules. (It needs to respond to an OPTIONS request, have the right CORS headers, etc.)
There are two possible ways to remedy this error:
Make the URL behave correctly. (Make sure it’s accessible, serve it over HTTPS, give it the right CORS headers, and so on. This will require some expertise with web serving, and requires you to control the URL you are requesting. You may need to open up your browser’s developer tools to work out precisely what the problem is.)
Make the request from a server module instead. Server modules don’t run in the web browser, so they don’t have any of the browser’s limitations.
Do you still have questions?
Our Community Forum is full of helpful information and Anvil experts.