Shopify网上商店GraphQL Admin接口查询实战

目录

一、Shopify网上商店

二、个人商店配置接口权限

三、PostMan调用接口测试

四、通过Java服务调用接口


一、Shopify网上商店

Shopify是由Tobi Lütke创办的加拿大电子商务软件开发商,总部位于加拿大首都渥太华,已从一家在咖啡店办公的 5人团队,成长为在全球拥有超过 10,000名员工的商务平台。 
Shopify成立于2004年,是一个销售滑雪板的电子商务平台。创始人于2006年向公众发布了它,作为一种在线销售几乎任何东西的方式。该公司于2015年在纽约证券交易所和多伦多证券交易所上市。Shopify为超过175个国家的数百万企业提供支持。 
Shopify允许企业主创建和管理在线商店,并提供运营商店所需的所有工具,从库存管理到销售和履行。Shopify还搭建了一个应用商店,一个以众多开发者为核心的生态系统

相关文档如下↓

1.官网网站入口:Shopify官网

2.网上商店接口文档:Shopify接口文档

3.个人商店后台地址:个人店铺后台地址

二、个人商店配置接口权限

点击:设置→应用和销售渠道→开发应用→创建应用

需要做俩件事,1.配置权限,2.获得token

1.创建好应用在API凭据里面就可以获得一次token,需要自己保存下来。

2.在配置选项里面配置权限,选择需要开通的选项进行配置。

三、PostMan调用接口测试

所有GraphQl Admin API查询都需要有效的Shopify访问令牌。在所有API查询中都将您的令牌作为X-Shopify-Access-token标头,使用Shopify支持的客户库可以简化此过程,为了确保平台安全,应用程序需要在安装过程中请求特定的访问范围。

调用接口步骤需要

1.X-Shopify-Access-token为应用里面的token

2.权限配置开通,应用里面的配置

3.自己店铺地址

4.构建GraphQL规范的JSON参数

下面是例子,比如我想查询网上商店后台里面内容→文件

通过接口文档可以看到是files接口,分别可以选择版本,中间是参数,右边是官方例子

1.配置调用地址

调用URL:https://your-development-store.myshopify.com/admin/api/2024-10/graphql.json

your-development-store:需要替换成自己店铺的地址:比如my-store

替换完就是:https://my-store.myshopify.com/admin/api/2024-10/graphql.json

2.构建GraphQL参数

eg:查询250条数据

{files(first: 250) {edges {node {id... on MediaImage {image {url}}}}pageInfo {hasNextPagehasPreviousPagestartCursorendCursor}}
}

3.配置查询Headers

增加X-Shopify-Access-Token:为你商店的token

4.调用测试,调用成功则会返回数据,如果构建的GraphQL参数错误则会返回400 BadRequest

其他构建GraphQL参数参考如下↓

1.查询订单

{orders(first: 10) {edges {node {suggestedRefund {refundDuties {amountSet {shopMoney {amountcurrencyCode}}}totalDutiesSet {shopMoney {amountcurrencyCode}}}emailreturnStatusdisplayFinancialStatusdisplayFulfillmentStatusrisk {recommendation}}}}
}

2.查询订单减少参数版

{orders(first: 10) {edges {cursornode {id}}pageInfo {hasNextPagehasPreviousPagestartCursorendCursor}}
}

3.查询指定的文件名

{files(first: 250,query: "filename:'my-image.png'") {edges {node {id... on MediaImage {image {url}}}}pageInfo {hasNextPagehasPreviousPagestartCursorendCursor}}
}

4.查询文件分页

{files(first: 250,after:"eyJsYX******") {edges {node {id... on MediaImage {image {url}}}}pageInfo {hasNextPagehasPreviousPagestartCursorendCursor}}
}

分页逻辑说明

  • 首次请求:不传递 after 参数,获取第1-250条数据。
  • 后续请求:将前一次返回的 endCursor 作为新的 after 参数值,获取下一页数据(如251-500)。
  • 终止条件:当 pageInfo.hasNextPage 为 false 时停止。

