You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用REST技术配置文件时处理可空JSON响应的问题求助

解决方案:双声明+声明转换处理

步骤1:定义两个声明

在ClaimsSchema里添加两个声明,一个临时存储字符串类型的返回值,一个是最终要传递给下游的dateTime类型声明:

<ClaimsSchema>
  <!-- 临时存储字符串格式的返回值 -->
  <ClaimType Id="OptionalIso8601DateTimeString">
    <DisplayName>Optional ISO 8601 DateTime (String)</DisplayName>
    <DataType>string</DataType>
  </ClaimType>
  <!-- 最终传递给下游的dateTime声明 -->
  <ClaimType Id="OptionalIso8601DateTime">
    <DisplayName>Optional ISO 8601 DateTime</DisplayName>
    <DataType>dateTime</DataType>
  </ClaimType>
</ClaimsSchema>

步骤2:REST技术配置文件映射到字符串声明

把REST返回的字段统一映射到字符串类型的临时声明,避开dateTime类型对null的转换错误:

<TechnicalProfile Id="REST-GetOptionalDateTime">
  <DisplayName>Get Optional DateTime from REST API</DisplayName>
  <Protocol Name="Proprietary" Handler="Web.TPEngine.Providers.RestfulProvider, Web.TPEngine, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
  <Metadata>
    <Item Key="ServiceUrl">https://your-rest-endpoint.com/api/getdatetime</Item>
    <Item Key="AuthenticationType">None</Item>
    <Item Key="SendClaimsIn">Body</Item>
  </Metadata>
  <OutputClaims>
    <OutputClaim ClaimTypeReferenceId="OptionalIso8601DateTimeString" PartnerClaimType="OptionalIso8601DateTime" />
  </OutputClaims>
  <UseTechnicalProfileForSessionManagement ReferenceId="SM-Noop" />
</TechnicalProfile>

步骤3:添加声明转换规则

通过声明转换判断字符串声明的值:非空时转成dateTime类型赋值给目标声明;为空(对应原返回的null)则不生成目标声明,自然不会触发错误。

先定义转换规则:

<ClaimsTransformations>
  <ClaimsTransformation Id="ConvertStringToDateTimeIfNotEmpty" TransformationMethod="ConvertStringToDateTime">
    <InputClaims>
      <InputClaim ClaimTypeReferenceId="OptionalIso8601DateTimeString" TransformationClaimType="inputClaim" />
    </InputClaims>
    <OutputClaims>
      <OutputClaim ClaimTypeReferenceId="OptionalIso8601DateTime" TransformationClaimType="outputClaim" />
    </OutputClaims>
    <InputParameters>
      <InputParameter Id="DateTimeFormat" DataType="string" Value="yyyy-MM-ddTHH:mm:ssZ" />
    </InputParameters>
  </ClaimsTransformation>
</ClaimsTransformations>

然后创建执行转换的技术配置文件:

<TechnicalProfile Id="TP-ConvertStringToDateTime">
  <DisplayName>Convert String to DateTime if Not Empty</DisplayName>
  <Protocol Name="Proprietary" Handler="Web.TPEngine.Providers.ClaimsTransformationProtocolProvider, Web.TPEngine, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
  <InputClaims>
    <InputClaim ClaimTypeReferenceId="OptionalIso8601DateTimeString" />
  </InputClaims>
  <OutputClaims>
    <OutputClaim ClaimTypeReferenceId="OptionalIso8601DateTime" />
  </OutputClaims>
  <OutputClaimsTransformations>
    <OutputClaimsTransformation ReferenceId="ConvertStringToDateTimeIfNotEmpty" />
  </OutputClaimsTransformations>
</TechnicalProfile>

步骤4:在用户旅程中加入转换步骤

在调用REST接口的步骤之后,添加执行转换的步骤:

<UserJourney Id="SignUpOrSignIn">
  <OrchestrationSteps>
    <!-- 其他步骤(比如登录/注册) -->
    <OrchestrationStep Order="5" Type="ClaimsExchange">
      <ClaimsExchanges>
        <ClaimsExchange Id="RESTGetDateTime" TechnicalProfileReferenceId="REST-GetOptionalDateTime" />
      </ClaimsExchanges>
    </OrchestrationStep>
    <!-- 执行日期转换 -->
    <OrchestrationStep Order="6" Type="ClaimsExchange">
      <ClaimsExchanges>
        <ClaimsExchange Id="ConvertDateTime" TechnicalProfileReferenceId="TP-ConvertStringToDateTime" />
      </ClaimsExchanges>
    </OrchestrationStep>
    <!-- 后续步骤(比如颁发令牌) -->
  </OrchestrationSteps>
</UserJourney>

逻辑说明

  • 先统一把REST返回值映射到字符串声明,避免dateTime类型对null的转换报错
  • 仅当字符串声明非空时,才执行格式转换生成dateTime声明
  • 原返回null的情况,字符串声明为空,转换步骤不会生成dateTime声明,下游应用可按声明不存在处理,不会触发任何错误

内容的提问来源于stack exchange,提问作者53280-1

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 20:40:34