Sorgu, bağlantıdaki ? kısmından sonra gelen ve & işareti ile ayrılan anahtar-değer çiftlerinin oluşturduğu bir kümedir.
Örneğin, aşağıdaki bağlantıda:
http://127.0.0.1:8000/items/?skip=0&limit=10
...sorgu parametreleri şunlardır:
skip: değeri 0'dır
limit: değeri 10'dır
Parametreler bağlantının bir parçası oldukları için doğal olarak string olarak değerlendirilirler.
Fakat, Python tipleri ile tanımlandıkları zaman (yukarıdaki örnekte int oldukları gibi), parametreler o tiplere dönüştürülür ve o tipler çerçevesinde doğrulanırlar.
Yol parametreleri için geçerli olan her türlü işlem aynı şekilde sorgu parametreleri için de geçerlidir:
Bu durumda, q fonksiyon parametresi isteğe bağlı olacak ve varsayılan değer olarak None alacaktır.
Ek bilgi
Ayrıca, dikkatinizi çekerim ki; FastAPI, item_id parametresinin bir yol parametresi olduğunu ve q parametresinin yol değil bir sorgu parametresi olduğunu fark edecek kadar beceriklidir.
Aşağıda görüldüğü gibi dönüştürülmek üzere bool tipleri de tanımlayabilirsiniz:
fromfastapiimportFastAPIapp=FastAPI()@app.get("/items/{item_id}")asyncdefread_item(item_id:str,q:str|None=None,short:bool=False):item={"item_id":item_id}ifq:item.update({"q":q})ifnotshort:item.update({"description":"This is an amazing item that has a long description"})returnitem
fromtypingimportUnionfromfastapiimportFastAPIapp=FastAPI()@app.get("/items/{item_id}")asyncdefread_item(item_id:str,q:Union[str,None]=None,short:bool=False):item={"item_id":item_id}ifq:item.update({"q":q})ifnotshort:item.update({"description":"This is an amazing item that has a long description"})returnitem
Bu durumda, eğer şu adrese giderseniz:
http://127.0.0.1:8000/items/foo?short=1
veya
http://127.0.0.1:8000/items/foo?short=True
veya
http://127.0.0.1:8000/items/foo?short=true
veya
http://127.0.0.1:8000/items/foo?short=on
veya
http://127.0.0.1:8000/items/foo?short=yes
veya adres, herhangi farklı bir harf varyasyonu içermesi durumuna rağmen (büyük harf, sadece baş harfi büyük kelime, vb.) fonksiyonunuz, bool tipli short parametresini True olarak algılayacaktır. Aksi halde False olarak algılanacaktır.
FastAPI neyin ne olduğunu ayırt edebileceğinden dolayı aynı anda birden fazla yol ve sorgu parametresi tanımlayabilirsiniz.
Ve parametreleri, herhangi bir sıraya koymanıza da gerek yoktur.
İsimlerine göre belirleneceklerdir:
fromfastapiimportFastAPIapp=FastAPI()@app.get("/users/{user_id}/items/{item_id}")asyncdefread_user_item(user_id:int,item_id:str,q:str|None=None,short:bool=False):item={"item_id":item_id,"owner_id":user_id}ifq:item.update({"q":q})ifnotshort:item.update({"description":"This is an amazing item that has a long description"})returnitem
fromtypingimportUnionfromfastapiimportFastAPIapp=FastAPI()@app.get("/users/{user_id}/items/{item_id}")asyncdefread_user_item(user_id:int,item_id:str,q:Union[str,None]=None,short:bool=False):item={"item_id":item_id,"owner_id":user_id}ifq:item.update({"q":q})ifnotshort:item.update({"description":"This is an amazing item that has a long description"})returnitem
Türü yol olmayan bir parametre (şu ana kadar sadece sorgu parametrelerini gördük) için varsayılan değer tanımlarsanız o parametre zorunlu olmayacaktır.
Parametre için belirli bir değer atamak istemeyip parametrenin sadece isteğe bağlı olmasını istiyorsanız değerini None olarak atayabilirsiniz.
Fakat, bir sorgu parametresini zorunlu yapmak istiyorsanız varsayılan bir değer atamamanız yeterli olacaktır: