我的GET与CorsFilter一起工作,但是当我做一个文件上传帖子时,我在资源级别失去了表示实体。请帮帮我,我被卡住了。以下是源代码(/collections GET), (/fileupload POST不起作用)
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调用请看。我遗漏了什么吗?get对我来说很好,但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);
}
});
我认为你可以尝试使用CorsService
而不是CorsFilter
。配置起来更方便。
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;
}
}
希望它能帮助你,蒂埃里