2013-10-09 153 views
1

我將數據從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.

回答

2

做出這些改變的代碼。

- (void)connectionDidFinishLoading:(NSURLConnection *)connection { 
     NSLog(@"connectionDidFinishLoading"); 
     NSLog(@"Succeeded! Received %d bytes of data",[self.responseData length]); 
     NSString *strr = [[NSString alloc] initWithData:self.responseData encoding:NSUTF8StringEncoding]; 
     NSLog(@"data is: %@",self.responseData); 

    //NSDictionary *dict = [[NSDictionary alloc] initwithd] 


    // convert to JSON 

    NSError *e = nil; 
    NSArray *jsonArray = [NSJSONSerialization JSONObjectWithData: _responseData options:NSJSONReadingMutableContainers error:&e]; 

    NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:self.responseData options:NSJSONReadingMutableLeaves error:nil]; 
    NSLog(@"data -- %@",[dict objectForKey:@"data"]); 
    if (!jsonArray) { 
     NSLog(@"Error parsing JSON: %@", e); 
    } 
0

在我的情況,我有使用此

NSString* urlString=[NSString stringWithFormat:@「%@「,myURLwithKeyAndValue]; 
    urlString = [urlString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; 


    NSData * results = [NSData dataWithContentsOfURL:[NSURL URLWithString:urlString]]; 

    NSLog(@"Result = %@",results); 

    if (results) 
    { 

     messageDataDict = [NSJSONSerialization JSONObjectWithData: results options: NSJSONReadingMutableContainers error: nil]; 

    }