3

フォンギャップクルー、

Android を使用して Web サービスにアクセスする際に問題があります。iOSを使用してアクセスしても問題ありません。同封のコードはパブリック Web サービスを使用しているため、必要に応じてコードを試すことができます。

iOS では、xmlhttp.status == 200 を取得し、データを返します。Android では、xmlhttp.status == 0 を取得します。

cordova-1.8.1.jar を使用しています

次のように res/xml/cordova.xml に設定されたホワイト リストがあります。

<access origin=".*"/>

ホワイトリストが機能していないのではないかと疑っているので、これを取り上げます。

コードは次のとおりです。

function testweather(){
   var xhr= new XMLHttpRequest();
   xhr.onreadystatechange = function(){

      alert(xhr.readyState);
      if(xhr.readyState == 4){
         if(xhr.status == 200){
            $( "#result" ).append( xhr.responseText );
         }
         else{
            alert("can't get response. a.status:"+xhr.status);
         }
      }
   }

var url = "http://graphical.weather.gov/xml/SOAP_server/ndfdXMLserver.php";
xhr.open("POST", url,true);
xhr.setRequestHeader("SOAPAction",   "http://graphical.weather.gov/xml/DWMLgen/wsdl/ndfdXML.wsdl#NDFDgenByDayLatLonList");
xhr.setRequestHeader("Content-Type", "text/xml;charset=UTF-8");
xhr.setRequestHeader("Content-Length", 1536);
xhr.setRequestHeader("Access-Control-Allow-Origin", "*");
xhr.setRequestHeader("Accept", "application/soap+xml, application/dime, multipart/related, text/*");
xhr.setRequestHeader("User-Agent", "IBM Web Services Explorer");
xhr.setRequestHeader("Cache-Control", "no-cache");
xhr.setRequestHeader("Pragma", "no-cache");
xhr.setRequestHeader("Connection", "close");
var soapEnv = '' +
    '<soapenv:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ndf="http://graphical.weather.gov/xml/DWMLgen/wsdl/ndfdXML.wsdl">' +
    '   <soapenv:Header/>' +
    '   <soapenv:Body>' +
    '      <ndf:NDFDgenByDayLatLonList soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">' +
    '         <listLatLon xsi:type="dwml:listLatLonType" xmlns:dwml="http://graphical.weather.gov/xml/DWMLgen/schema/DWML.xsd">35.4,-97.6</listLatLon>' +
    '         <startDate xsi:type="xsd:date">2012-06-27</startDate>' +
    '         <numDays xsi:type="xsd:integer">3</numDays>' +
    '         <Unit xsi:type="dwml:unitType" xmlns:dwml="http://graphical.weather.gov/xml/DWMLgen/schema/DWML.xsd">e</Unit>' +
    '         <format xsi:type="dwml:formatType" xmlns:dwml="http://graphical.weather.gov/xml/DWMLgen/schema/DWML.xsd">24 hourly</format>' +
    '      </ndf:NDFDgenByDayLatLonList>' +
    '   </soapenv:Body>' +
    '</soapenv:Envelope>';

xhr.send( soapEnv );

}
4

3 に答える 3

5

ファイル プロトコルから AJAX リクエストを実行すると、ステータスが 0 になることがありますが、実際には 200 になります。

if(xhr.status == 200 || xhr.status == 0)

そして、あなたは行く準備ができているはずです。

これは、PhoneGap の AJAX の使用について書いたブログ投稿です。

http://simonmacdonald.blogspot.com/2011/12/on-third-day-of-phonegapping-getting.html

更新: Android 2.x には、「Content-length」ヘッダーを設定すると、説明した問題が発生するバグがあるようです。Android 4.0.3 でバグが修正されたようです。したがって、このコードを変更せずに 4.0.3 エミュレーターで試してください。動作するはずです。その後、2.x に戻って Content-length ヘッダーを削除し、同様に動作するかどうかを確認してください。

于 2012-06-27T18:50:27.777 に答える
-1

super.onCreate(savedInstanceState); の後に src > com.domain.appname > appname.java に以下のコードを追加してみてください。

if (android.os.Build.VERSION.SDK_INT > 9) {
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
}
于 2014-06-09T07:37:04.800 に答える