当我发送字符串(带引号)作为参数和作为字符串发送(从参数中获取字符串)时,会有不同的值

问题描述 投票:0回答:1

我有一个包含字符串的变量。 当我将变量作为参数发送到 api 时,出现错误。

当我从变量复制值并将其发送到 api 时,效果很好。

我认为它与编译器在

\"
上下文中的行为有关。

API:

    @PostMapping(value = "/data/v0/query", consumes = {MediaType.APPLICATION_JSON_VALUE})
    JsonNode mecGraphQLQuery(
            @RequestHeader(HttpHeaders.AUTHORIZATION) String bearerToken,
            @RequestBody String query
    );

API 期望接收以下格式的“查询”参数:

 "{ \"query\": \"query getMecFeedbackDataByDateRange( $filter: Filter, $numPerPage: Int!, $orderBy: [RecordOrder] ) { feedback( filter: $filter, first: $numPerPage, orderBy: $orderBy ) { nodes { e_bp_digital_uuid_txt: fieldValue(fieldId: \\\"e_bp_digital_uuid_txt\\\") responsedate: fieldValue(fieldId: \\\"e_responsedate\\\") } totalCount pageInfo { endCursor hasNextPage } } }\", \"variables\": { \"filter\": { \"and\": [ { \"fieldIds\": [ \"e_responsedate\" ], \"gte\": \"2023-08-22 01:52:15\" }, { \"fieldIds\": [ \"e_responsedate\" ], \"lte\": \"2023-08-24 01:57:15\" } ] }, \"numPerPage\": 1000, \"orderBy\": [ { \"fieldId\": \"e_responsedate\", \"direction\": \"DESC\" } ] }}"

我从 Velocity 文件生成“查询”参数的值:

public String getMecFeedbackDataByDateRangeQuery(String host, String mecAccessToken, String fromDate, String toDate, Set<MecField> fieldNames) {
        Preconditions.checkArgument(!fieldNames.isEmpty(), "List of fields must not be empty!");
        Map<String,Object> velocityContext = new HashMap<>();
        velocityContext.put("fromDate", fromDate);
        velocityContext.put("toDate", toDate);
        velocityContext.put("fieldNames", fieldNames);
        String query = generateGraphQLQuery(velocityContext, "/graphQLTemplates/feedbackDataByDateRange.vm");
        log.info("MEC GraphQL Query: " + query);
        return query.replace("\n", "");
}


String query = graphQLFeedbackClient.getMecFeedbackDataByDateRangeQuery(mecIntegrationConfiguration.getHostHeader(), mecAccessToken, fromDateAsString, toDateAsString, fieldNames);


/graphQLTemplates/feedbackDataByDateRange.vm:

"{
    \"query\":
      \"query getMecFeedbackDataByDateRange( $filter: Filter, $numPerPage: Int!, $orderBy: [RecordOrder] ) {
        feedback(
            filter: $filter,
            first: $numPerPage,
            orderBy: $orderBy
        ) {
          nodes {
            #foreach ($field in $fieldNames)
              $field.getField(): fieldValue(fieldId: \\\"$field.getField()\\\")
            #end
            responsedate: fieldValue(fieldId: \\\"e_responsedate\\\")
          }
          totalCount
          pageInfo {
           endCursor
           hasNextPage
          }
        }
      }\",
    \"variables\":
    {
      \"filter\": {
        \"and\": [
          {
            \"fieldIds\": [
              \"e_responsedate\"
            ],
            \"gte\": \"$fromDate\"
          },
          {
            \"fieldIds\": [
              \"e_responsedate\"
            ],
            \"lte\": \"$toDate\"
          }
        ]
      },
    \"numPerPage\": 1000,
      \"orderBy\": [
        {
          \"fieldId\": \"e_responsedate\",
          \"direction\": \"DESC\"
        }
      ]
    }
}"

当我将“查询”变量作为参数发送到 api 时 - 我收到错误(“无效输入数据”):

