使用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
相关产品推荐
相关产品推荐

