Loopback如何将GET接口改为POST以接收请求体并传递给动态模型生成函数
Loopback 动态模型接口POST改造方案
- 首先确认已从
@loopback/rest包导入必要的装饰器@post和@requestBody
改造后接口完整代码
import { post, requestBody } from '@loopback/rest'; // 替换原有的@get端点 @post('/ping/build', { responses: { '200': { description: 'Test models assemble', content: { 'application/json': { schema: { type: 'boolean' } } }, }, }, }) async build( // 通过requestBody装饰器接收客户端传入的模型配置 @requestBody({ content: { 'application/json': { schema: { type: 'object', title: 'DynamicModelConfig', properties: { name: { type: 'string' }, properties: { type: 'object', additionalProperties: true }, // 可根据业务需求扩展允许传入的配置字段 }, required: ['name', 'properties'], }, }, }, }) modelData: any, ): Promise<boolean> { return dynamicModelsDemo(this.localApp, modelData); }
可选优化:动态模型完全适配传入参数
如果需要让动态创建逻辑完全使用客户端传入的配置,修改dynamicModelsDemo内的模型定义逻辑即可:
export async function dynamicModelsDemo(app: any, modelData: any): Promise<boolean> { console.log("接收到的模型配置", modelData); // 替换原有静态写死的modelDef,用传入的参数生成模型定义 const modelDef = new ModelDefinition(modelData); // 后续原有逻辑保持不变 const DynamicModel = defineModelClass<typeof Entity, any>( Entity, modelDef, ); const DynamicRepository = defineCrudRepositoryClass(DynamicModel); inject(`datasources.memory`)(DynamicRepository, undefined, 0); const repoBinding = app.repository(DynamicRepository); const basePath = `/${modelData.name}`; const DynamicController = defineCrudRestController(DynamicModel, {basePath}); inject(repoBinding.key)(DynamicController, undefined, 0); app.controller(DynamicController); console.log(`动态接口已生成,基础路径:${basePath}`); return true; }
调用示例
curl --location --request POST 'http://你的服务地址/ping/build' \ --header 'Content-Type: application/json' \ --data-raw '{ "name": "contact", "properties": { "id": { "type": "Number", "required": true, "precision": 10, "id": 1 }, "name": { "type": "String", "required": false, "length": 512 }, "phone": { "type": "String", "required": true, "length": 20 } } }'
内容的提问来源于stack exchange,提问作者Bhaskar Jha
相关产品推荐
相关产品推荐

