gpt4 book ai didi

csv - 使用 GraphQL 机制,但返回 CSV

转载 作者:行者123 更新时间:2023-12-05 02:10:27 27 4
gpt4 key购买 nike

普通的 REST API 可能会让您以不同的格式请求相同的数据,使用不同的 Accept header ,例如application/json,或 text/html,或 text/csv 格式的响应。

但是,如果您使用的是 GraphQL,似乎 JSON 是唯一可接受的返回内容类型。但是,我需要我的 API 能够返回 CSV 数据,以供不理解 JSON 的不太复杂的客户端使用。

如果给定 Accept: text/csv header ,GraphQL 端点返回 CSV 数据是否有意义?如果没有,是否有更好的实践方法来做到这一点?

这更像是一个概念性问题,但我专门使用 Graphene实现我的 API。它是否提供任何机制来处理自定义内容类型?

最佳答案

是的,你可以,但它不是内置的,你必须覆盖一些东西。这更像是一种解决方法。

执行这些步骤,您将获得 csv 输出:

  1. csv = graphene.String() 添加到您的查询中并将其解析为您想要的任何内容。

  2. 创建一个继承GraphQLView的新类

  3. 重写 dispatch 函数,如下所示:

    def dispatch(self, request, *args, **kwargs):
    response = super(CustomGraphqlView, self).dispatch(request, *args, **kwargs)
    try:
    data = json.loads(response.content.decode('utf-8'))
    if 'csv' in data['data']:
    data['data'].pop('csv')
    if len(list(data['data'].keys())) == 1:
    model = list(data['data'].keys())[0]
    else:
    raise GraphQLError("can not export to csv")
    data = pd.json_normalize(data['data'][model])
    response = HttpResponse(content_type='text/csv')
    response['Content-Disposition'] = 'attachment; filename="output.csv"'

    writer = csv.writer(response)
    writer.writerow(data.columns)
    for value in data.values:
    writer.writerow(value)
    except GraphQLError as e:
    raise e
    except Exception:
    pass
    return response
  4. 导入所有必要的模块

  5. urls.py 文件中的默认 GraphQLView 替换为您的新 View 类。

现在,如果您在 GraphQL 查询中包含“csv”,它将返回原始 csv 数据,然后您可以将数据保存到前端的 csv 文件中。示例查询如下:

query{
items{
id
name
price
category{
name
}
}
csv
}

请记住,这是一种获取 csv 格式原始数据的方法,您必须保存它。您可以使用以下代码在 JavaScript 中执行此操作:

req.then(data => {
let element = document.createElement('a');
element.setAttribute('href', 'data:text/csv;charset=utf-8,' + encodeURIComponent(data.data));
element.setAttribute('download', 'output.csv');

element.style.display = 'none';
document.body.appendChild(element);

element.click();

document.body.removeChild(element);
})

此方法将 JSON 数据扁平化,因此不会丢失任何数据。

关于csv - 使用 GraphQL 机制,但返回 CSV,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58636397/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com