javascript - 如何为 API 构建 JS 接口(interface)

标签 javascript ecmascript-6

我正在 JS ES6 中构建一个 API 接口(interface),以允许我以更好的方式和更高效地使用 CRUD 规则。我的问题是我找不到让它工作的方法。 我创建了我的界面来接受一些参数,并根据 GET 或 POST 等方法应该发生什么,我应该看到请求的特定结果。

我创建了一个外部 getProducts() 函数,但被系统忽略了我没有错误并且没有发生任何事情是死的。

我在获取数据接口(interface)中做了如下操作:

const api = "https://api";

const username = "username";
const password = "password";

const token = btoa(username + ":" + password);

window.request = async (url, params, method = "GET") => {
    const options = {
        method,
        headers: {
            "Content-Type": "application/json",
            Authorization: "Basic " + token
        }
    };

    if (params) {
        if (method === "GET") {
            url += "?" + objectToQueryString(params);
        } else {
            options.body = JSON.stringify(params);
        }
    }

    const response = await fetch(api + url, options);

    if (response.status !== 200) {
        return generateErrorResponse(
            "The server responded with an unexpected status."
        );
    }

    const result = await response.json();

    return result;
};

objectToQueryString = obj => {
    return Object.keys(obj)
        .map(key => key + "=" + obj[key])
        .join("&");
};

generateErrorResponse = message => {
    return {
        status: "error",
        message
    };
};

const Fetch  = () => {

    get = (url, params) => {
        return request(url, params);
    };

    create = (url, params) => {
        return request(url, params, "POST");
    };

    update = (url, params) => {
        return request(url, params, "PUT");
    };

    remove = (url, params) => {
        return request(url, params, "DELETE");
    };
};

获取数据的函数:

getProducts = async () => {
    const products = await Fetch.get("/product");
};

我很难理解哪里出了问题,我应该怎么做才能让它运行。

最佳答案

这是我使用假端点的尝试,一切正常

const api = "https://jsonplaceholder.typicode.com";

const username = "username";
const password = "password";

const token = btoa(username + ":" + password);

window.request = async (url, params, method = "GET") => {
    const options = {
        method,
        headers: {
            "Content-Type": "application/json",
            Authorization: "Basic " + token
        }
    };

    if (params) {
        if (method === "GET") {
            url += "?" + objectToQueryString(params);
        } else {
            options.body = JSON.stringify(params);
        }
    }

    const response = await fetch(api + url, options);

    if (response.status !== 200) {
        return generateErrorResponse(
            "The server responded with an unexpected status."
        );
    }

    const result = await response.json();

    return result;
};

objectToQueryString = obj => {
    return Object.keys(obj)
        .map(key => key + "=" + obj[key])
        .join("&");
};

generateErrorResponse = message => {
    return {
        status: "error",
        message
    };
};

const Fetch = {
    get: (url, params) => request(url, params),
    create: (url, params) => request(url, params, "POST"),
    update: (url, params) => request(url, params, "PUT"),
    remove: (url, params) => request(url, params, "DELETE")
};

const getProducts = async () => {
    const products = await Fetch.get("/posts");
    console.log(products);
};

getProducts();

首先,我将 Fetch 更改为具有方法的对象,而不是返回其他函数的函数:

const Fetch = {
    get: (url, params) => request(url, params),
    create: (url, params) => request(url, params, "POST"),
    update: (url, params) => request(url, params, "PUT"),
    remove: (url, params) => request(url, params, "DELETE")
};

我没有像其他人提到的那样使这些功能异步,因为它们不需要。 request 函数已经返回一个 promise,因为它是一个异步函数,所以 Fetch 函数也将返回一个 promise。

接下来,我将 get products 设为 const,因为它之前未定义。

const getProducts = async () => {
    const products = await Fetch.get("/posts");
    console.log(products);
};

我还将其 URL 更改为 posts 以匹配虚假端点,因此如果您复制和粘贴,请不要被它绊倒。

最后,我在获取产品函数中添加了一个console.log()。我不确定您是如何捕获 products 值的,但默认情况下 getProducts 函数会返回一个 promise ,因此必须异步处理它。

我也不确定你的 api url const api = "https://api"; 但那可能不会给你任何返回哈哈。

如果您想更仔细地查看我的版本,这里有一个 JSBin:https://jsbin.com/jokayikaro/edit?js,console

关于javascript - 如何为 API 构建 JS 接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58846361/

相关文章:

Javascript循环遍历对象数组并获取两个值并插入到新的对象数组中

javascript - 如何使用 lodash 改进过滤后的对象循环?

javascript - 创建高度动态的输入表单组件

javascript - 保留悬停在链接上的效果

JavaScript打印运行代码

javascript - ES6,返回一个对象数组以逗号分隔的字符串列表

javascript - clearRect 不清除 Canvas 中的任何内容

javascript - 如何从 Angularjs 中的 Controller 向 $scope.master 对象添加一些变量

javascript - Angular 将相同的成功和错误函数体应用于不同的 $http 请求

javascript - 为什么在使用完整渲染或浅渲染时,带有组件 Prop 的 enzyme find() 的工作方式不同?