我正在维护一个使用旧版AngularJs的项目。我从一开始就没有工作,所以我不能改变它。
问题是:当我使用$ resource访问PHP脚本时,它忽略了一些字符(比如“#”或“\”),所以我认为这是一些urlenconding问题(不确定它) )。请参阅以下代码。
报告/ report.html
<table class="table table-condensed table-bordered table-hover">
<thead>
<tr>
<th>Code</th>
<th>Date</th>
<th>Company</th>
<th>Action</th>
</tr>
</thead>
<tbody>
<tr data-ng-repeat="info in searchResult as results">
<td>{{info.code}}</td>
<td>{{info.date}}</td>
<td>{{info.company_name}}</td>
<td class="col-sm-2">
<button data-ng-click="cancel(info.code,info.password)" data-ng-show="!info.canceled" class="form-control btn-danger">Cancel</button>
</td>
</tr>
</tbody>
报告/ controllers.js
define(['reports/module'], function (app) {
'use strict';
app.controller('reports', function ($scope, $http, $timeout, cancelService,loading, modal) {
$scope.cancel = function(code, password) {
$scope.confirm.code = code;
$scope.confirm.password = password;
cancelService.query($scope.confirm, function(return) {
if(return.status) {
alert(return.msg);
$scope.searchResult = [];
}
});
};
});
});
报告/ services.js
define(['reports/module', 'ngResource'], function (app) {
'use strict';
app.factory('cancelService', function($resource){
return $resource('api/reports/cancel-online/reservationno/:code/password/:password',{},{'query' : {'isArray': false}});
});
});
PHP脚本(api / reports / ReportsAPI.class.php)
class ReportsAPI extends Controller {
//This is a internal method that expects a GET Request using a defined URL
$restfull = new Restful();
$restfull->server('GET','api/reports/cancel-online/reservationno/:code/password/:password', function($code, $pass) {
//do stuff
//I'm facing the problem here
}
}
当我使用密码“123#123”作为示例并调试我的PHP时,var $pass
的值为“123”并且会破坏我的代码。在调用服务之前执行console.log($scope.confirm.password)
,我得到了正确的结果,所以看起来像URLenconding有问题。
我尝试了其他一些我在SO(1,2)中找到的方法但没有成功,我也发现这个issue in GitHub建议改变角度文件,但我没有尝试一下,因为我不知道它将影响哪些软件和平
我该如何解决这个问题?
注意:“密码”只是有问题的var名称,并不是真正的密码,所以在javascript中保持打开或通过GET发送它没有问题。
以下是版本:
答案 0 :(得分:1)
您需要对变量password
中的特殊字符进行编码,这可以使用encodeURIComponent()
encodeURIComponent()
方法通过将某些字符的每个实例替换为表示字符的UTF-8编码的一个,两个,三个或四个转义序列来编码统一资源标识符(URI)组件(仅将是由两个“代理”字符组成的字符的四个转义序列。
$scope.confirm.password = encodeURIComponent(password);