簡體   English   中英

如何通過 RESTAPI 在 Express Gateway 中使用多個路徑和端點?

[英]How do i use multiple paths and endpoints in Express Gateway with my RESTAPI?

目前正在開發處理對 RESTAPI 和 GraphQL 微服務的調用的 Express Gateway。 GraphQL 管道工作正常,但 RESTAPI 的管道是我正在努力解決的問題。

我制作了一個簡單的 CRUD 功能 RESTAPI,可以創建、閱讀、更新和刪除書籍和作者。 他們有多種途徑可以做到這一點,例如:http://localhost:4001/books/add。

問題是我真的不明白如何在快速網關中翻譯這些路由或路徑,以便我可以通過網關到達它們。

這是我當前的代碼,config.yml:

http:
  port: 8080
admin:
  port: 9876
  host: localhost
apiEndpoints:
  restapi:
    host: localhost
    paths: '/rp'
  graphql:
    host: localhost
    paths: '/gql'
serviceEndpoints:
  restapi:
    url: 'http://localhost:4001/'    
  graphql:  
    url: 'http://localhost:4000'
policies:
  - proxy
pipelines:
  restapi:
    apiEndpoints:
      - restapi
    policies:
      - proxy:
          - action: 
              serviceEndpoint: restapi
              changeOrigin: true
              ignorePath: false
              prependPath: true
              stripPath: true
              
  graphql:
    apiEndpoints:
      - graphql
    policies:
      - proxy:
          - action:
              serviceEndpoint: graphql
              changeOrigin: true

這是restapi書的代碼:

const express = require('express');
const mongoose = require('mongoose');
const book = require('../models/book');
const { findById } = require('../models/book');
const router = express.Router();
const Book = require('../models/book');

//read all books
router.get('/', async (req, res) =>{
    try{
        const AllBooks = await Book.find();
        res.json(AllBooks);
    }catch(err){
        res.json({message:err});
    }
    
})

//create book
router.post('/add', async (req, res) => {
    var NewBook = new Book({
        title: req.body.title,
        pages: req.body.pages
    })
    try{
        const SavedBook = await NewBook.save();
        res.json(SavedBook);
    }catch(err){
        res.json({message: err})
    }
})

//read book
router.get('/:BookId', async (req, res) => {
    try{
        const ReadBook = await Book.findById(req.params.BookId);
        res.json(ReadBook);
    }catch(err){
        res.json({message: err});
    }    
})

//update book
router.patch('/update/:BookId', async (req, res) => {
    try{
        const updatedBook = await Book.updateOne({_id: req.params.BookId},
            {$set: {title: req.body.title, pages: req.body.pages}});
        res.json(updatedBook);
    }catch(err){
        res.json({message: err});
    }    
})

//delete book
router.delete('/delete/:BookId', async (req, res) => {
    try{
         const DelBook = await Book.findById(req.params.BookId);
         DelBook.delete();
         res.send(DelBook + " Deleted");
    }catch(err){
        res.json({message: err});
    }
})



module.exports = router;

現在,當我調用:http://localhost:4001/rp 時,它會返回“restapi”,就像我告訴的那樣。 但是當我調用:http://localhost:4001/rp/books 時,它返回一個“CANNOT GET”,這是合乎邏輯的,因為我沒有定義這個路徑。 首先,我認為快速網關會自動理解這一點。

我必須對所有路徑進行硬編碼嗎?

我希望有人能給我解釋一下,因為快遞網關沒有像我這樣的例子。 :)

我找到了解決方案。

我對 apiEndpoint 和 serviceEndpoint 之間的定義感到困惑。

答案是:是的,您必須對所有路徑進行硬編碼,但這只會在“apiEndpoints”下。

它看起來像這樣:

apiEndpoints:
  restapi:
    host: localhost
    paths: 
       - '/books'
       - '/books/add'
       - '/authors'
       - '/authors/...'
serviceEndpoints:
  restapi:
    url: 'http://localhost:4001'

所以總而言之,只有一項服務具有多個 api 端點,這聽起來很合邏輯。

我認為一個缺點是,當有很多服務時,這個配置文件將變成一大堆端點。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM