我將數據從php api
發送到我的ios應用程序。如何在iOS中獲取JSON響應?獲得零價值?
在獲取JSON
響應時遇到問題。
這是我試圖得到答覆的代碼。
@interface CPDScatterPlotViewController()
{
NSURLConnection *conGet;
}
@end
@implementation CPDScatterPlotViewController
@synthesize responseData;
- (void)viewDidLoad
{
[super viewDidLoad];
NSLog(@"viewdidload");
self.responseData = [NSMutableData data];
NSURLRequest *request = [NSURLRequest requestWithURL:
[NSURL URLWithString:@"http://localhost/testApi/test_api.php?method=hello"]];
conGet =[[NSURLConnection alloc] initWithRequest:request delegate:self];
NSLog(@"Request sent");
NSString* responseString = [[NSString alloc] initWithData:responseData encoding: NSUTF8StringEncoding] ;
NSLog(@"Response String: %@", responseString);
NSLog(@"val : %@ ", responseData);
}
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {
NSLog(@"didReceiveResponse");
[self.responseData setLength:0];
}
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
[self.responseData appendData:data];
}
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error {
NSLog(@"didFailWithError");
NSLog([NSString stringWithFormat:@"Connection failed: %@", [error description]]);
}
- (void)connectionDidFinishLoading:(NSURLConnection *)connection {
NSLog(@"connectionDidFinishLoading");
NSLog(@"Succeeded! Received %d bytes of data",[self.responseData length]);
// convert to JSON
NSError *myError = nil;
NSDictionary *res = [NSJSONSerialization JSONObjectWithData:self.responseData options:NSJSONReadingMutableLeaves error:&myError];
// show all values
for(id key in res) {
id value = [res objectForKey:key];
NSString *keyAsString = (NSString *)key;
NSString *valueAsString = (NSString *)value;
NSLog(@"key: %@", keyAsString);
NSLog(@"value: %@", valueAsString);
}
// extract specific value...
NSArray *results = [res objectForKey:@"results"];
for (NSDictionary *result in results) {
NSString *icon = [result objectForKey:@"icon"];
NSLog(@"icon: %@", icon);
}
}
但是,當我運行這段代碼我得到了異常。
Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'data parameter is nil'
這是我的API文件
<?php>
function deliver_response($format, $api_response)
{
// Define HTTP responses
$http_response_code = array(
200 => 'OK',
400 => 'Bad Request',
401 => 'Unauthorized',
403 => 'Forbidden',
404 => 'Not Found'
);
// Set HTTP Response
header('HTTP/1.1 ' . $api_response['status'] . ' ' . $http_response_code[$api_response['status']]);
// Process different content types
if (strcasecmp($format, 'json') == 0)
{
// Set HTTP Response Content Type
header('Content-Type: application/json; charset=utf-8');
// Format data into a JSON response
$json_response = json_encode($api_response);
// Deliver formatted data
echo $json_response;
}
elseif (strcasecmp($format, 'xml') == 0)
{
// Set HTTP Response Content Type
header('Content-Type: application/xml; charset=utf-8');
// Format data into an XML response (This is only good at handling string data, not arrays)
$xml_response = '<?xml version="1.0" encoding="UTF-8"?>' . "\n" .
'<response>' . "\n" .
"\t" . '<code>' . $api_response['code'] . '</code>' . "\n" .
"\t" . '<data>' . $api_response['data'] . '</data>' . "\n" .
'</response>';
// Deliver formatted data
echo $xml_response;
}
else
{
// Set HTTP Response Content Type (This is only good at handling string data, not arrays)
header('Content-Type: text/html; charset=utf-8');
// Deliver formatted data
echo $api_response['data'];
}
// End script process
exit;
}
//////////My SQL Connection
// Create connection
$con = mysqli_connect("", "root", "", "test_db");
// Check connection
if (mysqli_connect_errno($con))
{
echo "Failed to connect to MySQL: " . mysqli_connect_error();
}
$result = mysqli_query($con, "SELECT count(*) FROM test_table");
//$count = $result->num_rows;
// Define whether an HTTPS connection is required
$HTTPS_required = FALSE;
// Define whether user authentication is required
$authentication_required = FALSE;
// Define API response codes and their related HTTP response
$api_response_code = array(
0 => array('HTTP Response' => 400, 'Message' => 'Unknown Error'),
1 => array('HTTP Response' => 200, 'Message' => 'Success'),
2 => array('HTTP Response' => 403, 'Message' => 'HTTPS Required'),
3 => array('HTTP Response' => 401, 'Message' => 'Authentication Required'),
4 => array('HTTP Response' => 401, 'Message' => 'Authentication Failed'),
5 => array('HTTP Response' => 404, 'Message' => 'Invalid Request'),
6 => array('HTTP Response' => 400, 'Message' => 'Invalid Response Format')
);
// Set default HTTP response of 'ok'
$response['code'] = 0;
$response['status'] = 404;
$response['data'] = NULL;
// --- Step 2: Authorization
// Optionally require connections to be made via HTTPS
if ($HTTPS_required && $_SERVER['HTTPS'] != 'on')
{
$response['code'] = 2;
$response['status'] = $api_response_code[$response['code']]['HTTP Response'];
$response['data'] = $api_response_code[$response['code']]['Message'];
// Return Response to browser. This will exit the script.
deliver_response($_GET['format'], $response);
}
// Optionally require user authentication
if ($authentication_required)
{
if (empty($_POST['username']) || empty($_POST['password']))
{
$response['code'] = 3;
$response['status'] = $api_response_code[$response['code']]['HTTP Response'];
$response['data'] = $api_response_code[$response['code']]['Message'];
}
// Return an error response if user fails authentication. This is a very simplistic example
// that should be modified for security in a production environment
elseif ($_POST['username'] != 'foo' && $_POST['password'] != 'bar')
{
$response['code'] = 4;
$response['status'] = $api_response_code[$response['code']]['HTTP Response'];
$response['data'] = $api_response_code[$response['code']]['Message'];
}
}
// --- Step 3: Process Request
// Method A: Say Hello to the API
//$_GET['method'] = 'hello';
if (strcasecmp($_GET['method'], 'hello') == 0)
{
$response['code'] = 1;
$response['status'] = $api_response_code[$response['code']]['HTTP Response'];
$row = $result->fetch_row();
// echo $row[0];
$response['data'] = $row[0];
}
// --- Step 4: Deliver Response
// Return Response to browser
deliver_response("json", $response);
?>
如果我運行這個API它顯示網頁上的記錄是8346.