es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Con FastAPI, ¿cómo agregar el conjunto de caracteres (charset) al tipo de contenido (media-type) en el encabezado de solicitud en un documento OpenAPI (Swagger)?

Con FastAPI, ¿cómo agregar el conjunto de caracteres (charset) al tipo de contenido (media-type) en la cabecera de solicitud en el documento OpenAPI (Swagger)?

@app.post(“/”)
def post_hello(username: str = Form(…)):
return {“Hello”: username}

OpenAPI (http:///docs) muestra “application/x-www-form-urlencoded”.

Intenté cambiarlo de la siguiente manera:

def post_hello(username: str = Form(…, media_type=”application/x-www-form-urlencoded; charset=cp932″)):
return {“Hello”: “World!”, “userName”: username}

Pero no se agrega “charset=cp932”.

Quiero establecer “application/x-www-form-urlencoded; charset=cp932” como Content-Type en la solicitud.
Y quiero obtener el nombre de usuario (username) decodificado por el conjunto de caracteres.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para agregar el conjunto de caracteres al Content-Type en el encabezado de la solicitud en el documento OpenAPI (Swagger) con FastAPI, puedes definir un tipo de media personalizado en la aplicación FastAPI, de la siguiente manera:

    from fastapi import FastAPI, Form
    from fastapi.openapi.utils import get_openapi
    from fastapi.responses import JSONResponse
    
    app = FastAPI()
    
    @app.post("/")
    def post_hello(username: str = Form(...)):
        return {"Hello": username}
    
    # tipo de media personalizado
    CUSTOM_MEDIA_TYPE = "application/x-www-form-urlencoded; charset=cp932"
    
    # función para sobrescribir el esquema OpenAPI predeterminado
    def custom_openapi():
        if app.openapi_schema:
            return app.openapi_schema
        openapi_schema = get_openapi(
            title="Muestra de tipo de media personalizado",
            version="0.0.1",
            description="API de muestra que utiliza un tipo de media personalizado",
            routes=app.routes,
        )
        # agregar el tipo de media personalizado al esquema
        openapi_schema["components"]["schemas"]["application/x-www-form-urlencoded"]["type"] = CUSTOM_MEDIA_TYPE
        app.openapi_schema = openapi_schema
        return app.openapi_schema
    
    # sobrescribir la ruta OpenAPI predeterminada con la función custom_openapi
    app.openapi = custom_openapi
    
    
    # middleware de respuesta para agregar el conjunto de caracteres al Content-Type en el encabezado de respuesta
    async def add_charset_header(request, call_next):
        response = await call_next(request)
        content_type = response.headers['Content-Type']
        if '; charset=' not in content_type:
            response.headers['Content-Type'] = content_type + f'; charset={CUSTOM_MEDIA_TYPE.split("; ")[-1]}'
        return response
    
    app.middleware('http')(add_charset_header)
    

    En este ejemplo, definimos un tipo de media personalizado con el conjunto de caracteres especificado (application/x-www-form-urlencoded; charset=cp932) y sustituimos el esquema OpenAPI predeterminado con la función custom_openapi que agrega el tipo de media personalizado al esquema.

    Para agregar el conjunto de caracteres al Content-Type en el encabezado de respuesta, utilizamos un middleware de respuesta que añade el conjunto de caracteres al encabezado si falta.

    Después de ejecutar la aplicación, el documento OpenAPI (Swagger) debería mostrar el tipo de media personalizado con el conjunto de caracteres:

    [![openapi doc][1]][1]

    Y el encabezado de respuesta de una solicitud con un parámetro de datos de formulario debería incluir el conjunto de caracteres especificado:

    Content-Type: application/x-www-form-urlencoded; charset=cp932
    

    Nota: Es posible que necesites ajustar el middleware de respuesta para comprobar otros tipos de contenido y añadir el conjunto de caracteres en consecuencia. Además, ten en cuenta que la codificación de los datos de formulario dependerá de las implementaciones del cliente y del servidor, así que asegúrate de que ambas estén utilizando la misma codificación.

Comments are closed.