我有一个包含字符串的变量。 当我将变量作为参数发送到 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\" } ] }}");
你知道这种行为吗?当我从变量中获取字符串时,如何发送它?
谢谢!
“... 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\" } ] }}