如何编写Axie服务器的最小GraphQL查询,解决C++请求Bad Request问题
问题解决说明
1. 接口选择说明
你提供的两个接口中,优先使用https://graphql-gateway.axieinfinity.com/graphql(v1接口)即可,二者区别如下:
- v1接口是官方对外公开的网关,面向第三方开发者设计,无需特殊授权即可调用公开的Axie数据,版本稳定、兼容性好,完全满足你获取Axie详情的需求。
- v2接口是官方内部服务专用接口,仅供给官方前端、自有工具调用,需要附带指定请求头和身份校验信息,无授权调用会直接返回错误,不适合第三方开发者使用。
2. 查询错误修正
你现在返回Bad Request的核心原因是请求的JSON格式、GraphQL查询语法存在错误,和C++处理\n的逻辑无关,GraphQL服务端对换行、空格的兼容性很高,只要JSON结构正确就能正常解析。
原有代码的错误点:
- 请求的JSON结构拼接错误,
query字段结尾多了多余的双引号,转义符错位 - GraphQL查询结构错误,fragment的定义和使用逻辑错误,不需要在fragment内重复传
axieId参数 http.cpp的parseUrl函数存在笔误:第二个if (ret[0]=="https")应该改为if (ret[0]=="http"),否则调用http接口会出现端口错误(你当前用https暂时不会触发,但建议修正)
修正后的查询写法(推荐用C++原始字符串字面量,避免转义错误):
// main.cpp 中query变量替换为以下内容即可 string query = R"({ "operationName": "GetAxieDetail", "variables": { "axieId": "5144540" }, "query": "query GetAxieDetail($axieId: ID!) { axie(axieId: $axieId) { id name class breedCount owner image stats { health speed skill morale } } }" })";
如果需要更多Axie属性,直接在axie后的大括号内添加对应字段即可,无需一开始就使用复杂的fragment,先跑通最小可用查询再逐步扩展字段即可。
内容的提问来源于stack exchange,提问作者Pierre Abbat
相关产品推荐
相关产品推荐

