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

Different values when I send a string (with quotes) as a parameter and when I send as a string (take the string from parameter)

提问人:aaa 提问时间:8/23/2023 最后编辑:aaa 更新时间:8/24/2023 访问量:69

问:

我有一个包含字符串的变量。 当我将变量作为参数发送到 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\": \"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\"
        }
      ]
    }
}"

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

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

当我复制“query”变量的数据(右键单击“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'获取增量:enter image description here

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

谢谢!

Java 双引号

评论

1赞 Old Dog Programmer 8/23/2023
这些是一些相当丑陋的屏幕截图,它们可以将注意力从您所问的内容上移开。您是否能够在问题正文中包含重要且相关的信息作为文本?文字图像在这里不受欢迎
0赞 aaa 8/23/2023
请忽略屏幕截图,只阅读我添加的代码片段,我认为已经足够清楚了,如果没有,请告诉我
1赞 VGR 8/24/2023
我几乎说不出这里发生了什么。正如老狗所说,屏幕截图很难阅读。第一个屏幕截图在第 592 行到第 603 行有一些代码,我们看不到。虽然这似乎与转义字符有关,但我无法分辨什么是 String 文字,什么是打印的字符串值。请向我们提供代码行,并请用文本(而不是图像)解释输出是什么以及您如何获得该输出(例如 println 语句、调试器窗口等)。
0赞 aaa 8/24/2023
@OldDogProgrammer - 我更新了帖子,我希望现在更清楚了。谢谢!!
0赞 aaa 8/24/2023
@VGR - 我更新了帖子,我希望现在更清楚了。谢谢!!

答:

0赞 Reilas 8/23/2023 #1

"...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\" } ] }}

评论

0赞 aaa 8/23/2023
我尝试运行以下代码,但仍然不起作用:mecApisGraphQLClient.mecGraphQLQuery(MecGraphQLClient.BEARER_PREFIX + mecAccessToken, query.replaceAll(“\”“, ”\\\\\“”));
0赞 Reilas 8/23/2023
@aaa,有趣。而且,如果您复制并粘贴值,它是否正常工作?你能在你的帖子中增加这个价值吗?
0赞 Luatic 8/24/2023
转义通常不仅适用于双引号。我猜这可能需要完整的 JSON 字符串转义或类似的东西。您建议的解决方案至少缺少反斜杠,这些反斜杠当前确实出现在字符串中。
0赞 aaa 8/24/2023
谢谢@Luatic。你有其他解决方案吗?
0赞 Luatic 8/24/2023
@aaa 我不知道,因为我不知道您正在使用哪个 API,也不知道它到底期望什么,也不想在黑暗中点击。不过,您可以尝试使用 JSON 编码的字符串并再次对其进行 JSON 编码。