【发布时间】:2014-10-30 10:00:01
【问题描述】:
我在制作 PHP API 以从 MYSQL 获取数据并解析 JSON 时遇到问题。我有一个演示应用程序 (hiApp),并在一个文件夹中附带了一些 JSON 文件。
演示JSON文件是这样的:
{ "err_code": 0, "err_msg": "success", "data": [{"nickname":"Joao","location":"I.13"},{"nickname":"Victor","location":"2811"}]}
这是我的 contacts.php 返回的内容:
[{"nickname":"Joao","location":"I.13"},{"nickname":"Victor","location":"2811"}]
我的 contacts.php api 如下所示: …
…
$result = mysql_query("select * from sellers", $db);
$json_response = array();
while ($row = mysql_fetch_array($result, MYSQL_ASSOC)) {
$row_array['nickname'] = $row['first_name'];
$row_array['location'] = $row['territory'];
array_push($json_response,$row_array);
}
echo json_encode($json_response);
?>
解析JSON的js文件,如下所示:
define(['utils/appFunc',
'i18n!nls/lang',
'components/networkStatus'],function(appFunc,i18n,networkStatus) {
//var apiServerHost = window.location.href;
var xhr = {
search: function(code, array){
for (var i=0;i< array.length; i++){
if (array[i].code === code) {
return array[i];
}
}
return false;
},
getRequestURL: function(options){
//var host = apiServerHost || window.location.host;
//var port = options.port || window.location.port;
var query = options.query || {};
var func = options.func || '';
var apiServer = 'api/' + func + '.php' +
(appFunc.isEmpty(query) ? '' : '?');
var name;
for (name in query) {
apiServer += name + '=' + query[name] + '&';
}
return apiServer.replace(/&$/gi, '');
},
simpleCall: function(options,callback){
options = options || {};
options.data = options.data ? options.data : '';
//If you access your server api ,please user `post` method.
//options.method = options.method || 'GET';
options.method = options.method || 'POST';
if(appFunc.isPhonegap()){
//Check network connection
var network = networkStatus.checkConnection();
if(network === 'NoNetwork'){
hiApp.alert(i18n.error.no_network,function(){
hiApp.hideIndicator();
hiApp.hidePreloader();
});
return false;
}
}
$$.ajax({
url: xhr.getRequestURL(options) ,
method: options.method,
data: options.data,
success:function(data){
data = data ? JSON.parse(data) : '';
var codes = [
{code:10000, message:'Your session is invalid, please login again',path:'/'},
{code:10001, message:'Unknown error,please login again',path:'tpl/login.html'},
{code:20001, message:'User name or password does not match',path:'/'}
];
var codeLevel = xhr.search(data.err_code,codes);
if(!codeLevel){
(typeof(callback) === 'function') ? callback(data) : '';
}else{
hiApp.alert(codeLevel.message,function(){
if(codeLevel.path !== '/')
mainView.loadPage(codeLevel.path);
hiApp.hideIndicator();
hiApp.hidePreloader();
});
}
}
});
}
};
return xhr;
});
我知道错误在于contacts.php 显示JSON 结果的方式,或者我需要更改js 文件中的某些内容。
感谢您的帮助。
【问题讨论】:
-
您能否详细说明您遇到问题的地方?您说 PHP 返回正确的 JSON 字符串,所以我怀疑您无法在 JS 中读取 JSON 响应?
-
是的,没错,我需要在JS文件中更改一些东西,但是我看不到它是什么。最初的 json 也返回了这个
{ "err_code": 0, "err_msg": "success", "data":,我必须让 JS 文件在没有这个的情况下工作。 -
data,在JSON.parse(data)之后,看起来正确,包含一个对象数组。我认为您应该能够直接调用callback(data),确保更改其行为,因为那时数据将不再包含err_code、err_msg、data属性。您没有发布回调,因此我无法为您提供可能的完整代码解决方案。 -
这是
loadContacts: function() { if(VM.module('contactView').beforeLoadContacts()) { xhr.simpleCall({ query: { callback: '?' }, func: 'contacts' }, function (response) { if (response.err_code === 0) { VM.module('contactView').render({ contacts: response.data }); } }); } } -
我在下面发布了一个可能的答案。
标签: javascript php ajax json api