В настоящее время я использую Feign Client для вызова конечной точки для получения почты Outlook. Но параметр запроса неправильно передается в API.
@FeignClient(name = "email", url = "${BASE.URI}")
public interface EmailClient {
@GetMapping("/mailfolders/Inbox/messages")
EmailRequestNew getMessages(@RequestHeader HashMap<String, Object> headers,
@RequestParam String filter);
Через службу я вызываю этот почтовый клиент, чтобы получать почту и передавать фильтр как ниже, где от и до datetime
String param = "$filter=receivedDateTime ge " + from + " and receivedDateTime lt " + to +
"&$expand=singleValueExtendedProperties($filter=id+eq+'String+0x0070')";
Но фактический API, который вызывает, не точен предположим, что BASE.URI что-то вроде (10.0.0.120:8080)
https://BASE.URI/mailfolders/Inbox/messages?param=%24filter%3DreceivedDateTime%20ge%202022-11-18T05%3A32%3A56Z%20and%20receivedDateTime%20lt%202022-11-18T09%3A32%3A56Z%26%24expand%3DsingleValueExtendedProperties%28%24filter%3Did%20eq%20%27String%200x0070%27%29
https://dev-api.bhspecialty.com/xchange/v1/mailfolders/Inbox/messages?%24filter=receivedDateTime%20ge%202022-11-18T04:16:58Z%20and%20receivedDateTime%20lt%202022-11-18T08:16:58Z&%24expand=singleValueExtendedProperties($filter=id+eq+'String+0x0070')
Как я могу этого добиться.
Я пробовал кодирование/декодирование URL, но это не работает.
Пример:
URLDecoder.decode(param,"UTF-8")
UriUtils.encodePath(параметр, "UTF-8");
Но ничего не работает.
Поэтому я смог сделать это, создав RequestInterceptor, а затем расшифровав URI, а также изменив свой EmailClient, чтобы он принимал PathVariable вместо RequestParam.
@GetMapping(value = "/mailfolders/Inbox/messages?$expand = {expand}&$filter = {filter}", consumes = MediaType.APPLICATION_JSON_VALUE)
EmailRequestNew getMessages(@RequestHeader HashMap<String, Object> headers,
@PathVariable String filter, @PathVariable String expand);
@Component
public class FeignClientRequestInterceptor implements RequestInterceptor {
private static Logger logger = LogManager.getLogger(FeignClientRequestInterceptor.class);
@Override
public void apply(RequestTemplate template) {
try {
template.uri(URLDecoder.decode(template.request().url(), "UTF-8"));
logger.info("FeignClientRequestInterceptor: " + URLDecoder.decode(template.request().url(), "UTF-8") );
} catch (UnsupportedEncodingException e) {
logger.log(Level.INFO,"Error in FeignClientRequestInterceptor: " + template.request().url() );
throw new RuntimeException(e);
}
}
}
Это окончательный созданный uri: