Я пытаюсь динамически передать queryParams для запроса в зависимости от того, что пользователь ввел в почтальон. Вот сообщение преобразования с именем переменной jql (эту переменную я хотел бы передать в URL-адресе)
<ee:transform doc:name = "Transform Message" >
<ee:message>
</ee:message>
<ee:variables>
<ee:set-variable variableName = "queryParams" ><![CDATA[
{
"demo" : attributes.queryParams['demo'] default "",
"demo2": attributes.queryParams['demo2'] default "",
"demo3" :attributes.queryParams['demo3'] default ""
}
]]></ee:set-variable>
<ee:transform doc:name = "Transform Message" >
<ee:message >
</ee:message>
<ee:variables >
<ee:set-variable variableName = "jql" ><![CDATA[
if (vars.queryParams.demo != null and vars.queryParams.demo2 == null and vars.queryParams.demo3 == null)
"demo= " ++ vars.queryParams.demo
else if (vars.queryParams.demo2 != null and vars.queryParams.demo3 == null and vars.queryParams.demo == null)
"demo2 = " ++ vars.queryParams.demo2
else if (vars.queryParams.demo != null and vars.queryParams.demo2 != null and vars.queryParams.demo3 == null )
"demo= " ++ vars.queryParams.demo ++ " and demo2 = " ++ vars.queryParams.demo2
]]></ee:set-variable>
</ee:variables>
</ee:transform>
<http:request method = "GET" doc:name = "Request" config-ref = "HTTP_Request_configuration" path = "/demo/search">
<http:query-params><![CDATA[#[output application/java
---
{
"jql" : vars.jql
}]]]></http:query-params>
</http:request>
И, например, если пользователь поместил только параметр demo, мне бы хотелось только это «demo = demo» и т. д.
В этом случае я получил 400 следующим образом:
Message : HTTP GET on resource 'https://demo/search' failed: bad request (400).
Element : searchForIssuesUsingJQL/processors/2 @ jira:jira.xml:160 (Request)
Element DSL : <http:request method = "GET"
doc:name = "Request" config-ref = "HTTP_Request_configuration" path = "demo/search">
<http:query-params>#[output application/java
---
{
"jql" : vars.jql
}]</http:query-params>
</http:request>
Error type : HTTP:BAD_REQUEST
Мой URL-адрес должен выглядеть так: /demo/search?jql=demo = demo and demo2 = demo2 AND demo3 = demo3 Но я не хочу, чтобы всегда было три фильтра. Вот почему я пытаюсь использовать, если зависит от того, что я помещаю в почтальон.
Это не лучший способ его реализации, и он даже не охватывает все возможные случаи. Лучше сделать его динамичным. Давайте преобразуем vars.QueryParams в список для более удобной обработки, а затем сократим его до одной строки, добавив " и " в отдельные элементы, когда аккумулятор не пуст:
vars.queryParams
filterObject (sizeOf($) > 0)
pluck ((value, key, index) -> {k: key, v:value})
map ($.k ++ " = " ++ $.v)
joinBy " and "
С помощью этого метода вам даже не нужно знать, содержит ли он определенную строку.
Спасибо вроде хорошо. Я пробовал это, но в vars.jql я получил "demo= и demo2=Test и demo3 = " и получил 400. Я не знаю, почему
Вы имеете в виду использование моего скрипта? Какова ценность vars.queryParams
?
Да при использовании вашего скрипта. Я думаю, потому что у меня по умолчанию "" для каждого запроса Params.
Я решаю это, используя вложенный if, и он работает. Спасибо.
Я не знал, что значения могут быть пустыми. Я добавил фильтр, чтобы исключить их из преобразования. Помните, что DataWeave — это функциональный язык и имеет функции, работающие с массивами или объектами, которые обеспечивают более элегантные решения, чем использование if, и делают код более понятным.
Я обновил свой ответ, чтобы не использовать if в качестве примера альтернатив.
Спасибо. Это решение также работает.
Можете ли вы поделиться тем, как бы вы хотели, чтобы параметры запроса выглядели? То, что вы настраиваете, будет выглядеть
jql=demo{encodedequals}demo