Я разрабатываю приложение Cordova/PhoneGap, обменивающееся существующими Restful web-сервисами (Jersey). Веб-службы просто прекрасны, потому что я уже разработал версию Android для своего приложения, и он работает нормально. Сейчас я разрабатываю Cordova для iOS. Я прочитал материал о CORS и связанных с ним материалах о перекрестном вызове AJAX. Но отправка результатов запроса AJAX в следующей ошибке:AJAX POST В Джерси включен RESTful Webservice Cross Domain
XMLHttpRequest cannot load http://xxxx:xxxx/api/v1/general/authenticate1. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'null' is therefore not allowed access.
Кроме того, в журнале на стороне сервера каждый вызов AJAX создает кучу журналов с этим сообщением:
INFO: Couldn't find grammar element for class com.test.database.PeopleAuth Jun 08, 2015 5:49:07 PM com.sun.jersey.server.wadl.generators.AbstractWadlGeneratorGrammarGenerator attachTypes
Пожалуйста, проверьте следующие коды и сказать мне, Что здесь неправильно.
Это мой AJAX-код на стороне клиента:
var j = {IMEI: ximei, IMSI: ximsi};
var d = JSON.stringify(j);
console.log(d);
$.ajax({
url:baseurl,
contentType: "application/json; charset=utf-8",
dataType:'json',
type:'POST',
crossDomain: true,
data: d,
success:function(callbak) {
console.log(callbak);
},
error:function(XMLHttpRequest,textStatus, errorThrown) {
console.log(XMLHttpRequest);
//console.log(textStatus);
//console.log(errorThrown);
}
});
и это фильтр моего WebService добавил для заголовков CORS вещи
@Provider
public class CORSResponseFilter implements ContainerResponseFilter {
@Override
public ContainerResponse filter(ContainerRequest requestContext, ContainerResponse responseContext) {
responseContext.getHttpHeaders().putSingle("Access-Control-Allow-Origin", "*");
//responseContext.getHttpHeaders().putSingle("Access-Control-Allow-Credentials", "true");
responseContext.getHttpHeaders().putSingle("Access-Control-Allow-Methods", "GET, POST, DELETE, PUT, OPTIONS, HEAD");
responseContext.getHttpHeaders().putSingle("Access-Control-Allow-Headers", "Content-Type, Accept, X-Requested-With");
return responseContext;
}
}
также web.xml
<servlet>
<servlet-name>TEST REST Service</servlet-name>
<servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
<init-param>
<param-name>jersey.config.server.provider.packages</param-name>
<param-value>com.test.pckg</param-value>
</init-param>
<init-param>
<param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>com.sun.jersey.api.container.ContainerResponseFilters</param-name>
<param-value>com.test.webservices.CORSResponseFilter</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
Обновление № 1: Я протестировал веб-службы с помощью консоли останова (Google Chrome Extention), и они работают нормально.
У вас есть неправильные '' для вашего сканирования пакетов. Этот 'jersey.config.server.provider.packages' должен быть' com.sun.jersey.config.property.packages' –
@peeskillet спасибо за ваш ответ, но я не думаю, что это так, потому что, как я сказал, веб-службы отлично работают с запросами android – DjBuddy
Если ваше приложение работает с init-param (это неверно), возможно, весь ваш web.xml бесполезен. Попробуйте добавить '@ Provider' в фильтр CORS. Также есть ли исключения в журнале или все информационные журналы? –