0%

Verzoeken met de hand schrijven

Een URL uit elkaar halen

In hoofdstuk 1 werd het verzoekdoel met de hand getypt: /v1/items?page=1&page_size=2, met het adres ("practice-api", 8080) apart geschreven in ADDRESS. Een bevat beide in één , http://practice-api:8080/v1/items?page=1&page_size=2, en een client moet hem uit elkaar halen voordat hij iets kan versturen. Sommige delen bepalen waarmee verbinding wordt gemaakt, sommige gaan in het verzoek, en één deel wordt nooit verstuurd.

De standaardbibliotheek van Python haalt hem voor je uit elkaar: urlsplit, uit de urllib.parse. Voer het uit op een URL waarin elk deel is ingevuld:

Try it

urlsplit geeft één terug, en elk deel is een attribuut ervan. parts.port is het getal 8080, een int; elk ander deel is een string. De scheidingstekens zijn verdwenen: geen ://, geen : vóór de , geen ? vóór de query, geen # vóór het fragment.

Waar elk deel naartoe gaat

Hier is dezelfde URL met een label bij elk deel, en waar het terechtkomt. Volg elk deel omlaag naar het verzoek onderaan:

Het scheme kiest gewone TCP, host en poort kiezen de verbinding en de Host-regel, pad en query worden het verzoekdoel, en het fragment wordt nooit verstuurd.

Het verzoek dat deze URL oplevert, is GET /v1/items?page=2 HTTP/1.1 met de regel Host: practice-api:8080, verstuurd over een met ("practice-api", 8080). Nergens staat #top in.

Scheme. http betekent gewone over een TCP-verbinding, het soort dat je in hoofdstuk 1 opende. https betekent dezelfde HTTP, vervoerd binnen een versleutelde -verbinding. De site kan geen TLS-verbindingen openen, en hoofdstuk 9 legt uit wat die laag toevoegt; tot dan begint elke URL in deze cursus met http.

Host en poort. Deze zeggen waarmee verbinding wordt gemaakt. De hostnaam wordt omgezet in een , zoals in Networks with Python, en (host, port) is de adres- die je connect- krijgt. Dezelfde twee gaan ook in het verzoek zelf, in de Host-regel die hoofdstuk 1 als HOST_LINE leverde. Les 4 legt uit waarom de server ze opnieuw nodig heeft terwijl de verbinding hem al bereikte.

Pad en query. Deze worden het verzoekdoel, het tweede woord van de verzoekregel: het pad, dan ? en de query als die er is. Dit is het enige deel van de URL dat de verzoekregel bevat. Er bestaat ook een vorm van de verzoekregel die de hele URL bevat, gebruikt als een client met een proxy praat die verzoeken elders doorstuurt; een verzoek dat rechtstreeks naar de server gaat waarvoor het bedoeld is, zoals al de jouwe, bevat alleen het pad en de query.

Fragment. Het deel na # wijst naar een plek binnen het document, zoals een kop op een webpagina. Het is alleen voor de client: een browser gebruikt het om te scrollen nadat het document is aangekomen. Het staat nooit in het verzoek.

Welke tekst komt voor de URL http://practice-api:8080/v1/items?page=2#top als doel in de verzoekregel?

Als de URL geen poort noemt

De meeste URL’s noemen geen poort. Dan is parts.port None, en vult de client de standaardpoort voor het scheme in: 80 voor http, 443 voor https.

Try it

books.test is een verzonnen naam: namen die op .test eindigen, zijn gereserveerd voor voorbeelden en tests en horen nooit bij een echte site. urlsplit haalt de string alleen uit elkaar, dus het werkt op elke URL zonder de naam op te zoeken of ergens verbinding mee te maken. Je client maakt hier verbinding met poort 80, terwijl de None nog steeds van belang is voor de Host-regel, zoals les 4 laat zien.

urlsplit laat het pad ook leeg als de URL direct na de host eindigt, zoals in http://books.test. De verzoekregel heeft daar toch een doel nodig, en het doel voor “de root van de server” is /. Les 5 handelt dat geval af.

Wat drukt dit af?

from urllib.parse import urlsplit

parts = urlsplit("http://books.test:9000/shelves/3?sort=title&page=2#notes")
print(parts.path)
print(parts.query)
print(parts.port)

Elk deel van elke URL tot nu toe bestond uit gewone ASCII-woorden: items, page=2, fiction. Echte waarden zijn niet zo netjes. Een boektitel kan een spatie, een schuine streep, een ampersand of een letter buiten ASCII bevatten, en elk daarvan zou de verzoekregel breken of veranderen wat het doel betekent. De volgende les maakt zulke waarden veilig om te versturen.