【问题标题】:how to get json object from a webservice如何从 web 服务获取 json 对象
【发布时间】:2021-08-02 07:20:18
【问题描述】:

我有下面发布的 json 响应。如下 json 部分所示,parametersobject 在这一行中发出(这是一个角度应用程序)

    this._FromInsToSiteDataService.emitOnSubmitButtonClikedBroadcast(parameters)

它被接收到

this.subscriptionBroadcastEmitterOnSubmitButtonClicked = this._FromInsecticidesToSiteMapDataService.getBroascastEmitterOnSubmitButtonClicked().subscribe((response:Object)=>{
        response['siteGeometry'] = this.selectedSite.geometry
        console.log("response: ", response)
        this.sSProvider.startWebServiceFor(response)
    });
    

在后面的代码中,我想将 json 格式的响应传递给 web 服务并接收它,如 websrvicepostedbelow 中所示`

当我运行代码时,我希望看到 json 对象的内容

{
  "dist1": d1,
  "dist2": d2,
  "date1": date1,
  "date2": date2,
  "ingredient": activeIngredient
}

但我得到NONE

请告诉我如何正确地从 web 服务获取 json 对象

json

 private submit() {
  let parameters = {
  "dist1": d1,
  "dist2": d2,
  "date1": date1,
  "date2": date2,
  "ingredient": activeIngredient
}
    
this._FromInsToSiteDataService.emitOnSubmitButtonClikedBroadcast(parameters)

接收 json 对象

this.subscriptionBroadcastEmitterOnSubmitButtonClicked = this._FromInsecticidesToSiteMapDataService.getBroascastEmitterOnSubmitButtonClicked().subscribe((response:Object)=>{
        response['siteGeometry'] = this.selectedSite.geometry
        console.log("response: ", response)
        this.sSProvider.startWebServiceFor(response)
    });
    

网络服务

@app.route("/insSpecifications/<parameters>", methods=['GET'] )
def insSpecifications(parameters):
    # print(request.json())
    print(request.get_json())//returns NONE

    return "OK"

【问题讨论】:

  • @Chillie this.sSProvider.startWebServiceFor(response) 启动网络服务
  • 你可能想用合适的标签修改你的标签,让正确的人看到这个问题,因为这个问题是一个较少的烧瓶、python 问题和更多的 JS
  • 你测试过邮递员的 Flask 路由并打印了 json 吗?请注意,如果您没有在标头中将 content-type 设置为 application/jsonget_json() 将返回 null 并且您正在发出 GET 请求,get_json() 会读取 postput 请求的正文
  • @shoaib30 你能提供一个代码示例吗?如何设置内容类型??
  • 我会放弃它作为答案

标签: python json angular flask


【解决方案1】:

简介 您的问题分为两部分-

  1. 从 JS 发出请求
  2. 创建 Flask API 来处理请求

这两个都在 SO 上得到了广泛的回答,因此我只在这里总结一下,请点击链接了解更多信息

回答

REST 方法: 前端向后端发送JSON数据时,需要根据需要发出POST请求或PUT。请阅读REST API 概念以了解方法和目的。 https://www.w3schools.in/restful-web-services/rest-methods/

提出请求 根据您在前端使用的库,请求可能看起来不同,但本质上您需要发送带有 JSON 在正文中的请求并适当设置 HEADERSContent-Type: application/json

使用FETCH 这可以通过(从邮递员自动生成)来实现

var myHeaders = new Headers();
myHeaders.append("Content-Type", "application/json");

var raw = JSON.stringify({
  "username": "Sample1",
  "email": "test2@test.com"
});

var requestOptions = {
  method: 'POST',
  headers: myHeaders,
  body: raw,
  redirect: 'follow'
};

fetch("localhost:5000/sample", requestOptions)
  .then(response => response.text())
  .then(result => console.log(result))
  .catch(error => console.log('error', error));

但是大多数库都会对此进行包装,请考虑为您各自的 JS 库发出 POST 请求

创建 Flask API 最后,您需要一个 Flask API 来使用此请求。假设它是一个POST 请求。您需要创建一个方法为POST 的路由并使用get_json() 获取JSON 数据:https://stackoverflow.com/a/20001283/5236575

因此,一旦正确设置了 HEADERS 并发出了发布请求,您的代码应该可以通过将 GET 更改为 POST 来正常工作

注意:parameters 字段被正确捕获,因此我将其保留原样,但这不是您的 JSON 正文的来源

@app.route("/insSpecifications/<parameters>", methods=['POST'] )
def insSpecifications(parameters):
    # print(request.json())
    print(request.get_json())
    return "OK"

测试 您可以使用 Postman 或任何其他 API 测试工具测试您的 API,以查看 API 的行为方式并验证您遇到的问题是在 API 中还是在前端代码中。

【讨论】:

  • 我将 GET 方法更改为 POST,我得到以下信息: INFO:werkzeug: - - [02/Aug/2021 10:05:50] "OPTIONS /insecticidesSpecifications/[object%20Object] HTTP /1.1" 200 - INFO:werkzeug: - - [02/Aug/2021 10:05:50] "GET /insecticidesSpecifications/[object%20Object] HTTP/1.1" 405 -
  • 什么是[object%20Object]??
  • 您正在将来自 JS 代码的 JSON 对象作为 URL 中的对象传递,因此您看到 [object: Object] 作为 URL 参数。您需要在请求正文中而不是在 URL 中发送 JSON
  • 我是从角度发送而不是从 js 发送。请告诉我如何访问 [object object]
  • Angular 归根结底是在浏览器上运行的 JS。请查看如何从角度发出 POST 请求 - stackoverflow.com/a/61742826/5236575
猜你喜欢
  • 2014-09-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多