@goplus123/core-api 1.0.7 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -260,6 +260,150 @@ const sdk = initSDK({
260
260
 
261
261
  对应实现:[`initSDK`](./src/index.ts#L372-L578)
262
262
 
263
+ ### gRPC:按服务路由 baseUrl(多服务地址扩展)
264
+
265
+ SDK 在每次 gRPC 调用前,会根据 `service.typeName` 自动选择本次请求的 `baseUrl`(见 [`pickBaseUrl`](./src/client/grpcClient.ts#L157-L183))。
266
+
267
+ 优先级(从高到低):
268
+
269
+ 1. `resolveBaseUrl(serviceTypeName)`
270
+ 2. `baseUrlByService[serviceTypeName]`
271
+ 3. `baseUrlByService[namespace]`(`namespace = serviceTypeName.split('.')[0]`)
272
+ 4. `autoBaseUrlByNamespace`(`baseUrl + '/{namespace.toLowerCase()}'`)
273
+ 5. `baseUrl`(兜底)
274
+
275
+ 注意:`baseUrlByService` 的 key 是严格区分大小写的
276
+
277
+ - key 要和 `service.typeName` / `namespace` 完全一致(例如 CMS 的 `namespace` 是 `CMS`,而不是 `cms`)
278
+ - 如果 key 没命中且开启了 `autoBaseUrlByNamespace: true`,会走兜底的自动拼路径(你看到的请求地址通常会变成 `.../cms/...`)
279
+ - value 建议使用“纯 URL 字符串”,不要额外带反引号/空格(例如 `https://fpms-nt.platform88.me/cmsx`)
280
+
281
+ 示例 1:自动按 namespace 拼路径(最省事,要求网关按 `/cms`、`/recommend` 这种路径分 service)
282
+
283
+ ```ts
284
+ import { initSDK } from '@goplus123/core-api'
285
+
286
+ initSDK({
287
+ grpc: {
288
+ baseUrl: 'https://fpms-nt.platform88.me',
289
+ autoBaseUrlByNamespace: true,
290
+ },
291
+ headerConfig: {
292
+ version: '1.0.0',
293
+ platformId: '50',
294
+ isReload: false,
295
+ deviceType: 1,
296
+ deviceId: '',
297
+ childPlatformId: '50',
298
+ },
299
+ } as any)
300
+ ```
301
+
302
+ 示例 2:用 `baseUrlByService` 做静态映射(真实路由前缀与 typeName 不一致、或少量服务走不同域名/路径)
303
+
304
+ ```ts
305
+ import { initSDK } from '@goplus123/core-api'
306
+
307
+ initSDK({
308
+ grpc: {
309
+ baseUrl: 'https://fpms-nt.platform88.me',
310
+ baseUrlByService: {
311
+ recommend: 'https://fpms-nt.platform88.me/recommendation',
312
+ CMS: 'https://fpms-nt.platform88.me/cmsx',
313
+ 'CMS.FrontendService': 'https://fpms-nt.platform88.me/cmsx',
314
+ 'player.FrontendPlayerService': 'https://fpms-player.platform88.me/player',
315
+ },
316
+ },
317
+ headerConfig: {
318
+ version: '1.0.0',
319
+ platformId: '50',
320
+ isReload: false,
321
+ deviceType: 1,
322
+ deviceId: '',
323
+ childPlatformId: '50',
324
+ },
325
+ } as any)
326
+ ```
327
+
328
+ 示例 3:用 `resolveBaseUrl` 做动态解析(最高优先级;适合灰度/环境/复杂规则)
329
+
330
+ ```ts
331
+ import { initSDK } from '@goplus123/core-api'
332
+
333
+ initSDK({
334
+ grpc: {
335
+ baseUrl: 'https://fpms-nt.platform88.me',
336
+ resolveBaseUrl: (serviceTypeName) => {
337
+ const ns = serviceTypeName.split('.')[0]
338
+ const nsLower = ns.toLowerCase()
339
+ if (nsLower === 'recommend') return 'https://fpms-nt.platform88.me/recommendation'
340
+ if (nsLower === 'player') return 'https://fpms-player.platform88.me/player'
341
+ return `https://fpms-nt.platform88.me/${nsLower}`
342
+ },
343
+ },
344
+ headerConfig: {
345
+ version: '1.0.0',
346
+ platformId: '50',
347
+ isReload: false,
348
+ deviceType: 1,
349
+ deviceId: '',
350
+ childPlatformId: '50',
351
+ },
352
+ } as any)
353
+ ```
354
+
355
+ ### gRPC:打印请求/响应数据(logPayload)
356
+
357
+ 如果需要在项目中把 gRPC 请求/响应的数据打印出来,可以在 `grpc` 配置里开启 `logPayload`。
358
+
359
+ 它会把 payload 序列化成字符串并写入你传入的 `logger.debug`(例如 `console.debug`),字段名为 `payload`。
360
+
361
+ ```ts
362
+ import { initSDK } from '@goplus123/core-api'
363
+
364
+ initSDK({
365
+ grpc: {
366
+ baseUrl: 'https://example.com/cms',
367
+ logPayload: true,
368
+ },
369
+ headerConfig: {
370
+ version: '1.0.0',
371
+ platformId: '50',
372
+ isReload: false,
373
+ deviceType: 1,
374
+ deviceId: '',
375
+ childPlatformId: '50',
376
+ },
377
+ logger: console,
378
+ } as any)
379
+ ```
380
+
381
+ 也可以做更细的控制:
382
+
383
+ ```ts
384
+ initSDK({
385
+ grpc: {
386
+ baseUrl: 'https://example.com/cms',
387
+ logPayload: {
388
+ request: true,
389
+ response: false,
390
+ maxLength: 20000,
391
+ },
392
+ },
393
+ headerConfig: {
394
+ version: '1.0.0',
395
+ platformId: '50',
396
+ isReload: false,
397
+ deviceType: 1,
398
+ deviceId: '',
399
+ childPlatformId: '50',
400
+ },
401
+ logger: console,
402
+ } as any)
403
+ ```
404
+
405
+ 注意:请避免在生产环境长期开启,尤其是当 payload 可能包含敏感信息(token/手机号等)时。
406
+
263
407
  ### React Native:配置 gRPC invoker(Invoke)(解决 RN 真机 gRPC-Web 兼容问题)
264
408
 
265
409
  当后端仅提供 gRPC-Web,而 React Native 环境下 `@connectrpc/connect-web` 的 `fetch`/二进制响应解析存在兼容性问题时,可以通过 `grpc.invoker` 注入一层“可替换的底层调用器”,在不改动上层调用方式(`sdk.xxx` / `requestApi` / spec)前提下,切换为 RN 可用的 gRPC-Web 实现。