FastAPI не включает тип содержимого JSON в заголовке, если в URL-адресе есть конечный параметр sh - PullRequest
0 голосов
/ 01 мая 2020

В зависимости от того, есть ли в моем URL конечный знак sh, FastAPI (с сервером uvicorn) пропустит заголовок content type: application/json. Я обеспокоен тем, что клиенты могут непреднамеренно добавить в свои URL последние 10 * 529 *, а затем не получить ответ JSON, поэтому я хотел бы знать,

а) Это правильное поведение? ?

б) Как мне справиться с этим на стороне сервера?

Вот очень простое приложение FastAPI:

from fastapi import FastAPI
app = FastAPI()

app.get("/alist")
async def alist():
    somelist = [1, 2, 3, 4, 5]
    return somelist

Теперь вот как выглядят заголовки для «правильный» запрос, а именно один без конечного слэ sh:

enter image description here

Поскольку С завершающим слэ sh, тип содержимого: application / json отсутствует, и это может запутать клиента.

enter image description here

Итак, согласно моему вопросу выше, это нормально? И что мне делать с этим, чтобы предотвратить ошибки клиентов, ожидающих ответа JSON, но которые непреднамеренно добавили завершающий sla sh?

1 Ответ

2 голосов
/ 05 мая 2020

а) Это правильное поведение?

  • Такое поведение возникает из-за перенаправления (код состояния HTTP 307).
  • Я думаю, что это должно быть обработано автоматически.
  • Так что я думаю, что мы должны открыть новый выпуск в FastAPI репо.

б) Как мне справиться с этим на стороне сервера?

Существует множество различных решений:

1 - путем преобразования списка в диктовку с использованием одной ключевой уловки (простое решение):

from fastapi import FastAPI
app = FastAPI()

app.get("/alist")
async def alist():
    somelist = [1, 2, 3, 4, 5]
    return {"numbers": somelist}


2 - добавив заголовок «content-type» вручную:

, используя Response:

from fastapi import FastAPI, Response

app = FastAPI()

app.get("/alist")
async def alist(response: Response):
    # set content-type header to application/json
    response.headers["content-type"] = "application/json"
    somelist = [1, 2, 3, 4, 5]
    return somelist

, используя JSONResponse:

from fastapi import FastAPI
from fastapi.responses import JSONResponse

app = FastAPI()

app.get("/alist")
async def alist():
    somelist = [1, 2, 3, 4, 5]
    # you can add additional headers
    headers = {"X-Cat-Dog": "alone in the world", "Content-Language": "en-US"}
    # json response will enforce "content-type" header to be "application/json"
    return JSONResponse(content=somelist, headers=headers)


Вы можете Подробнее об ответах и ​​заголовках FastAPI можно узнать по https://fastapi.tiangolo.com/advanced/response-headers/

...