簡體   English   中英

PHP REST服務從AFNetworking 2.0接收POST時出現JSON格式問題

[英]JSON format issue in PHP REST service receiving POST from AFNetworking 2.0

我遇到的情況是,我使用AFNetworking 2.0代碼從iOS代碼中發布了JSON字符串。 我的客戶代碼如下:

NSURL *url = [NSURL URLWithString:BaseURLString];
NSString *jsonString = [[NSString alloc] initWithData:jsonPayloadForProject encoding:NSUTF8StringEncoding];

NSDictionary *parameters = @{@"project": jsonString};

AFHTTPSessionManager *manager = [[AFHTTPSessionManager alloc]       initWithBaseURL:url];
manager.requestSerializer = [AFJSONRequestSerializer serializer];
manager.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"text/html"];

[manager POST:@"service.php" parameters:parameters success:^(NSURLSessionDataTask *task, id responseObject) {
    NSLog(@"%@", [responseObject description]);
} failure:^(NSURLSessionDataTask *task, NSError *error) {
    UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"POST JSON for Project Error"
                                                        message:[error localizedDescription]
                                                       delegate:nil
                                              cancelButtonTitle:@"OK"
                                              otherButtonTitles:nil];
    [alertView show];
}];

JSON如下所示:

{
  "Maps" : [
    {
      "Markers" : [
        {
          "marker_tag" : -790386438,
          "location_y" : 182,
          "location_x" : 344
        },
        {
          "marker_tag" : 451496476,
          "location_y" : 267,
          "location_x" : 150.5
        }
      ],
      "image_string" : "EC817509-DE49-4914-840E-5E407571F6AE.jpeg",
      "order_num" : 0,
      "name" : "Blah1",
      "id" : "EC817509-DE49-4914-840E-5E407571F6AE"
    },
    {
      "Markers" : [
        {
          "marker_tag" : -79601351,
          "location_y" : 377,
          "location_x" : 486.5,
          "image_id" : "Blah2",
          "map_id" : "146C1C09-5AE0-4E4C-83C8-B7EAA8F28A9A"
        }
      ],
      "image_string" : "146C1C09-5AE0-4E4C-83C8-B7EAA8F28A9A.jpeg",
      "order_num" : 0,
      "name" : "1st floor",
      "id" : "146C1C09-5AE0-4E4C-83C8-B7EAA8F28A9A"
    }
  ],
  "longitude" : "-222.222222",
  "latitude" : "33.33333"
}

當我使用php代碼讀取服務器上的JSON字符串時

$json_str = file_get_contents('php://input');

當我這樣做時,我得到以下字符串:

{ "project" = '{ \n \"Maps\" : [ \n { \n \"Markers\" : [ \n { \n \"marker_tag\n : = -790386438, \n ....

我的問題是,當我執行以下操作時,我一無所獲。

$array_str = json_decode($json_str, true);

將其放入數組以解析數據的最佳方法是什么? 如何獲取我從客戶端發送的原始JSON字符串?

幾個問題

  1. 您的AFHTTPSessionManager使用默認的AFJSONResponseSerializer但僅覆蓋acceptableContentTypes 僅當服務器代碼確實返回JSON並且未能在Content-Type標頭中指定時,才需要這樣做。

    • 如果服務器確實不返回JSON,而不是更改acceptableContentTypes ,則應僅使用AFHTTPSessionManager

       manager.responseSerializer = [AFHTTPResponseSerializer serializer]; 
    • 或讓服務器返回JSON並確保它指定了正確的Content-Type標頭:

       <?php $json_str = file_get_contents('php://input'); $json = json_decode($json_str, true); header('Content-Type: application/json'); $result = array("received" => $json); echo json_encode($result); ?> 

      完成此操作后,我現在可以簡單地從客戶端代碼中完全刪除acceptableContentTypes行,並繼續使用默認的AFJSONResponseSerializer

  2. 演示的構建parameters機制不正確。 您正在創建一個其中僅包含一項的JSON字典,該字典本身就是JSON的字符串表示形式。

    我建議您不要將實際的字典放入字典中,而不要在字典中放入字符串表示形式。 因此,如果您確實有JSON的NSData ,請將其轉換回嵌套的NSDictionary / NSArray結構:

     NSError *error; id jsonPayload = [NSJSONSerialization JSONObjectWithData:jsonPayloadData options:0 error:&error]; NSAssert(jsonPayload, @"json parsing error: %@", error); NSDictionary *parameters = @{@"project": jsonPayload}; 

    現在,最有可能的是,使用dataWithJSONObject創建NSData ,只是將其轉回並提取出來,這有點愚蠢,但是您只需要在parameters使用原始的NSDictionary ,但是希望這可以說明這一點。

因此,將所有這些放在一起,假設您更改了服務器代碼以返回正確格式化的JSON響應,如上所述,客戶端代碼現在變為:

NSError *error;
id jsonPayload = [NSJSONSerialization JSONObjectWithData:jsonPayloadData options:0 error:&error];
NSAssert(jsonPayload, @"json parsing error: %@", error);

NSDictionary *parameters = @{@"project": jsonPayload};

AFHTTPSessionManager *manager = [[AFHTTPSessionManager alloc] initWithBaseURL:url];
manager.requestSerializer = [AFJSONRequestSerializer serializer];
// manager.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"text/html"];

[manager POST:@"service.php" parameters:parameters success:^(NSURLSessionDataTask *task, id responseObject) {
    NSLog(@"%@", [responseObject description]);
} failure:^(NSURLSessionDataTask *task, NSError *error) {
    NSLog(@"error=%@", error);
}];

如果這樣做,您將成功將JSON請求發送到服務器,它將被解析,插入到新的關聯數組中,轉換回JSON並返回到客戶端應用程序,后者將使用默認的AFJSONResponseSerializer進行解析和記錄它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM