2015-10-27 3 views
1

My GET работает с CorsFilter, но когда я загружаю файл, я теряю объект представления на уровне ресурсов. Пожалуйста, помогите, я застрял. Ниже приведен источник (/ collection GET), (/ POST не работает).CorsFilter loss Объект представления

 CorsFilter corsFilter = new CorsFilter(getContext(), router); 
    corsFilter.setAllowedOrigins(new HashSet(Arrays.asList("*"))); 
    corsFilter.setAllowedCredentials(true); 
    corsFilter.setAllowingAllRequestedHeaders(true); 
    corsFilter.setSkippingResourceForCorsOptions(true); 

    corsFilter.setNext(CollectionsResource.class); 
    router.attach("/collections", corsFilter); 
    corsFilter.setNext(FileUploadResource.class); 
    router.attach("/fileupload", corsFilter); 

В моём представлении сущности в ресурсе мой отладчик говорит сущность является [false/*]. Представление равно нулю.

Я думаю, что это должно быть примерно так: [multipart/form-data; .....].

Следующий мой HTML & AJAX звонок Пожалуйста, посмотрите. Я что-то упустил? Прибудете отлично работает для меня, но не POST:

<html> 
<head> 
<script type="text/javascript" src="https://ajax.microsoft.com/ajax/jQuery/jquery-1.4.2.min.js"></script> 
</head> 
<body> 
<form id="assetUpload"> 
<input id="fileToUpload" name="fileToUpload" type="file" /> 
<input type="submit" value="submit"/> 
</form> 
</body> 
</html> 

$("#assetUpload").submit(function(evt){ 
evt.preventDefault(); 

var formData = new FormData($(this)[0]); 
    alert("FIRE"); 
$.ajax({ 
    url: 'http://localhost:14502/api/v1/fileupload', 
type: 'POST', 
data: formData, 
async: false, 
cache: false, 
contentType: 'false', 
enctype: 'multipart/form-data', 
processData: false, 
success: function (response) { 
    alert(response); 
} 
}); 

ответ

0

Я думаю, что вы могли бы попробовать использовать CorsService вместо CorsFilter. Это удобнее настроить.

Вот как настроить его на самом вашем Restlet применения:

CorsService corsService = new CorsService(); 
corsService.setAllowedOrigins(new HashSet(Arrays.asList("*"))); 
corsService.setAllowedCredentials(true); 
corsService.setAllowingAllRequestedHeaders(true); 
corsService.setSkippingResourceForCorsOptions(true); 

application.getServices().add(corsService); 
component.getDefaultHost().attachDefault(application); 

При таком подходе вам не нужно больше обрабатывать фильтр при настройке маршрутизации вашего приложения. Вот ваш реорганизованный код:

public class MyApplication extends Application { 
    public Restlet createInboutRoot() { 
     Router router = new Router(getContext()); 
     router.attach("/collections", CollectionsResource.class); 
     router.attach("/fileupload", FileUploadResource.class); 
     return router; 
    } 
} 

Я думаю, что ваша проблема возникла из-за того, как вы определили свою маршрутизацию. Фактически, вы устанавливаете дважды следующий атрибут CorsFilter, а последний выигрывает! Таким образом, для обоих путей (/collections и /fileupload) будет обрабатываться класс FileUploadResource.

Это сообщение блога может вас заинтересовать: https://templth.wordpress.com/2014/11/12/understanding-and-using-cors/.

Отредактировано

Если вы хотите явно использовать CorsFilter, вы должны реорганизовать свой код, как описано ниже:

public class MyApplication extends Application { 
    public Restlet createInboutRoot() { 
     Router router = new Router(getContext()); 

     CorsFilter corsFilter = new CorsFilter(getContext(), router); 
     corsFilter.setAllowedOrigins(new HashSet(Arrays.asList("*"))); 
     corsFilter.setAllowedCredentials(true); 
     corsFilter.setAllowingAllRequestedHeaders(true); 
     corsFilter.setSkippingResourceForCorsOptions(true); 

     router.attach("/collections", CollectionsResource.class); 
     router.attach("/fileupload", FileUploadResource.class); 

     return corsFilter; 
    } 
} 

Надеется, что это помогает вам, Тьерри

+0

Я задавался вопрос, как сделать Я захватил функцию CORS? – ogottwald

+0

Фактически, он обрабатывается для вас через Restlet. Вы определяете ожидаемое поведение самой службы. Под капотом в цепочке обработки для запроса добавляется 'CorsFilter'. Это ваш вопрос? –

+0

Не могли бы вы привести несколько примеров того, как маршрутизировать пользовательские фильтры? Я столкнулся с проблемой только во время CORS, если это тот же самый домен, который я могу загрузить. – ogottwald