mecApisGraphQLClient.mecGraphQLQuery(MecGraphQLClient.BEARER_PREFIX + mecAccessToken, query)

当我复制“查询”变量的数据(右键单击“查询”变量 -> 复制值)并按原样发送到 api 时 - 它工作正常:

mecApisGraphQLClient.mecGraphQLQuery(MecGraphQLClient.BEARER_PREFIX + mecAccessToken, "{ \"query\": \"query getMecFeedbackDataByDateRange( $filter: Filter, $numPerPage: Int!, $orderBy: [RecordOrder] ) { feedback( filter: $filter, first: $numPerPage, orderBy: $orderBy ) { nodes { e_bp_digital_uuid_txt: fieldValue(fieldId: \\\"e_bp_digital_uuid_txt\\\") responsedate: fieldValue(fieldId: \\\"e_responsedate\\\") } totalCount pageInfo { endCursor hasNextPage } } }\", \"variables\": { \"filter\": { \"and\": [ { \"fieldIds\": [ \"e_responsedate\" ], \"gte\": \"2023-08-22 01:52:15\" }, { \"fieldIds\": [ \"e_responsedate\" ], \"lte\": \"2023-08-24 01:57:15\" } ] }, \"numPerPage\": 1000, \"orderBy\": [ { \"fieldId\": \"e_responsedate\", \"direction\": \"DESC\" } ] }}");

我从“DiffUtils.diff”获取增量:

你知道这种行为吗?当我从变量中获取字符串时,如何发送它?

谢谢!

java double-quotes
1个回答
0
投票

“... api 期望接收以下格式的字符串(与我从变量复制时的值相同):...”

看起来查询需要是转义
您需要在每个

\
之前添加
"

您可以使用 String#replace 方法来转义值。

这将在复制和粘贴值时保留

\"
序列。

String string = "{ \"query\": \"query getMecFeedbackDataByDateRange( $filter: Filter, $numPerPage: Int!, $orderBy: [RecordOrder] ) { feedback( filter: $filter, first: $numPerPage, orderBy: $orderBy ) { nodes { e_bp_digital_uuid_txt: fieldValue(fieldId: \\\"e_bp_digital_uuid_txt\\\") responsedate: fieldValue(fieldId: \\\"e_responsedate\\\") } totalCount pageInfo { endCursor hasNextPage } } }\", \"variables\": { \"filter\": { \"and\": [ { \"fieldIds\": [ \"e_responsedate\" ], \"gte\": \"2023-08-22 01:52:15\" }, { \"fieldIds\": [ \"e_responsedate\" ], \"lte\": \"2023-08-24 01:57:15\" } ] }, \"numPerPage\": 1000, \"orderBy\": [ { \"fieldId\": \"e_responsedate\", \"direction\": \"DESC\" } ] }}";
string = string.replace("\"", "\\\"").replace("\\\\\"", "\\\\\\\"");

输出

{ \"query\": \"query getMecFeedbackDataByDateRange( $filter: Filter, $numPerPage: Int!, $orderBy: [RecordOrder] ) { feedback( filter: $filter, first: $numPerPage, orderBy: $orderBy ) { nodes { e_bp_digital_uuid_txt: fieldValue(fieldId: \\\"e_bp_digital_uuid_txt\\\") responsedate: fieldValue(fieldId: \\\"e_responsedate\\\") } totalCount pageInfo { endCursor hasNextPage } } }\", \"variables\": { \"filter\": { \"and\": [ { \"fieldIds\": [ \"e_responsedate\" ], \"gte\": \"2023-08-22 01:52:15\" }, { \"fieldIds\": [ \"e_responsedate\" ], \"lte\": \"2023-08-24 01:57:15\" } ] }, \"numPerPage\": 1000, \"orderBy\": [ { \"fieldId\": \"e_responsedate\", \"direction\": \"DESC\" } ] }}
© www.soinside.com 2019 - 2024. All rights reserved.