首页 > 其他分享 >使用 fetch + React.js 调用 REST API

使用 fetch + React.js 调用 REST API

时间:2022-09-04 17:34:20浏览次数:125  
标签:body const title userId REST js React Post post

JSON : Placeholder

JSON : Placeholder (https://jsonplaceholder.typicode.com/) 是一个用于测试的 REST API 网站。
以下使用 RxJS6 + React.js 调用该网站的 REST API,获取字符串以及 JSON 数据。

  • GET /posts/1
  • GET /posts
  • POST /posts
  • PUT /posts/1
  • DELETE /posts/1

所有 GET API 都返回JSON数据,格式(JSON-Schema)如下:

{
  "type":"object",
  "properties": {
    "userId": {"type" : "integer"},
    "id": {"type" : "integer"},
    "title": {"type" : "string"},
    "body": {"type" : "string"}
  }
}

创建工程

# 安装 CLI
$ npm install -g create-react-app
# 创建新的应用程序 FetchExample
$ create-react-app fetch-example --scriptfs-version=react-scripts-ts
$ cd fetch-example
$ npm start

打开 Intellij IDEA, File / New / Project From Existing Sources...,然后选中工程所在文件夹
在向导的第1页选择 Create project from existing sources
完成向导后在点击 Finish 创建工程。

点击 Add Configurations, 点击 +npm
Name: React CLI Server
Scripts: start
点击 OK 完成配置。
点击 React CLI Server 启动程序。
http://localhost:3000/ 可打开网页。

TSLint

打开 tslint.json,将其改为

{
  "extends": ["tslint:recommended", "tslint-react", "tslint-config-prettier"],
  "linterOptions": {
    "exclude": [
      "config/**/*.js",
      "node_modules/**/*.ts",
      "coverage/lcov-report/*.js"
    ]
  },
  "rules": {
    "interface-name": false,
    "ordered-imports": false,
    "no-console": false,
    "object-literal-sort-keys": false,
    "member-access": false,
    "variable-name": false,
    "member-ordering": false,
    "class-name": false
  }
}

Post

在 src 文件夹下添加 post.ts,内容如下

export class Post {
  userId!: number;
  id!: number;
  title!: string;
  body!: string;
  toString(): string {
    return `Post {userId = ${this.userId}, id = ${this.id}, title = "${this.title}", body = "${this.body.replace(/\n/g, '\\n')}"}`;
  }
}

安装 react.di

react.di 是一个在 React.js 中实现 DI(依赖注入) 的包。
使用这个包需要安装 react.di 和 reflect-metadata。

$ npm install react.di@next reflect-metadata --save

打开 tsconfig.json 在 compilerOptions 中
添加关于 emitDecoratorMetadata 的设定。

    "emitDecoratorMetadata": true,
    "experimentalDecorators": true,

post 服务

在 src 文件夹下添加 post.service.ts,内容如下

import { Injectable } from 'react.di';
import { Post } from './post';

@Injectable
export class PostService {
  private readonly baseUrl = 'http://jsonplaceholder.typicode.com/';

  constructor() {
    this.getPostAsString();
    this.getPostAsJson();
    this.getPosts(2);
    this.createPost();
    this.updatePost();
    this.deletePost();
  }

  private async getPostAsString() {
    const url = `${this.baseUrl}posts/1`;
    const result = await fetch(url);
    const data = await result.text();
    console.log(data);
  }

  private async getPostAsJson() {
    const url = `${this.baseUrl}posts/1`;
    const result = await fetch(url);
    const data = await result.json();
    const post = Object.assign(new Post(), data);
    console.log(post);
  }

  private async getPosts(n: number) {
    const url = `${this.baseUrl}posts`;
    const result = await fetch(url);
    const data = await result.json();
    (data as Post[]).slice(0, n).map(v => {
      const post = Object.assign(new Post(), v);
      console.log(post);
    });
  }

  private async createPost() {
    const url = `${this.baseUrl}posts`;
    const result = await fetch(url, {
      method: 'POST',
      headers: {
        'Content-Type': 'application/json'
      },
      body: JSON.stringify({
        userId: 101,
        title: 'test title',
        body: 'test body',
      })
    });
    const data = await result.json();
    const post = Object.assign(new Post(), data);
    console.log(post);
  }

  private async updatePost() {
    const url = `${this.baseUrl}posts/1`;
    const result = await fetch(url, {
      method: 'PUT',
      headers: {
        'Content-Type': 'application/json'
      },
      body: JSON.stringify({
        userId: 101,
        title: 'test title',
        body: 'test body',
      })
    });
    const data = await result.json();
    const post = Object.assign(new Post(), data);
    console.log(post);
  }

  private async deletePost() {
    const url = `${this.baseUrl}posts/1`;
    const result = await fetch(url, {
      method: 'DELETE'
    });
    const data = await result.text();
    console.log(data);
  }
}
  • getPostAsString 方法取出第1个Post,返回字符串
  • getPostAsJson 方法取出第1个Post,返回Post对象
  • getPosts 方法取出前n个Post,返回n个Post对象
  • createPost 方法创建1个Post,返回字符串
  • updatePost 方法更新第1个Post,返回字符串
  • deletePost 方法删除第1个Post,返回字符串

打开 App.tsx,将其改为

import * as React from 'react';
import './App.css';

import logo from './logo.svg';
import { PostService } from './post.service';
import { Inject, Module } from 'react.di';

@Module({
  providers: [
    PostService,
  ],
})
class App extends React.Component {
  @Inject postService!: PostService;

  componentDidMount() {
    console.log(this.postService);
  }

  public render() {
    return (
      <div className="App">
        <header className="App-header">
          <img src={logo} className="App-logo" alt="logo" />
          <h1 className="App-title">Welcome to React</h1>
        </header>
        <p className="App-intro">
          To get started, edit <code>src/App.tsx</code> and save to reload.
        </p>
      </div>
    );
  }
}
 
export default App;

输出结果

{
  "userId": 1,
  "id": 1,
  "title": "sunt aut facere repellat provident occaecati excepturi optio reprehenderit",
  "body": "quia et suscipit\nsuscipit recusandae consequuntur expedita et cum\nreprehenderit molestiae ut ut quas totam\nnostrum rerum est autem sunt rem eveniet architecto"
}
Post {userId = 1, id = 1, title = "sunt aut facere repellat provident occaecati excepturi optio reprehenderit", body = "quia et suscipit\nsuscipit recusandae consequuntur expedita et cum\nreprehenderit molestiae ut ut quas totam\nnostrum rerum est autem sunt rem eveniet architecto"}
Post {userId = 1, id = 1, title = "sunt aut facere repellat provident occaecati excepturi optio reprehenderit", body = "quia et suscipit\nsuscipit recusandae consequuntur expedita et cum\nreprehenderit molestiae ut ut quas totam\nnostrum rerum est autem sunt rem eveniet architecto"}
Post {userId = 1, id = 2, title = "qui est esse", body = "est rerum tempore vitae\nsequi sint nihil reprehenderit dolor beatae ea dolores neque\nfugiat blanditiis voluptate porro vel nihil molestiae ut reiciendis\nqui aperiam non debitis possimus qui neque nisi nulla"}
{"params":{"userId":101,"title":"test title","body":"test body"},"id":101}
{"params":{"userId":101,"title":"test title","body":"test body"},"id":1}
{}

标签:body,const,title,userId,REST,js,React,Post,post
From: https://www.cnblogs.com/zwvista/p/16655505.html

相关文章

  • 关于 JSON 引号问题
    JSON的字符串中,字符串的引号必须用单引号,内部的键值必须用双引号importjsonstr='{"a":123,"b":"456"}'str=json.loads(str)print(str)#{'a':123,'b':'4......
  • Flask 学习-43.Flask-RESTX 路由注册的2种方式
    前言flask注册路由有2种方式,一种是通过@app.route()装饰器来实现,另外一种是通过app.add_url_rule()方法来实现路由注册路由的注册在没有使用Flask-RESTX框架之前,我们......
  • 【Azure 存储服务】调用REST API获取Stroage Account Table中所有的Entity计数 -- Cou
    问题描述在StorageAccount的使用中,如果想获取Table中全部Entity的计数以及大小,如果是RESTAPI方式,如何来获取呢? 问题解答在Azure中,所有服务的Metrics部分,都可以通过A......
  • 解决js对Long型数据进行处理时精度丢失的问题
    自定义消息转换器,将消息转换器追加到mvc框架的转换器集合中 步骤:1、首先在mvc配置类(WebMvcConfig)中重写“extendMessageConverters”方法,这是扩展mvc的消息转换器,可以在......
  • [nginx]编译安装openresty
    前言OpenResty是一个基于Nginx和Lua的高性能Web平台,其内部集成了大量精良的Lua库、第三方模块以及大多数的依赖项。用于方便地搭建能够处理超高并发、扩展性极高的动态We......
  • DOM css js 执行顺序
    DOM、CSS、JS的执行顺序js放在head中会立即执行,会阻塞后续的资源下载与执行。因为js有可能会修改dom,如果不阻塞后续的资源下载,dom的操作顺序不可控。2.js的执行依赖前......
  • python读取xlsx文件并转化为 json 数据
    fromopenpyxlimportload_workbookimportosfromreimportfindallimportjson#读取所有的sheet目录defread_xlsx(path="./"):lis=os.listdir(path)......
  • react快捷键
    rcc+tab键:用ES6模块系统创建一个React组件类importReact,{Component}from'react';classTestextendsComponent{render(){return(<......
  • 简单介绍 js array.map、array.forEach、Object.assign、Object.keys用法
     1、 Object.assign,合并成新的对象formData.data=Object.assign({},toRaw(props.rowData)); 2、Object.keys,循环对象的key属性 Object.keys(enumObj).forEa......
  • js操作BOM
    js操作BOM什么是Bom?BOM即浏览器对象模型。BOM提供了独立于内容而与浏览器窗口进行交互的对象;由于BOM主要用于管理窗口与窗口之间的通讯,因此其核心对象是window;BOM由......