四、通过Java服务调用接口

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.security.SecureRandom;
import java.security.cert.X509Certificate;
import java.util.HashMap;
import java.util.Map;import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;public class ShopifyGraphQLClient {private static final String API_URL = "https://my-store-de.myshopify.com/admin/api/2024-10/graphql.json";private static final String ACCESS_TOKEN = "shpat_******"; // 替换为实际的访问令牌public static void main(String[] args) {try {// 强制使用 TLSv1.2System.setProperty("https.protocols", "TLSv1.2");// 绕过证书验证(仅限开发环境)TrustManager[] trustAllCerts = new TrustManager[] {new X509TrustManager() {public X509Certificate[] getAcceptedIssuers() { return null; }public void checkClientTrusted(X509Certificate[] certs, String authType) {}public void checkServerTrusted(X509Certificate[] certs, String authType) {}}};SSLContext sc = SSLContext.getInstance("TLS");sc.init(null, trustAllCerts, new SecureRandom());HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());// 忽略主机名验证(仅限开发环境)HostnameVerifier allHostsValid = (hostname, session) -> true;HttpsURLConnection.setDefaultHostnameVerifier(allHostsValid);// 创建 URL 对象URL url = new URL(API_URL);HttpURLConnection connection = (HttpURLConnection) url.openConnection();// 设置请求方法为 POSTconnection.setRequestMethod("POST");connection.setDoOutput(true);// 设置请求头connection.setRequestProperty("Content-Type", "application/json");connection.setRequestProperty("X-Shopify-Access-Token", ACCESS_TOKEN);// 构建 GraphQL 查询// 创建数据映射Map<String, Object> data = new HashMap<>();data.put("query", "{\r\n" +"    orders(first: 10) {\r\n" +"      edges {\r\n" +"        cursor\r\n" +"        node {\r\n" +"          id\r\n" +"        }\r\n" +"      }\r\n" +"      pageInfo {\r\n" +"        hasNextPage\r\n" +"        hasPreviousPage\r\n" +"        startCursor\r\n" +"        endCursor\r\n" +"      }\r\n" +"    }\r\n" +"}");// 使用Jackson序列化为JSON字符串ObjectMapper mapper = new ObjectMapper();String json = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(data);System.out.println(json);// 发送请求体try (OutputStream os = connection.getOutputStream()) {byte[] input = json.getBytes("utf-8");os.write(input, 0, input.length);}// 读取响应int responseCode = connection.getResponseCode();BufferedReader br = new BufferedReader(new InputStreamReader(connection.getInputStream(), "utf-8"));StringBuilder response = new StringBuilder();String responseLine;while ((responseLine = br.readLine()) != null) {response.append(responseLine.trim());}// 解析响应System.out.println(response.toString());// 创建 ObjectMapper 实例ObjectMapper objectMapper = new ObjectMapper();try {// 解析 JSON 字符串为 JsonNodeJsonNode jsonNode = objectMapper.readTree(response.toString());// 访问数据System.out.println("格式化输出 JSON:");System.out.println(objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(jsonNode));// 示例:访问 data -> orders -> edges 的第一个节点的 idJsonNode firstEdgeNodeId = jsonNode.path("data").path("orders").path("edges").get(0).path("node").path("id");System.out.println("第一个订单的 ID:" + firstEdgeNodeId.asText());} catch (Exception e) {e.printStackTrace();}} catch (Exception e) {e.printStackTrace();}}
}

返回结果如下说明成功

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/78967.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Tips】高效文献管理:Zotero 导入参考文献的多种方式详解

高效文献管理&#xff1a;Zotero 导入参考文献的多种方式详解 在学术研究中&#xff0c;高效管理参考文献是提升效率的关键。Zotero 作为一款强大的文献管理工具&#xff0c;提供了多种便捷的文献导入方式。以下结合文献题录完整性对比分析&#xff0c;为大家详细介绍 Zotero …

