1

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

4
  • 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. fastapi.tiangolo.com/tutorial/query-params-str-validations/… Commented Aug 29, 2023 at 9:53
  • Related answers can be found here, here, as well as here, here and here. You might find helpful this and this as well. Commented Aug 29, 2023 at 11:22
  • Thank you But all have the explanation related to query parameter Commented Aug 29, 2023 at 11:31
  • You might want to have a look at this, as well as this and this. Commented Aug 30, 2023 at 4:47

1 Answer 1

1

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"]}
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.