Android-Phonegap-App 在 AJAX-请求时抛出 404
Android-Phonegap-App throws 404 on AJAX-Request
我将我的 Phonegap 4.x 应用程序更新到 Phonegap 6.4,但我的 AJAX 功能出现故障。我总是收到 404。
当然我很快就被绊倒了。
在花了几天时间尝试我在这里和其他网站上找到的所有内容后,我决定创建一个新项目并重新配置此空白中的所有内容 config.xml 并且只复制www/ 的内容。
但即便如此也无济于事。
来自同一域的嵌入图像加载正常,但我的 AJAX 请求(使用 jQuery)失败。
我做错了什么?我完全错过了什么吗?
这是我的 config.xml:
<?xml version='1.0' encoding='utf-8'?>
<widget id="..." version="..." xmlns="http://www.w3.org/ns/widgets" xmlns:gap="http://phonegap.com/ns/1.0" xmlns:android="http://schemas.android.com/apk/res/android">
<name>...</name>
<description>
...
</description>
<author email="..." href="...">
...
</author>
<content src="index.html" />
<preference name="DisallowOverscroll" value="true" />
<preference name="android-minSdkVersion" value="14" />
<plugin name="cordova-plugin-battery-status" source="npm" spec="~1.1.1" />
<plugin name="cordova-plugin-camera" source="npm" spec="~2.1.1" />
<plugin name="cordova-plugin-media-capture" source="npm" spec="~1.2.0" />
<plugin name="cordova-plugin-console" source="npm" spec="~1.0.2" />
<plugin name="cordova-plugin-contacts" source="npm" spec="~2.0.1" />
<plugin name="cordova-plugin-device" source="npm" spec="~1.1.1" />
<plugin name="cordova-plugin-device-motion" source="npm" spec="~1.2.0" />
<plugin name="cordova-plugin-device-orientation" source="npm" spec="~1.0.2" />
<plugin name="cordova-plugin-dialogs" source="npm" spec="~1.2.0" />
<plugin name="cordova-plugin-file" source="npm" spec="~4.1.1" />
<plugin name="cordova-plugin-file-transfer" source="npm" spec="~1.5.0" />
<plugin name="cordova-plugin-geolocation" source="npm" spec="~2.1.0" />
<plugin name="cordova-plugin-globalization" source="npm" spec="~1.0.3" />
<plugin name="cordova-plugin-inappbrowser" source="npm" spec="~1.3.0" />
<plugin name="cordova-plugin-media" source="npm" spec="~2.2.0" />
<plugin name="cordova-plugin-network-information" source="npm" spec="~1.2.0" />
<plugin name="cordova-plugin-splashscreen" source="npm" spec="~3.2.1" />
<plugin name="cordova-plugin-statusbar" source="npm" spec="~2.1.2" />
<plugin name="cordova-plugin-vibration" source="npm" spec="~2.1.0" />
<plugin name="cordova-plugin-whitelist" source="npm" spec="~1.2.1" />
<platform name="android">
<icon density="ldpi" src="www/res/icon/android/icon-ldpi.png" />
<icon density="mdpi" src="www/res/icon/android/icon-mdpi.png" />
<icon density="hdpi" src="www/res/icon/android/icon-hdpi.png" />
<icon density="xhdpi" src="www/res/icon/android/icon-xhdpi.png" />
<splash density="port-ldpi" src="www/res/screen/android/screen-ldpi-portrait.png" />
<splash density="port-mdpi" src="www/res/screen/android/screen-mdpi-portrait.png" />
<splash density="port-hdpi" src="www/res/screen/android/screen-hdpi-portrait.png" />
<splash density="port-xhdpi" src="www/res/screen/android/screen-xhdpi-portrait.png" />
</platform>
<access origin="*" />
<allow-navigation href="https://www.XYZ.de/*" />
<allow-intent href="http://*/*" />
<allow-intent href="https://*/*" />
<allow-intent href="tel:*" />
<allow-intent href="sms:*" />
<allow-intent href="mailto:*" />
<allow-intent href="geo:*" />
<platform name="android">
<allow-intent href="market:*" />
<allow-intent href="*" />
<allow-navigation href="*" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
</platform>
</widget>
jQuery-AJAX 请求的代码:
$.ajax( url, {
dataType: 'jsonp',
success: function(data) {
var json = data;
concerts = [];
for( var i=0; i<json.events.length; i++ ) {
var concert = json.events[i];
concerts.push( concert );
}
window.localStorage.removeItem( 'concerts' );
window.localStorage.setItem( 'concerts', JSON.stringify(concerts) );
if( concerts.length > 0 || json.events.length == 0 ) {
hideLoadingAlert();
concertsLoaded = true;
if( waitingForConcertData ) {
if( waitingForConcertData == 'buildConcertList' )
buildConcertList();
if( waitingForConcertData == 'buildFavoritesList' )
buildFavoritesList();
}
}
else {
initConcerts();
return;
}
},
error: function(xhr) {
alert(JSON.stringify(xhr));
alert(url);
setTimeout("initConcerts()", 5000);
}
} );
终于找到 "bug":
在 Android 上,WebView/App/Phonegap 似乎对 MIME 类型非常严格:
当 运行 我的应用程序在 Chrome (@Desktop) 时,我在控制台中发现了这个错误:
Refused to execute script from
'https://www.XYZ.de/api.php/json/news?callback=jQuery2100273875593823'
because its MIME type ('text/json') is not executable, and strict MIME
type checking is enabled.
当然,对于 JSONP,正确的 MIME 类型应该是 application/javascript,因为它被包装为 JavaScript 函数。
是的 - 现在它也在 Android 上工作。
我将我的 Phonegap 4.x 应用程序更新到 Phonegap 6.4,但我的 AJAX 功能出现故障。我总是收到 404。
当然我很快就被
在花了几天时间尝试我在这里和其他网站上找到的所有内容后,我决定创建一个新项目并重新配置此空白中的所有内容 config.xml 并且只复制www/ 的内容。 但即便如此也无济于事。
来自同一域的嵌入图像加载正常,但我的 AJAX 请求(使用 jQuery)失败。
我做错了什么?我完全错过了什么吗?
这是我的 config.xml:
<?xml version='1.0' encoding='utf-8'?>
<widget id="..." version="..." xmlns="http://www.w3.org/ns/widgets" xmlns:gap="http://phonegap.com/ns/1.0" xmlns:android="http://schemas.android.com/apk/res/android">
<name>...</name>
<description>
...
</description>
<author email="..." href="...">
...
</author>
<content src="index.html" />
<preference name="DisallowOverscroll" value="true" />
<preference name="android-minSdkVersion" value="14" />
<plugin name="cordova-plugin-battery-status" source="npm" spec="~1.1.1" />
<plugin name="cordova-plugin-camera" source="npm" spec="~2.1.1" />
<plugin name="cordova-plugin-media-capture" source="npm" spec="~1.2.0" />
<plugin name="cordova-plugin-console" source="npm" spec="~1.0.2" />
<plugin name="cordova-plugin-contacts" source="npm" spec="~2.0.1" />
<plugin name="cordova-plugin-device" source="npm" spec="~1.1.1" />
<plugin name="cordova-plugin-device-motion" source="npm" spec="~1.2.0" />
<plugin name="cordova-plugin-device-orientation" source="npm" spec="~1.0.2" />
<plugin name="cordova-plugin-dialogs" source="npm" spec="~1.2.0" />
<plugin name="cordova-plugin-file" source="npm" spec="~4.1.1" />
<plugin name="cordova-plugin-file-transfer" source="npm" spec="~1.5.0" />
<plugin name="cordova-plugin-geolocation" source="npm" spec="~2.1.0" />
<plugin name="cordova-plugin-globalization" source="npm" spec="~1.0.3" />
<plugin name="cordova-plugin-inappbrowser" source="npm" spec="~1.3.0" />
<plugin name="cordova-plugin-media" source="npm" spec="~2.2.0" />
<plugin name="cordova-plugin-network-information" source="npm" spec="~1.2.0" />
<plugin name="cordova-plugin-splashscreen" source="npm" spec="~3.2.1" />
<plugin name="cordova-plugin-statusbar" source="npm" spec="~2.1.2" />
<plugin name="cordova-plugin-vibration" source="npm" spec="~2.1.0" />
<plugin name="cordova-plugin-whitelist" source="npm" spec="~1.2.1" />
<platform name="android">
<icon density="ldpi" src="www/res/icon/android/icon-ldpi.png" />
<icon density="mdpi" src="www/res/icon/android/icon-mdpi.png" />
<icon density="hdpi" src="www/res/icon/android/icon-hdpi.png" />
<icon density="xhdpi" src="www/res/icon/android/icon-xhdpi.png" />
<splash density="port-ldpi" src="www/res/screen/android/screen-ldpi-portrait.png" />
<splash density="port-mdpi" src="www/res/screen/android/screen-mdpi-portrait.png" />
<splash density="port-hdpi" src="www/res/screen/android/screen-hdpi-portrait.png" />
<splash density="port-xhdpi" src="www/res/screen/android/screen-xhdpi-portrait.png" />
</platform>
<access origin="*" />
<allow-navigation href="https://www.XYZ.de/*" />
<allow-intent href="http://*/*" />
<allow-intent href="https://*/*" />
<allow-intent href="tel:*" />
<allow-intent href="sms:*" />
<allow-intent href="mailto:*" />
<allow-intent href="geo:*" />
<platform name="android">
<allow-intent href="market:*" />
<allow-intent href="*" />
<allow-navigation href="*" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
</platform>
</widget>
jQuery-AJAX 请求的代码:
$.ajax( url, {
dataType: 'jsonp',
success: function(data) {
var json = data;
concerts = [];
for( var i=0; i<json.events.length; i++ ) {
var concert = json.events[i];
concerts.push( concert );
}
window.localStorage.removeItem( 'concerts' );
window.localStorage.setItem( 'concerts', JSON.stringify(concerts) );
if( concerts.length > 0 || json.events.length == 0 ) {
hideLoadingAlert();
concertsLoaded = true;
if( waitingForConcertData ) {
if( waitingForConcertData == 'buildConcertList' )
buildConcertList();
if( waitingForConcertData == 'buildFavoritesList' )
buildFavoritesList();
}
}
else {
initConcerts();
return;
}
},
error: function(xhr) {
alert(JSON.stringify(xhr));
alert(url);
setTimeout("initConcerts()", 5000);
}
} );
终于找到 "bug":
在 Android 上,WebView/App/Phonegap 似乎对 MIME 类型非常严格:
当 运行 我的应用程序在 Chrome (@Desktop) 时,我在控制台中发现了这个错误:
Refused to execute script from 'https://www.XYZ.de/api.php/json/news?callback=jQuery2100273875593823' because its MIME type ('text/json') is not executable, and strict MIME type checking is enabled.
当然,对于 JSONP,正确的 MIME 类型应该是 application/javascript,因为它被包装为 JavaScript 函数。
是的 - 现在它也在 Android 上工作。