当前位置: 首页 > 知识库问答 >
问题:

如何使用快速网关中的多个路径和endpoint与我的RESTAPI?

微生德运
2023-03-14

目前正在处理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时,它返回一个“无法获取”,这是我没有定义此路径的逻辑原因。首先,我认为快速网关会自动理解这一点。

我必须硬编码所有的路径吗?

我希望有人能向我解释,因为express gateway没有象我这样的例子。:)

共有1个答案

宗政永望
2023-03-14

我找到了解决办法。

我对apiEndpoint和ServiceEndpoint之间的定义感到困惑。

答案是:是的,您必须硬编码所有路径,但这将只在“apiendpoints”下。

它将看起来是这样的:

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

因此,总而言之,只有一个带有多个api端点的服务,这听起来很合乎逻辑

我认为一个缺点是,当有很多服务时,这个配置文件会变成一大堆端点。

 类似资料:
  • 我用我的软件包做了“npm运行构建”。json。我听到了这个消息。如何将@与网页包一起使用? 错误/节点\模块/babel加载程序/lib/节点_模块/vue加载程序/lib/selector。js?类型=脚本 但是在"npm run dev"中,它成功了。我的package.json: 用这个包裹。json,它成功了: 2月6日。添加了我的webpack.config.js:

  • 问题内容: 我在Socket.io中使用Express,但我不知道如何在Express路由中使用SocKet.io。 我最终在“ app.js”中这样做 我该如何定义到“ / cmp”的路由,并在其中传递var“ io”? 这样,在“ /routes/cmp.js”中,我可以执行以下操作: 一些线索? 问题答案: 高阶函数呢? 然后 作为另一种选择,有时我会将路线的格式设置为以下格式: 然后定义为

  • 我在本地计算机上有一个运行的api,url为http://localhost:8080/gnk-债务/服务/纳税人债务。我希望这个api可以通过带有url的网关访问http://localhost:8243/gnk/service/phystaxpayer/debt/v1.为此,首先在属性文件中设置端口。但我无法为apiendpoint设置自定义url。我正在尝试使用spring cloud编写一

  • 使用下面的JSON对象,如何在一个lodash的方法中为每个下拉列表传递“”属性? JSON 例如,我现在所拥有的仅包含Dropdown1的数据路径: 如何更好地编写上面的代码,以便在同一个get方法中传递for所有3个下拉列表的数据路径?

  • 问题内容: 如何从Python脚本(或交互式外壳程序)中找出系统变量中列出了哪些目录? 问题答案: 可能包括不是您的环境变量中特定的项目。要直接查询变量,请使用:

  • 首先,我不完全确定这是正确的问题。基本上,我的最终目标是生成一个可以操作一组。docx文件的程序,以便对每个文件进行小的更改。在我看来,docx4j是实现这一目标的最佳方式。但是,我从来没有使用过提供的库之外的库。我首先试图破译手册中提供的所有信息,然后告诉我需要SLF4J才能使用Docx4J。 从这一点来看,我想我做错了什么。我很确定我知道我想写的程序背后的伪逻辑,但我不确定如何写它。我还没有做