You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在Ajax中使用JSON API规范?数据格式要求及接口数据获取方法咨询

在Ajax中使用JSON API规范的完整指南

咱们把问题拆成几个部分来聊,从规范要求到实际代码,再帮你判断数据格式是否正确。

一、JSON API规范的核心数据格式要求

JSON API是一套严格的REST API数据规范,目的是让API响应格式统一,减少开发中的混乱。你的数据必须遵循这些核心规则:

  • 所有返回的资源(单个或多个)必须包裹在data字段里:单个资源是对象,多个是数组
  • 每个资源必须包含type(字符串,比如articlesusers,表示资源类型)和id(字符串或数字,资源唯一标识)
  • 资源的业务属性(比如标题、内容)必须放在attributes对象下,不能和type/id同级
  • 如果资源有关联数据(比如文章关联作者),要放在relationships字段里,关联的资源用data嵌套typeid
  • 如果需要把关联资源一起返回,要放在根节点的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"
      }
    }
  ]
}

常见的错误格式:

  • 直接把属性放在根节点,没有dataattributes
  • 资源缺少typeid字段
  • 关联数据直接嵌套完整对象,而不是用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();

三、判断你的数据格式是否正确

因为无法直接访问你提供的图片链接,我给你几个快速检查的要点,你可以对照自己的数据:

  1. 根节点是否有data字段?(单个资源是对象,多个是数组)
  2. 每个资源对象里是否有typeid
  3. 所有业务属性是不是都放在attributes对象下,没有和type/id同级?
  4. 如果有关联数据,是不是放在relationships里,并且用data嵌套type+id的引用?

如果你的数据符合以上几点,那基本是正确的;如果有不符合的地方,按照前面的正确示例调整即可。如果能把图片里的JSON内容贴出来,我可以帮你更精准地排查问题。

内容的提问来源于stack exchange,提问作者GokulCjGrove

火山引擎 最新活动