iOS:在 PHP 服务文件中使用 return 而不是 echo 时出现 JSON 解析错误

Posted

技术标签:

【中文标题】iOS:在 PHP 服务文件中使用 return 而不是 echo 时出现 JSON 解析错误【英文标题】:iOS: JSON pars error when using return instead of echo in PHP service file 【发布时间】:2015-01-28 13:59:05 【问题描述】:

我通过AFNetworking 关注HTTP 请求:

NSMutableDictionary *dictionary = [NSMutableDictionary new];
[dictionary setObject:@"login" forKey:@"request"];
[dictionary setObject:@"q" forKey:@"userName"];
[dictionary setObject:@"q" forKey:@"password"];

DDLogDebug(@"LoginView - login - Dictionary: %@", [dictionary description]);

AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
[manager setRequestSerializer:[AFJSONRequestSerializer serializer]];
[manager setResponseSerializer:[AFJSONResponseSerializer serializer]];
//[manager.securityPolicy setAllowInvalidCertificates:true];

AFHTTPRequestOperation *operation =
[manager POST:WEB_SERVICE_URL
   parameters:dictionary
      success:^(AFHTTPRequestOperation *operation, id responseObject) 

          dispatch_async(dispatch_get_main_queue(), ^
              DDLogDebug(@"LoginView - Success Response: %@", responseObject);
              NSString *success = [responseObject objectForKey:@"success"];

              if ([success isEqualToString:@"1"]) 
                  DDLogDebug(@"LoginView - Login successful!");
                  [self performSegueWithIdentifier:kSegueLoginToTimeLine sender:self];
              
              else 
                  DDLogError(@"LoginView - Login failed!");
                  [HMXCommonMethods showMessage:@"Kullanıcı adı ya da şifre hatalı" withTitle:@"Hata!"];
              
          );
      

      failure:^(AFHTTPRequestOperation *operation, NSError *error) 

          dispatch_async(dispatch_get_main_queue(), ^
              DDLogError(@"LoginView - Error Response: %@", [error localizedDescription]);

              NSInteger statusCode = [operation.response statusCode];

              switch (statusCode) 
                  case 500:
                      [HMXCommonMethods showMessage:@"Sunucu hatası nedeniyle giriş yapılamadı!" withTitle:@"Hata!"];
                      break;
                  case 408:
                      [HMXCommonMethods showMessage:@"İstek zaman aşımına uğradı!" withTitle:@"Hata!"];
                      break;
                  case 404:
                      [HMXCommonMethods showMessage:@"Sunucuya erişilemedi!" withTitle:@"Hata!"];
                      break;
                  default:
                      [HMXCommonMethods showMessage:@"Sunucu hatası nedeniyle giriş yapılamadı!" withTitle:@"Hata!"];
                      break;
              
          );
      ];

[operation start];
DDLogError(@"LoginView - login - request started.");

当我在 php 文件中使用以下 echo 代码响应此请求时,它可以正常工作:

$response = "\"success\":\"1\",";
$response = $response . "\"id\":\"" . $id . "\",";
$response = $response . "\"companyid\":\"" . $cid . "\",";
$response = $response . "\"companyname\":\"" . $cname . "\",";
$response = $response . "\"name\":\"" . $name . "\",";
$response = $response . "\"surname\":\"" . $surname . "\",";
$response = $response . "\"email\":\"" . $email2 . "\",";
$response = $response . "\"password\":\"" . $password2 . "\"";
$stmt2->close();

$log = "Company ID = " . $cid . "\n" .
       "Company Name = " . $cname . "\n" .
       "Company Address = " . $caddress . "\n" .
       "Company Phone = " . $cphone . "\n" .
       "Company Web Page = " . $cwebpage . "\n";

$this->logger->debug("GetUser: Company Info:\n" . $log);
$this->logger->debug("GetUser: Response:\n" . $response);

echo $response;

如果我将echo 更改为return,我会得到JSON pars error 3840。我也试过了

echo json_encode($response)
return json_encode($response)

但它不起作用,我得到了同样的错误。如何在没有JSON 错误的情况下使用return

【问题讨论】:

为了让它工作,你必须回显一些东西以通过 AJAX 请求发回,return 不会输出 AJAX 请求可以读取的东西。你到底为什么要对 JSON 进行硬编码? @jay-blanchard 因为我只知道这种方式:) 你的建议是什么?真正的方法是什么?构建一个关联数组并回显可能吗? 不,使用 PHP 的 json_encode()json_decode() 除了echo之外,还有更正式的方式来响应Ajax请求吗? 不,你必须回应。 【参考方案1】:

为了让 AJAX 能够从 PHP 读取输出,PHP 必须回显响应。如果您使用return,AJAX 将无法读取和使用数据,因为它希望接收以下几种类似文本的数据类型之一:XML、html、脚本、JSON、JSONP 或纯文本。 return 不提供。

此外,您不应手动形成 JSON 字符串,因为这可能是一件复杂的事情,可能会出现许多语法错误。利用 PHP 的 JSON 函数 - json_encode()json_decode()

【讨论】:

以上是关于iOS:在 PHP 服务文件中使用 return 而不是 echo 时出现 JSON 解析错误的主要内容,如果未能解决你的问题,请参考以下文章

如何从另一个 php 文件中使用 PostgreSql 的 CURRVAL / RETURNING?

[使用.p8文件在php中发送iOS推送通知

iOS 到 php 服务器文件上传 - 我应该允许啥文件大小的图像?

PHP:exit()、die() 和 return 有啥区别;在“自我”和包含的文件中?

从android设备上传php服务器中的文件

[PHP]利用XAMPP搭建本地服务器, 然后利用iOS客户端上传数据到本地服务器中(三. PHP端代码实现)