2012-04-16 3 views
19

Android 용 PhoneGap 앱을 만들고 있습니다. (원격) 서버에서 데이터를 얻으려면 jQuery의 $ .ajax() 함수를 사용하여 REST 호출을 작성한다. 몇 가지 당신이 알고 있어야합니다 있습니다 : 서버가 예상 통화PhoneGap 및 jQuery를 사용한 도메인 간 요청이 작동하지 않습니다.

  • 유형
  • POST
  • 해야합니다 JSON 데이터 (적어도 사용자 이름 및 암호)
  • 서버가 다시 보냅니다 JSON 데이터

코드 :

function makeCall(){ 
    var url = "http://remote/server/rest/call"; 

    var jsonData ='{"username":"'+$('#username').val()+'","password":"'+$('#password').val()+'"}'; 

    $.ajax({ 
      headers: {"Content-Type":"application/json; charset=UTF-8"}, 
      type: "POST", 
      url: url, 
      data: jsonData, 
      dataType: "json", 
      success: succesFunction, 
      error: errorFunction 
    }); 
} 

그러나,이 작동하지 않습니다. Firebug를 사용하여 서버 응답을 볼 때 아무 것도 없습니다. TcpTrace를 사용하면 요청의 헤더를 볼 수 있습니다. 예상되는 POST 메서드 대신 OPTIONS 메서드가 있으며 일부 이상한 헤더가 추가되었습니다.

OPTIONS /remote/server/rest/call HTTP/1.1 
Host: localhost:8081 
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:11.0) Gecko/20100101 Firefox/11.0 
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 
Accept-Language: nl,en-us;q=0.7,en;q=0.3 
Accept-Encoding: gzip, deflate 
Connection: keep-alive 
Origin: null 
Access-Control-Request-Method: POST 
Access-Control-Request-Headers: content-type 
Pragma: no-cache 
Cache-Control: no-cache 

도메인 간 요청과 관련이 있다는 것을 알고 있지만 문제를 해결하는 방법을 모르겠습니다. 나는 그것을 해결하기 위해 몇 가지를 시도하지만 결과 :

를 사용하는 동일한 오리진 정책을 가지고 있지만, 이것은 PhoneHap이 로컬 html 파일을로드하는 데 사용하는 // file : // 프로토콜에는 적용되지 않습니다. 내의 AndroidManifest.xml 파일에서

,

<uses-permission android:name="android.permission.INTERNET" /> 

를 설정하는 옵션.

지금 2 일 동안이 문제를 해결하려고하지만 지금까지 결과가 없습니다. 이것도 가능합니까? 계속 나아갈 수 있도록 나를위한 조언이 있습니까?

미리 감사드립니다.

답변

8

저는 혼자서 문제를 해결했습니다. 문제는 url에 있으며 도메인을 추가해야합니다.나는

var url = "http://remote.mydomain.com/server/rest/call";

에게

var url = "http://remote/server/rest/call";

변경하고 그것을 작동합니다!

정확히 같은 URL과 설정으로 아이폰 앱에서 작동하기 때문에 첫 번째 URL이 작동한다고 가정했습니다. 또한 Windows 방화벽을 종료하는 이중 방화벽 (Windows 및 ESET 방화벽)과 관련이 있습니다.

어쨌든 답해 주셔서 감사합니다.

+0

문제가 해결되었을 수도 있지만 이것이 도메인 간 요청 문제를 해결하는 해답이 아닙니다. – Asqan

0

dataType:jsonp으로 설정하고 crossDomain:true 을 설정하십시오. 교차 도메인 아약스 요청의 경우 jsonp를 사용할 수 있습니다. http://api.jquery.com/jQuery.ajax/

또는 콜백 =을 추가 할 수 있습니까? 귀하의 url.

+0

나는 당신이 제안한 것을 이미 시도했지만 작동하지 않습니다. 여전히 같은 문제. 귀하의 답변에 감사드립니다. – weerd2

+2

JSONP는 교차 도메인 POST를 대체하지 않습니다. – contactmatt

10

외부 도메인을 허용해야합니다. xcode의 phonegap/cordova plist 파일로 이동하여 새 항목을 추가하고 * 값을 설정하면 모든 웹 사이트에 액세스 할 수 있습니다.

도 브라우저에서 작동하지 않는다는 것을 알고 있습니다. 브라우저에는 휴대 전화 또는 휴대 기기가 아닌 교차 도메인 문제가 있습니다.

+1

실제로 ... 'file : //'을 통해로드하면 Safari에서 작동하지만 Chrome 및 FF는 아무런 문제가 없습니다 ... – Devgeeks

+7

작업 할 수 있습니다 크롬은 웹 보안을 사용 중지합니다. in Windows 실행>'chrome --disable-web-security' Mac OS에서> sudo/응용 프로그램/Google \ Chrome.app/Contents/MacOS/Google \ Chrome --disable-web-security --enable-geolocation ' – Peter

+0

반응 친구들을 보내 주셔서 감사합니다.하지만 여전히 작동하지 않습니다. 요청이 완료되면 오류 기능이 여전히 실행됩니다. 서버 설정과 관련이 있다고 생각합니다. 나는 지금 그것을 살펴보고 당신을 최신 상태로 유지할 것입니다! – weerd2

1

JQuery 설정 : $ .support.cors = true; config.xml 파일이 추가

3

도지도와 내 원격 디버깅 도구를 구글, 나에게 내가 어떤 외부 자원이로드되지 않은 이유에 당황했다

<gap:plugin name="com.indigoway.cordova.whitelist.whitelistplugin" version="1.1.1" /> 
<access origin="*" /> 
<allow-navigation href="*" /> 
<allow-intent href="*" /> 

을 저장. 이것은 나를 구원했다!

+0

정말 도움이되었습니다. – Schiavini

관련 문제