提问人:aaa 提问时间:8/23/2023 最后编辑:aaa 更新时间:8/24/2023 访问量:69
当我发送字符串(带引号)作为参数和作为字符串发送(从参数中获取字符串)时,值不同
Different values when I send a string (with quotes) as a parameter and when I send as a string (take the string from parameter)
问:
我有一个包含字符串的变量。 当我将变量作为参数发送到 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\" } ] }}");
你知道这种行为吗?如何在从变量中获取字符串时发送字符串?
谢谢!
答:
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 编码。
评论