情况:
我正在开发一个从API接收数据的Ionic应用程序.
之前,API在http://地址上,一切正常.
然后我们将API移动到https://并且它不再起作用了.或者,它仍然可以在浏览器中访问它,但不能在手机(或模拟器)中访问它.
我不确定可能是什么问题.在控制台日志中,我看到请求的状态为0.
它可能与白名单,标题或CORS有关.我尝试了几种方法但没有效果.
白名单:
在config.xml之前有这个白名单:
<allow-navigation href="http://*/*" />
Run Code Online (Sandbox Code Playgroud)
我曾尝试以多种方式修改它,但这并没有解决问题.例如,我尝试过:
<allow-navigation href="https://*/*" />
Run Code Online (Sandbox Code Playgroud)
和
<allow-navigation href="*" />
Run Code Online (Sandbox Code Playgroud)
API请求:
这是API请求的一个示例:
$http.get( 'https://MY_DOMAIN.com/mobile/list_mobile_project/' ,{},{"headers" : {"Content-Type" : "application/x-www-form-urlencoded; charset=UTF-8" }})
.success(function(data, status, headers, config)
{
// code
}).
error(function(data, status, headers, config)
{
console.log('Error with the API list_mobile_project');
console.log(data);
console.log(status);
console.log(headers);
console.log(config);
});
Run Code Online (Sandbox Code Playgroud)
API响应:
这是API响应的一个例子:
public function list_mobile_project()
{
header('Access-Control-Allow-Origin: *');
header("Access-Control-Allow-Headers: Origin, X-Requested-With, Content-Type, Accept");
// code
echo json_encode( $project_list );
}
Run Code Online (Sandbox Code Playgroud)
问题:
如何让API在HTTPS上运行?
如果是与CORS相关的问题,如何在服务器端启用它?
好的,我已经为此寻找了.基本上我们使用$ http请求,即跨域请求.我们的服务器允许域,当请求返回200时,一切正常.但是,只要我们的服务器返回错误,500,401,无论如何,Angular认为这是一个CORS问题.
我用Fiddler调试了响应,以验证我的服务器是否返回了500个Angular阻塞.
这是请求:
var params = {
url: "fakehost/example",
method: 'GET',
headers: {
"Authorization": "Basic encodedAuthExample"
}
};
$http(params).then(
function (response) { // success
},
function (error) { // error
// error.status is always 0, never includes data error msg
});
Run Code Online (Sandbox Code Playgroud)
然后在控制台中,我会看到:
XMLHttpRequest无法加载fakehost/example.请求的资源上不存在"Access-Control-Allow-Origin"标头.因此不允许原点'mylocalhost:5750'访问.
然而,在提琴手中,真正的反应是:
HTTP/1.1 500 Internal Server Error
Cache-Control: no-cache
Pragma: no-cache
Content-Type: application/json; charset=utf-8
Expires: -1
Server: Microsoft-IIS/7.5
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET
Date: Tue, 26 Aug 2014 12:18:17 GMT
Content-Length: 5683
{"errorId":null,"errorMessage":"Index was outside the bounds of …Run Code Online (Sandbox Code Playgroud) 我们有一个 Web 应用程序,使用 ajax 调用运行在不同域上的后端(-> 需要 CORS)。后端由HAproxy 1.4.22组成和多个 Wildfly(在 OpenShift PaaS 上运行)组成。如果没有 Wildfly 可用(例如,在“维护”期间),HAproxy 会为每个请求或配置的错误文件提供 503 服务。到目前为止,一切都很好...
对于 Web 应用程序来说,根据被拒绝的后端请求(带有 503)正确可视化“维护模式”是一个问题,因为浏览器首先发送一个 OPTIONS 请求(预检)并已收到 503。这最终导致浏览器不会将此状态代码反映到 JavaScript 中执行的 ajax 调用(我们总是得到状态代码 0 作为响应,因为浏览器将其解释为预检的致命失败并拒绝任何访问)。这个故事并不新鲜,在 stackoverflow 上有很多帖子。
那么如何解决这个问题呢?我的想法是提供两个不同的错误文件(HAproxy 语言中的“错误文件”) - 一个提供内容为“HTTP/1.1 200 OK.... Access-Control-Allow-Origin: *....”的 OPTIONS 请求以传递在浏览器中进行预检,然后一个错误文件为 POST 请求提供内容“HTTP/1.1 503 .....”,让浏览器在 ajax 响应中真正反映状态 503。但是,我无法运行它。
global
maxconn 256
defaults
mode http
log global
option httplog
...
listen express 127.4.184.2:8080
acl is_options method OPTIONS
acl is_post method POST
errorfile 503 /var/lib/openshift/564468c90c1e66c7f2000077/app-root/runtime/repo/503.http if is_post …Run Code Online (Sandbox Code Playgroud)