[AI]browser-use + web-ui 大模型实现自动操作浏览器

[AI]browser-use web-ui 大模型实现自动操作浏览器 介绍 官方地址&#xff1a;https://github.com/browser-use/web-ui browser-use主要作用是将 AI Agent 与浏览器链接起来从而实现由 AI 驱动的浏览器自动化。今天会给大家介绍如何通过browser-use web-ui来搭建并操作browse…

Springboot请求静态资源时,request.getServletPath() 返回error

大家好&#xff0c;我是 程序员码递夫。 SpringBoot请求静态资源时&#xff0c;request.getServletPath() 返回error&#xff0c; 明明我的目录文件是存在的怎么就报错了呢&#xff1f; 如我请求 http://127.0.0.1:9090/Hanfu/upload/1647161536390.png 通常是因为请求的资…

在开发板上如何处理curl: (60) SSL certificate problem

目录 引言 问题解析 解决方法 跳过证书验证 采用证书认证 结语 引言 最近一直推荐学生们在课程实验中使用curl及其libcurl。curl 是一个强大的命令行工具&#xff0c;用于在命令行中进行数据传输。它支持多种协议&#xff0c;如 HTTP、HTTPS、FTP、FTPS、SCP、SFTP 等。…

CSRF请求伪造

该漏洞主要是关乎于用户&#xff0c;告诫用户不可乱点击链接&#xff0c;提升自我防范&#xff0c;才能不落入Hacker布置的陷阱&#xff01; 1. cookie与session 简单理解一下两者作用 1.1. &#x1f36a; Cookie&#xff1a;就像超市的会员卡 存储位置&#xff1a;你钱包里…

Python循环与遍历详解:从入门到进阶

在Python编程中&#xff0c;循环和遍历是最基础但极其重要的知识点。理解并掌握这部分内容&#xff0c;是编写高效、清晰代码的前提。本文将从for循环和while循环的基本语法出发&#xff0c;逐步深入探讨range、enumerate、zip、列表推导式、字典遍历等Python中常见的遍历技巧&…

Python-MCPServer开发

Python-MCPServer开发 使用FastMCP开发【SSE模式的MCPServer】&#xff0c;熟悉【McpServer编码过程】【McpServer调试方法】 1-核心知识点 1-熟悉【SSE模式的MCPServer】开发2-熟悉【stdio模式的MCPServer】开发3-熟悉【启动MCPServer】的三种方式 3.1-直接启动:python mcp_s…

高级项目管理

在信息系统项目管理工作中&#xff0c;组织管理者和项目管理者&#xff0c;有时还会面临多项目的管理&#xff0c;或组织级的项目管理、项目的量化管理等课题。 其中&#xff0c;项目集管理、项目组合管理和组织级项目管理&#xff0c;为多项目管理和组织级管理提供有效指导&a…

tarjan缩点+强联通分量

【模板】缩点https://www.luogu.com.cn/problem/P3387 首先我们要理解这道题为什么要用缩点 题目说的是有向图&#xff0c;如果无环的话就可以用DP来解决了 由于可以走重复的点&#xff0c;所以一个环上的点可以看成是一个点&#xff0c;它的点权就等于该环上所有点的点权之…

OSCP:获取全交互式 Windows 反向 Shell

简介 在本文中&#xff0c;我们将探讨获取完全交互式 Windows 反向 Shell 的各种方法&#xff0c;从利用内置工具到采用先进技术以获得更好的控制和功能。 通过 Invoke-ConPtyShell 我获取完全交互式 Windows 反向 Shell 的首选方法是通过 Invoke-ConPtyShell 脚本。当 Wind…

免费超好用的电脑操控局域网内的手机(多台,无线)

使用 第一步 解压QtScrcpy压缩包&#xff0c;并运行QtScrcpy.exe 第二步 2.1 手机开启开发者模式&#xff08;设置>关于本机>版本信息>连点10下“版本号”&#xff09; 2.2 开启 USB调试 和 无线调试&#xff08;设置>开发者选项> USB调试 无线调试&#xf…

