0

Error:

Traceback (most recent call last):
File "C:\Users\SBiradar\AppData\Local\Programs\Python\Python39\lib\runpy.py", line 197, in _run_module_as_main
  return _run_code(code, main_globals, None,
File "C:\Users\SBiradar\AppData\Local\Programs\Python\Python39\lib\runpy.py", line 87, in run_code
  exec(code, run_globals)
File "C:\Users\SBiradar\AppData\Local\Programs\Python\Python39\Scripts\uvicorn.exe_main.py", line 7, in
File "C:\Users\SBiradar\AppData\Local\Programs\Python\Python39\lib\site-packages\click\core.py", line 1130, in call
  return self.main(*args, **kwargs)
File "C:\Users\SBiradar\AppData\Local\Programs\Python\Python39\lib\site-packages\click\core.py", line 1055, in main
  rv = self.invoke(ctx)
File "C:\Users\SBiradar\AppData\Local\Programs\Python\Python39\lib\site-packages\click\core.py", line 1404, in invoke
  return ctx.invoke(self.callback, **ctx.params)
File "C:\Users\SBiradar\AppData\Local\Programs\Python\Python39\lib\site-packages\click\core.py", line 760, in invoke
  return _callback(*args, **kwargs)
File "C:\Users\SBiradar\AppData\Local\Programs\Python\Python39\lib\site-packages\uvicorn\main.py", line 410, in main
  run(
File "C:\Users\SBiradar\AppData\Local\Programs\Python\Python39\lib\site-packages\uvicorn\main.py", line 578, in run
  server.run()
File "C:\Users\SBiradar\AppData\Local\Programs\Python\Python39\lib\site-packages\uvicorn\server.py", line 61, in run
  return asyncio.run(self.serve(sockets=sockets))
File "C:\Users\SBiradar\AppData\Local\Programs\Python\Python39\lib\asyncio\runners.py", line 44, in run
  return loop.run_until_complete(main)
File "C:\Users\SBiradar\AppData\Local\Programs\Python\Python39\lib\asyncio\base_events.py", line 647, in run_until_complete
  return future.result()
File "C:\Users\SBiradar\AppData\Local\Programs\Python\Python39\lib\site-packages\uvicorn\server.py", line 68, in serve
  config.load()
File "C:\Users\SBiradar\AppData\Local\Programs\Python\Python39\lib\site-packages\uvicorn\config.py", line 473, in load
  self.loaded_app = import_from_string(self.app)
File "C:\Users\SBiradar\AppData\Local\Programs\Python\Python39\lib\site-packages\uvicorn\importer.py", line 21, in import_from_string
  module = importlib.import_module(module_str)
File "C:\Users\SBiradar\AppData\Local\Programs\Python\Python39\lib\importlib_init.py", line 127, in import_module
return _bootstrap._gcd_import(name[level:], package, level)
File "", line 1030, in _gcd_import
File "", line 1007, in _find_and_load
File "", line 986, in _find_and_load_unlocked
File "", line 680, in _load_unlocked
File "", line 850, in exec_module
File "", line 228, in _call_with_frames_removed
File "C:\Fast-API\main6.py", line 12, in
  def comments(id: list):
File "C:\Users\SBiradar\AppData\Local\Programs\Python\Python39\lib\site-packages\fastapi\routing.py", line 661, in decorator
  self.add_api_route(
File "C:\Users\SBiradar\AppData\Local\Programs\Python\Python39\lib\site-packages\fastapi\routing.py", line 600, in add_api_route
  route = route_class(
File "C:\Users\SBiradar\AppData\Local\Programs\Python\Python39\lib\site-packages\fastapi\routing.py", line 446, in init
  self.dependant = get_dependant(path=self.path_format, call=self.endpoint)
File "C:\Users\SBiradar\AppData\Local\Programs\Python\Python39\lib\site-packages\fastapi\dependencies\utils.py", line 328, in get_dependant
  if is_body_param(param_field=param_field, is_path_param=is_path_param):
File "C:\Users\SBiradar\AppData\Local\Programs\Python\Python39\lib\site-packages\fastapi\dependencies\utils.py", line 481, in is_body_param
  assert is_scalar_field(
AssertionError: Path params must be of one of the supported types

Approach used:

from typing import Union

from fastapi import FastAPI, Path, Query
from typing_extensions import Annotated

app = FastAPI()

@app.get("/items/{item_ids}")
def read_items(item_ids: list):
  return {"item_ids": item_ids}

I was trying to get accept arraylist from the users in path parameter

Gino Mempin
  • 25,369
  • 29
  • 96
  • 135
  • 1
    How do you expect the API to be called? Because the path parameter is for declaring your API to be called like `/items/1`, `/items/2`, etc. It cannot be a `list`. If you want to call your API to pass a list of IDs, what you probably need is a query parameter that access multiple values, ex. https://fastapi.tiangolo.com/tutorial/query-params-str-validations/#query-parameter-list-multiple-values – Gino Mempin Aug 29 '23 at 09:53
  • Related answers can be found [here](https://stackoverflow.com/a/73982479/17865804), [here](https://stackoverflow.com/a/70840850/17865804), as well as [here](https://stackoverflow.com/a/71039241/17865804), [here](https://stackoverflow.com/a/71554017/17865804) and [here](https://stackoverflow.com/a/73067473/17865804). You might find helpful [this](https://stackoverflow.com/a/75998823/17865804) and [this](https://stackoverflow.com/a/71068465/17865804) as well. – Chris Aug 29 '23 at 11:22
  • Thank you But all have the explanation related to query parameter – Vinuta Basavaraj Hiremath Aug 29 '23 at 11:31
  • You might want to have a look at [this](https://stackoverflow.com/a/72239186/17865804), as well as [this](https://stackoverflow.com/a/73295133/17865804) and [this](https://stackoverflow.com/a/72815364/17865804). – Chris Aug 30 '23 at 04:47

1 Answers1

0

I do not recommend this, but if you really need to make the list of IDs a path parameter for whatever reason, you can simply treat item_ids as a str, and then just use str.split to turn it into a list:

from fastapi import FastAPI

app = FastAPI()

@app.get("/items/{item_ids}")
def read_items(item_ids: str):
  item_ids_as_list = item_ids.split(",")
  return {"item_ids": item_ids_as_list}
$ curl -s "http://127.0.0.1:8000/items/1,2,3,4"
{"item_ids":["1","2","3","4"]}

But then, as I mentioned in my comment, this is not the normal RESTful way to define your API. A path parameter is supposed to access one resource, i.e. /item/1, /item/2, /item/3, etc. To define an API that accesses multiple resources, it's more common to make it a query parameter (related reading: How to construct a REST API that takes an array of id's for the resources):

from fastapi import FastAPI, Query
from typing import Annotated

app = FastAPI()

@app.get("/items")
def read_items(item_ids: Annotated[list[str] | None, Query()] = None):
  return {"item_ids": item_ids}
$ curl -s "http://127.0.0.1:8000/items?item_ids=1&item_ids=2"
{"item_ids":["1","2"]}

$ curl -s "http://127.0.0.1:8000/items?item_ids=3,4,5,6"
{"item_ids":["3,4,5,6"]}
Gino Mempin
  • 25,369
  • 29
  • 96
  • 135