В настоящее время я пытаюсь решить проблему с CORS, которая возникает у нас при запросе к базе данных с помощью функции проекта FN, которая вызывается из Angular. Функция FN написана на Java (fnproject/fn-java-fdk:1.0.83
), а пользовательский интерфейс - на Angular 7. По сути, мы отправляем запрос JSON в функцию FN в виде байтового массива, который обрабатывает запрос JSON в соответствующий запрос, а затем отправляет это в базу данных. База данных отвечает результатом запроса, который через функцию FN возвращается к пользовательскому интерфейсу с соответствующим ответом.
Я попытался поместить заголовки CORS как htxc.setResponseHeader () и htxc.addResponseHeader (). Я также попытался изменить func.yaml для включения в него протоколов CORS, а не внутри функции, но это не работает. Кроме того, я попытался изменить "*"
в заголовке Access-Control-Allow-Origin
на конкретный URL-адрес, с которого мы также выполняли запрос. Мы также рассмотрели добавление множества различных заголовков к Access-Control-Allow-Headers
в надежде, что один из них решит проблему.
import com.fnproject.fn.api.httpgateway.HTTPGatewayContext;
...
public class query_database {
/**
* @param input is a byte[] array with input, contains the request information
* @return List<dbObject> A list of DB Objects
*/
public List<dbObject> query(byte[] input, HTTPGatewayContext htxc){
// Takes care of the HTTP Gateway context
htxc.setResponseHeader("Access-Control-Allow-Origin", "*");
htxc.addResponseHeader("Access-Control-Allow-Methods", "POST, GET");
htxc.addResponseHeader("Access-Control-Allow-Headers", "Authorization, Origin, X-Requested-With, Content-Type, Accept, Content-Length, X-Experience-API-Version, X-Prototype-Version, Token, X-Auth-Token");
htxc.addResponseHeader("Access-Control-Allow-Credentials", "true");
if (htxc.getMethod().equals("OPTIONS")) {
return Collections.emptyList();
}
String str = new String(input);
JSONObject json = new JSONObject(str);;
Request request = new Request();
String system = json.getString("system");
request.setSystem(system);
queryFunc queryFunc = new queryFunc();
try {
return queryFunc.makeQuery(request);
} catch(DBConnection | HttpException |IOException | emptyStringException e) {
return Collections.emptyList();
}
}
}
В пользовательском интерфейсе Angular 7, когда мы открываем его в Chrome / Firefox, появляется следующая ошибка:
Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at http://server.com:8080/t/function/function-trigger. (Reason: CORS header ‘Access-Control-Allow-Origin’ missing). (unknown)
Это несмотря на то, что заголовок ответа «Access-Control-Allow-Origin» установлен в коде Java. Функция работает правильно, кроме этой ошибки CORS, поэтому мы достаточно уверены, что это что-то с заголовками. Например, ответ JSON правильный.
Есть мысли? Потенциально может быть что-то не так с текущим подходом заголовка, или, возможно, это может быть и на угловой стороне. Дайте мне знать, если есть необходимость в разъяснении этого вопроса.