如何在Ajax中使用JSON API规范?数据格式要求及接口数据获取方法咨询
在Ajax中使用JSON API规范的完整指南
咱们把问题拆成几个部分来聊,从规范要求到实际代码,再帮你判断数据格式是否正确。
一、JSON API规范的核心数据格式要求
JSON API是一套严格的REST API数据规范,目的是让API响应格式统一,减少开发中的混乱。你的数据必须遵循这些核心规则:
- 所有返回的资源(单个或多个)必须包裹在
data字段里:单个资源是对象,多个是数组 - 每个资源必须包含
type(字符串,比如articles、users,表示资源类型)和id(字符串或数字,资源唯一标识) - 资源的业务属性(比如标题、内容)必须放在
attributes对象下,不能和type/id同级 - 如果资源有关联数据(比如文章关联作者),要放在
relationships字段里,关联的资源用data嵌套type和id - 如果需要把关联资源一起返回,要放在根节点的
included数组里
举个标准的正确格式示例:
{ "data": [ { "type": "articles", "id": "1", "attributes": { "title": "JSON API规范入门", "body": "这是一篇介绍JSON API的文章", "createdAt": "2024-05-20T12:00:00Z" }, "relationships": { "author": { "data": { "type": "users", "id": "123" } } } } ], "included": [ { "type": "users", "id": "123", "attributes": { "name": "张三", "email": "zhangsan@example.com" } } ] }
常见的错误格式:
- 直接把属性放在根节点,没有
data和attributes - 资源缺少
type或id字段 - 关联数据直接嵌套完整对象,而不是用
type+id的引用方式
二、用Ajax遵循JSON API规范获取/提交数据
Ajax本质就是异步HTTP请求,只要在请求头和数据格式上符合JSON API要求就行,下面给你两种常用的实现方式:
1. 现代方式:使用fetch API
这是目前主流的异步请求方式,代码简洁易读:
获取数据(GET请求)
// 发送请求时必须设置Accept头,告诉服务器你要JSON API格式的响应 fetch('https://your-api-endpoint.com/articles', { method: 'GET', headers: { 'Accept': 'application/vnd.api+json' } }) .then(response => { if (!response.ok) { throw new Error(`请求失败!状态码:${response.status}`); } return response.json(); }) .then(apiData => { // 处理返回的规范数据 console.log('获取到的文章列表:', apiData.data); // 如果有包含的关联数据,一起处理 if (apiData.included) { console.log('关联的作者信息:', apiData.included); } }) .catch(error => { console.error('请求出错啦:', error); });
提交数据(POST请求)
提交的数据也要遵循JSON API格式,并且设置Content-Type头:
// 构造符合规范的请求数据 const newArticle = { data: { type: 'articles', attributes: { title: '我的第一篇JSON API文章', body: '按照规范提交数据的示例' } } }; fetch('https://your-api-endpoint.com/articles', { method: 'POST', headers: { 'Accept': 'application/vnd.api+json', 'Content-Type': 'application/vnd.api+json' }, body: JSON.stringify(newArticle) }) .then(response => response.json()) .then(createdData => { console.log('创建成功的文章:', createdData.data); }) .catch(error => console.error('创建失败:', error));
2. 兼容旧浏览器:使用XMLHttpRequest
如果需要兼容IE这类旧浏览器,可以用传统的XHR方式:
const xhr = new XMLHttpRequest(); xhr.open('GET', 'https://your-api-endpoint.com/articles'); // 设置请求头 xhr.setRequestHeader('Accept', 'application/vnd.api+json'); xhr.onload = function() { if (xhr.status >= 200 && xhr.status < 300) { const apiData = JSON.parse(xhr.responseText); console.log('获取到的数据:', apiData.data); } else { console.error('请求失败,状态码:', xhr.status); } }; xhr.onerror = function() { console.error('网络请求出错了'); }; xhr.send();
三、判断你的数据格式是否正确
因为无法直接访问你提供的图片链接,我给你几个快速检查的要点,你可以对照自己的数据:
- 根节点是否有
data字段?(单个资源是对象,多个是数组) - 每个资源对象里是否有
type和id? - 所有业务属性是不是都放在
attributes对象下,没有和type/id同级? - 如果有关联数据,是不是放在
relationships里,并且用data嵌套type+id的引用?
如果你的数据符合以上几点,那基本是正确的;如果有不符合的地方,按照前面的正确示例调整即可。如果能把图片里的JSON内容贴出来,我可以帮你更精准地排查问题。
内容的提问来源于stack exchange,提问作者GokulCjGrove




