当前位置: 首页 > 知识库问答 >
问题:

如何将JSON数据从JavaScript前端发布到FastAPI后端?

徐淳
2023-03-14

我正在尝试将一个名为“ethAddress”的值从客户端的输入表单传递给FastAPI,以便我可以在函数中使用它来生成matplotlib图表。

我使用fetch在Charts中发布输入的文本。tsx文件:

   fetch("http://localhost:8000/ethAddress", {
      method: "POST",
      headers: { "Content-Type": "application/json" },
      body: JSON.stringify(ethAddress),
    }).then(fetchEthAddresses);

然后我有了我的api。py文件设置如下:

#imports
app = FastAPI()

@app.get("/ethAddress")
async def get_images(background_tasks: BackgroundTasks, ethAddress: str):
    
    image = EthBalanceTracker.get_transactions(ethAddress)
    img_buf = image
    background_tasks.add_task(img_buf.close)
    headers = {'Content-Disposition': 'inline; filename="out.png"'}
    return Response(img_buf.getvalue(), headers=headers, media_type='image/png')


@app.post("/ethAddress")
async def add_ethAddress(ethAddress: str):
    return ethAddress

据我所知,我使用< code > fetch < code > POST 请求将请求体中的“ethAddress”从客户端传递到后端,在后端,我可以访问使用FastAPI中的< code>@app.post发布的值。然后,我将该值作为字符串返回。然后,我在< code>GET路径中使用它来生成图表。

我得到这个错误:

INFO:     127.0.0.1:59821 - "POST /ethAddress HTTP/1.1" 422 Unprocessable Entity
INFO:     127.0.0.1:59821 - "GET /ethAddress HTTP/1.1" 422 Unprocessable Entity

我还尝试将客户端上的获取方法切换为 GET 而不是 POST。但得到以下错误:

TypeError: Failed to execute 'fetch' on 'Window': Request with GET/HEAD method cannot have body.

共有1个答案

郗河
2023-03-14

您在终端节点中定义 ethAddress 的方式应作为查询参数;因此,422 无法处理的实体错误。根据文档:

当您声明不属于路径参数的其他函数参数时,它们会自动解释为“查询”参数。

对于要解释为JSON的参数,您需要:

创建Pydant模型

from pydantic import BaseModel

class Item(BaseModel):
    eth_addr: str

@app.post('/ethAddress')
def add_eth_addr(item: Item):
    return item

FastAPI将期望这样的机构:

{
    "eth_addr": "some addr"
}

使用提取 API:

//...
headers: {
'Accept': 'application/json',
'Content-Type': 'application/json'
},
body: JSON.stringify({"eth_addr": "some addr"}),
//...

或者,使用< code>Body类型:

from fastapi import Body

@app.post('/ethAddress')
def add_eth_addr(eth_addr: str = Body()):
    return {'eth_addr': eth_addr}

FastAPI将期望这样的机构:

"some addr"

使用提取 API:

//...
headers: {
'Accept': 'application/json',
'Content-Type': 'application/json'
},
body: JSON.stringify("some addr"),
//...

由于您有一个单独的body参数,您可能希望使用特殊的< code>Body参数< code>embed:

from fastapi import Body

@app.post('/ethAddress')
def add_eth_addr(eth_addr: str = Body(embed=True)):
    return {'eth_addr': eth_addr}

FastAPI将期望这样的机构:

{
    "eth_addr": "some addr"
}

使用提取 API:

//...
headers: {
'Accept': 'application/json',
'Content-Type': 'application/json'
},
body: JSON.stringify({"eth_addr": "some addr"}),
//...

相关答案,包括有关如何发布JSON数据的JavaScript示例,可以在此处、此处以及此处和此处找到。

 类似资料:
  • 我正在尝试使用FastAPI进行简单的操作。我使用 创建了一个基本结构,它只有两个属性,即 和 。 我想使用<code>post</code>操作发布这些数据-<code>{“name”:“XYZ”,“roll”:51}</code>。 我知道Swagger UI(OpenAPI)提供的的自动留档,我们可以用它来发布数据。但是我不想使用它。我想用的是使用URL直接发布数据,并希望在浏览器本身中看到

  • 问题内容: 我这里有一些有角度的js代码。 以及带有MySQL代码的node js。我能够从此节点代码将数据传递到MySQL DB。如何继续对Node JS进行角度测试?我来自PHP背景。我应该能够将数据从angular js表单发送到MySQL数据库。我可以从这里的节点代码向MySQL数据库发送数据。 问题答案: 它可能是您入门的垫脚石: Index.html 角度代码app.js server

  • 问题内容: 如何将JSON数据从浏览器中的Javascript发送到服务器,并由PHP在其中进行解析? 问题答案: 我在这里获得了很多信息,所以我想发布我发现的解决方案。 问题: 从浏览器上的Javascript获取JSON数据到服务器,然后让PHP成功解析它。 环境: Windows上的浏览器(Firefox)中的Javascript。LAMP服务器作为远程服务器:Ubuntu上的PHP 5.3

  • 我需要通过Postman调用Jenkins作业的API。此作业需要参数(主机、详细信息和PMSP)。 Auth使用Jenkins令牌工作,并使用头内容类型:application/json。 > 我试图调用endpointhttps://jenkins_server/作业/job_name/build/api/json,将以下正文添加到请求中,但结果是没有提交任何内容,作业不运行。 我试着呼叫en

  • 问题内容: 我的Web应用程序的后端接收来自多个客户端的更新。发生此类更新时,应将其传达给所有其他客户端。 后端更新后,如何启动从服务器到所有Web浏览器客户端的更新? 我正在使用JBoss,JSF和Spring框架。 问题答案: 参见类似的堆栈溢出问题:WebSockets与服务器发送的事件/EventSource 我假设像DarthVader一样,您的前端是某种(通常)无状态的HTML页面。浏

  • 我有点困惑AngularJS是如何将数据发布到我的WebAPI控制器的。通常,当我将数据从AngularJS发布到MVC控制器时,我会这样做: 但是,在WebAPI控制器中,字符串值总是返回为null。 在将数据传递到web api控制器时,是否需要以稍微不同的方式发布数据? 以下是我的控制器中的方法: 编辑不确定这是否有帮助,但这是小提琴手的标题: POSThttp://localhost:58