在 javascript 中简单地获取 GET 请求到烧瓶服务器

Posted

技术标签:

【中文标题】在 javascript 中简单地获取 GET 请求到烧瓶服务器【英文标题】:Simple fetch GET request in javascript to a flask server 【发布时间】:2020-01-13 10:05:10 【问题描述】:

我正在尝试将一些 json 数据从烧瓶服务器显示到我的 html 页面,但我有一个 TypeError: NetworkError when attempting to fetch resource. 和一个 Promise <state>: "rejected"

server.py

from flask import Flask, request, jsonify

app = Flask(__name__)


@app.route('/hello', methods=['GET'])
def hello():
    jsonResp = 'jack': 4098, 'sape': 4139
    print(jsonify(jsonResp))
    return jsonify(jsonResp)

if __name__ == '__main__':
    app.run(host='localhost', port=8989)

script.js

function getHello() 
    const url = 'http://localhost:8989/hello'
    const response = fetch(url)
    console.log(response);
    document.getElementById("demo").innerHTML = response;


index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
    <button onclick="getHello()">click</button>
    <label id="demo"></label>

    <script src="script.js"></script>
</body>
</html>

当我点击按钮时,标签部分中还有一个[object Promise]

我做了最简单的代码,但它不起作用。

【问题讨论】:

试试这个 ***.com/questions/57857647/… fetch 是一个可能有问题的新 api。我使用的代码绝对有效,应该至少返回一些东西。 我肯定在这里用你的代码做错了我仍然有一个网络错误NetworkError: A network error occurred. 但没有更多的承诺。我也用 axios 测试过同样的问题 【参考方案1】:

感谢大家的好回答 :) 这是我的最终代码:

server.py

from flask import Flask, request, jsonify, after_this_request

app = Flask(__name__)


@app.route('/hello', methods=['GET'])
def hello():
    @after_this_request
    def add_header(response):
        response.headers.add('Access-Control-Allow-Origin', '*')
        return response

    jsonResp = 'jack': 4098, 'sape': 4139
    print(jsonResp)
    return jsonify(jsonResp)

if __name__ == '__main__':
    app.run(host='localhost', port=8989)

script.js

function getHello() 
    const url = 'http://localhost:8989/hello'
    fetch(url)
    .then(response => response.json())  
    .then(json => 
        console.log(json);
        document.getElementById("demo").innerHTML = JSON.stringify(json)
    )

【讨论】:

【参考方案2】:

fetch() 返回一个promise,如果你想使用.json() 它返回另一个promise。您可以使用 .then() 来获取 json 响应。

fetch('https://jsonplaceholder.typicode.com/todos/1')
  .then(response => response.json())  
  .then(json => console.log(json))
  

但是您的烧瓶服务器中可能还有一个与 cors 相关的错误,请在返回之前尝试此操作:

response.headers.add('Access-Control-Allow-Origin', '*')

【讨论】:

【参考方案3】:

这可能是由同源策略引起的。浏览器不允许调用不同的来源,除非服务器设置了特殊的 HTTP 标头。 如果您从浏览器打开此 html 文件,则服务器的来源 localhost 与浏览器中的来源不匹配,这可能是文件路径。您可以通过将Access-Control-Allow-Origin 标头添加到响应中来使其工作,如下所示:

from flask import after_this_request

@app.route('/hello', methods=['GET'])
def hello():
    @after_this_request
    def add_header(response):
        response.headers['Access-Control-Allow-Origin'] = '*'
        return response

    jsonResp = 'jack': 4098, 'sape': 4139
    print(jsonify(jsonResp))
    return jsonify(jsonResp)

现在没有网络错误,但您的承诺尚未完成,因此您需要为其添加then

或者,您可以通过 Flask 服务器提供 index.html 文件,以便来源匹配。

您可以在此处阅读有关 CORS 和 SOP 的更多信息:

https://developer.mozilla.org/en-US/docs/Web/Security/Same-origin_policy

https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS

【讨论】:

以上是关于在 javascript 中简单地获取 GET 请求到烧瓶服务器的主要内容,如果未能解决你的问题,请参考以下文章

js反爬:请开启JavaScript并刷新该页

JavaScript 在javascript中获取GET和POST变量

JavaScript 运行时错误: 无法设置未定义或 null 引用的属性"innerText"

如何在 javascript 中获取当前日期减去 20 秒?

理解Spring中的getBean()

从“GET”参数(JavaScript)中获取值[重复]