Go语言内存管理

本章节&#xff0c;就来学习一下go语言的内存模型&#xff0c;看一下内存的分配&#xff0c;存储都是如何实现的&#xff0c;与此同时&#xff0c;在正式开始今天的主题之前&#xff0c;首先先来学习操作系统基于这一方面的内容&#xff0c;来看看是如何管理内存的吧 本章及节…

【docker】启动临时MongoDB容器、挂载数据卷运行数据库服务,并通过备份文件恢复MongoDB数据库备份数据

‌启动临时 MongoDB 容器、挂载数据卷运行数据库服务&#xff0c;并通过备份文件恢复数据 1.命令分解与功能说明1.1.启动一个临时 MongoDB 容器‌&#xff0c;并进入交互式终端&#xff08;1&#xff09;执行命令&#xff08;2&#xff09;实现功能‌&#xff08;3&#xff09;…

【最新 MCP 战神手册 08】工具使用详解:实现 AI 行动

文章目录 1. 开始啦!2. 第一部分:设计高效且安全的工具3. 第二部分:定义工具蓝图——参数、输出与约束条件4. 第三部分:弥合差距:LLM 兼容性(函数调用)5. 第四部分:实施与测试的最佳实践1. 开始啦! 在前几章中,我们将工具介绍为 AI 模型在 MCP 客户端引导下向 MCP 服…

介绍 IntelliJ IDEA 快捷键操作

IntelliJ IDEA 快捷键操作 1. 编辑与导航2. 查找与替换3. 调试与运行4. 导航与视图5. 重构与生成6. 高级快捷键&#xff08;提高效率&#xff09;注意事项 IntelliJ IDEA 是一款功能强大的集成开发环境&#xff0c;掌握其常用快捷键可以显著提升开发效率。但是有些小伙伴并不清…

Javascript 中作用域的理解?

一、作用域的类型 1. 全局作用域&#xff08;公司大门外&#xff09; 范围&#xff1a;整个 JavaScript 文件变量&#xff1a;像贴在公告栏上的信息&#xff0c;所有人可见例子&#xff1a;const companyName "阿里"; // 全局变量&#xff0c;任何地方都能访问 fu…

Leetcode刷题记录22——滑动窗口最大值

题源&#xff1a;https://leetcode.cn/problems/sliding-window-maximum/description/?envTypestudy-plan-v2&envIdtop-100-liked 题目描述&#xff1a; 思路一&#xff1a; 暴力遍历法&#xff0c;通过一个长度为k的滑动窗口遍历nums&#xff0c;将其中最大的数依次记…

Apache Flink的架构设计与运行流程说明

在大数据领域&#xff0c;实时计算的重要性随着业务需求的爆发式增长愈发凸显。从电商的实时销量监控到金融的高频交易风控&#xff0c;从物联网设备的实时告警到社交平台的热点追踪&#xff0c;企业对“秒级甚至毫秒级”数据处理能力的需求已成为刚需。在众多实时计算框架中&a…

经典算法 最长单调递增子序列

最长单调递增子序列 问题描述 找出由n个数组成的序列的最长单调递增子序列。 示例输入 9 2 1 5 3 6 4 8 9 7示例输出 5示例输入 6 5 6 7 1 2 8示例输出 4c代码(动态规划 O(n^2)) #include<bits/stdc.h>using namespace std;int main() {int n, ans 0;cin >&g…

【语法】C++继承中遇到的问题及解决方法

目录 1.子类构造函数中初始化父类成员 2.子类显式调用父类的析构函数 第一种说法&#xff1a;重定义 反驳&#xff1a; 第二种说法&#xff1a;operator~ 3.因编译器版本过低而出现错误 贴主在学习C的继承时&#xff0c;遇到了很多问题&#xff0c;觉得很变态&#xff0c…