2015-06-08 2 views
1

Я разрабатываю приложение 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), и они работают нормально.

+0

У вас есть неправильные '' для вашего сканирования пакетов. Этот 'jersey.config.server.provider.packages' должен быть' com.sun.jersey.config.property.packages' –

+0

@peeskillet спасибо за ваш ответ, но я не думаю, что это так, потому что, как я сказал, веб-службы отлично работают с запросами android – DjBuddy

+0

Если ваше приложение работает с init-param (это неверно), возможно, весь ваш web.xml бесполезен. Попробуйте добавить '@ Provider' в фильтр CORS. Также есть ли исключения в журнале или все информационные журналы? –

ответ

-1

Для перекрестного домена вам нужно использовать JSONP вместо JSON в качестве типа. Убедитесь, что это поддерживается как серверный код.

Изменить

dataType:'json', 

в

dataType: 'jsonp' 

См здесь разницу Difference between dataType jsonp and JSON

+0

Я сделал это раньше, а не решение – DjBuddy

0

Я решил эту проблему с помощью библиотеки для КОРПУСА. больше на dzhuvinov, такая же проблема как мой here.

Проблема решена, но я не знаю, почему, и действительно хочу узнать (ищет ее), если кто-нибудь знает, пожалуйста, комментарий.