-2

If i use the request.body() method, it's working. But is a byte type, I want get json or dict type data in order to get username and password Key content

async def set_body(request: Request):
    receive_ = await request._receive()

    async def receive() -> Message:
        return receive_

    request._receive = receive

@app.middleware("http")
async def demo(request: Request, call_next):
    await set_body(request)
    jsob_body = await request.json()
    print(jsob_body)
    response = await call_next(request)
    retu**strong text**rn response


import requests

url = "http://127.0.0.1:8000/token"

payload={'username': 'test',
'password': 'test_pw'}
files=[

]
headers = {}

response = requests.request("POST", url, headers=headers, data=payload, files=files)

I am able to get this but there is an error that will break the POST request

Traceback (most recent call last):
  File "D:\devtools\anaconda3\envs\fastapi\lib\site-packages\uvicorn\protocols\http\httptools_impl.py", line 372, in run_asgi
    result = await app(self.scope, self.receive, self.send)
  File "D:\devtools\anaconda3\envs\fastapi\lib\site-packages\uvicorn\middleware\proxy_headers.py", line 75, in __call__
    return await self.app(scope, receive, send)
  File "D:\devtools\anaconda3\envs\fastapi\lib\site-packages\fastapi\applications.py", line 269, in __call__
    await super().__call__(scope, receive, send)
  File "D:\devtools\anaconda3\envs\fastapi\lib\site-packages\starlette\applications.py", line 124, in __call__
    await self.middleware_stack(scope, receive, send)
  File "D:\devtools\anaconda3\envs\fastapi\lib\site-packages\starlette\middleware\errors.py", line 184, in __call__
    raise exc
  File "D:\devtools\anaconda3\envs\fastapi\lib\site-packages\starlette\middleware\errors.py", line 162, in __call__
    await self.app(scope, receive, _send)
  File "D:\devtools\anaconda3\envs\fastapi\lib\site-packages\starlette\middleware\base.py", line 68, in __call__
    response = await self.dispatch_func(request, call_next)
  File "D:\codes\ocr_server\.\main.py", line 43, in middle
    jsob_body = await request.json()
  File "D:\devtools\anaconda3\envs\fastapi\lib\site-packages\starlette\requests.py", line 242, in json
    self._json = json.loads(body)
  File "D:\devtools\anaconda3\envs\fastapi\lib\json\__init__.py", line 357, in loads
    return _default_decoder.decode(s)
  File "D:\devtools\anaconda3\envs\fastapi\lib\json\decoder.py", line 337, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
  File "D:\devtools\anaconda3\envs\fastapi\lib\json\decoder.py", line 355, in raw_decode
    raise JSONDecodeError("Expecting value", s, err.value) from None
json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)
Chris
  • 18,724
  • 6
  • 46
  • 80
姚佳优
  • 1
  • 1

1 Answers1

0

Use json instead of data:

response = requests.request("POST", url, headers=headers, json=payload, files=files)
Paweł Rubin
  • 2,030
  • 1
  • 14
  • 25