在Spartacus 4.3中定制OOTB /search PLP API(GET转POST)及问题排查
搞定Spartacus 4.3搜索API从GET转POST的问题
你遇到的自定义Effect没生效,核心是没找对Spartacus里Feature级别的依赖覆盖方式,下面是亲测有效的步骤:
一、先理清为啥默认Effect没被替换
Spartacus的ProductsSearchEffect是注册在ProductSearchModule的FEATURE_MODULE_EFFECTS多提供者里的,直接在根模块用useClass替换根本碰不到这个层级的注册,得用Spartacus的provideConfig来覆盖Feature模块的配置。
二、一步步实现
1. 编写POST版搜索服务
继承默认的ProductSearchService,重写search方法改成POST请求,把原GET的所有参数和自定义参数打包进请求体:
import { Injectable } from '@angular/core'; import { ProductSearchService, SearchConfig, SearchResult } from '@spartacus/core'; import { Observable } from 'rxjs'; import { HttpClient } from '@angular/common/http'; import { OccEndpointsService } from '@spartacus/core'; @Injectable() export class PostProductSearchService extends ProductSearchService { constructor( protected http: HttpClient, protected occEndpoints: OccEndpointsService ) { super(http, occEndpoints); } search(query: string, searchConfig?: SearchConfig): Observable<SearchResult> { const searchUrl = this.occEndpoints.getUrl('search'); // 打包原搜索参数+自定义长参数 const requestBody = { query, ...searchConfig, // 这里添加你的自定义参数 }; return this.http.post<SearchResult>(searchUrl, requestBody); } }
2. 编写自定义搜索Effect
复用默认Effect的逻辑,只是把依赖换成上面的POST服务:
import { Injectable } from '@angular/core'; import { Actions, createEffect, ofType } from '@ngrx/effects'; import { ProductSearchActions } from '@spartacus/core'; import { catchError, map, switchMap } from 'rxjs/operators'; import { of } from 'rxjs'; import { PostProductSearchService } from './post-product-search.service'; @Injectable() export class PostProductsSearchEffect { searchProducts$ = createEffect(() => this.actions$.pipe( ofType(ProductSearchActions.SEARCH_PRODUCTS), switchMap((action) => this.searchService.search(action.query, action.searchConfig).pipe( map((result) => ProductSearchActions.SEARCH_PRODUCTS_SUCCESS({ result })), catchError((error) => of(ProductSearchActions.SEARCH_PRODUCTS_FAIL({ error })) ) ) ) ) ); constructor( protected actions$: Actions, protected searchService: PostProductSearchService ) {} }
3. 关键:用provideConfig覆盖Feature配置
新建自定义模块,把自定义Effect和服务通过provideConfig注册到productSearch Feature模块中,这是让自定义代码生效的核心:
import { NgModule } from '@angular/core'; import { provideConfig, ProductSearchModule, FEATURE_MODULE_EFFECTS, ProductSearchService } from '@spartacus/core'; import { PostProductsSearchEffect } from './post-products-search.effect'; import { PostProductSearchService } from './post-product-search.service'; @NgModule({ imports: [ProductSearchModule], providers: [ provideConfig({ featureModules: { productSearch: { providers: [ // 替换Effect,必须加multi: true,因为FEATURE_MODULE_EFFECTS是多提供者 { provide: FEATURE_MODULE_EFFECTS, useClass: PostProductsSearchEffect, multi: true, }, // 替换搜索服务 { provide: ProductSearchService, useClass: PostProductSearchService, }, ], }, }, }), ], }) export class CustomSearchModule {}
4. 导入自定义模块到AppModule
确保CustomSearchModule在AppModule的imports数组中,且导入顺序在Spartacus核心模块之后。
三、验证要点
- 打开浏览器网络面板,触发搜索后确认请求方式为POST,请求体包含所有必要参数
- 测试原有搜索功能(分页、筛选、排序等)是否正常工作
- 可在自定义Effect中添加
console.log,验证搜索Action触发时是否进入自定义逻辑
内容的提问来源于stack exchange,提问作者vipin sharma
相关产品推荐
相关产品推荐

