[iOS] Análisis de datos JSON y solicitud de datos de red simple


prefacio

Recientemente terminé la última tarea de las vacaciones de verano: el pronóstico del tiempo, en el que se utilizan solicitudes de datos de red simples y análisis de datos json, por la presente registramos el resumen del blog.

1. Análisis de datos JSON

JSON es un formato de datos liviano, generalmente utilizado para la interacción de datos. En la actualidad, JSON se utiliza ampliamente y la mayoría de las solicitudes de red están en formato JSON.
Por ejemplo:

{
  "code": "200",
  "updateTime": "2021-11-15T16:35+08:00",
  "fxLink": "http://hfx.link/2ax1",
  "daily": [
    {
      "fxDate": "2021-11-15",
      "sunrise": "06:58",
      "sunset": "16:59",
      "moonrise": "15:16",
      "moonset": "03:40",
      "moonPhase": "盈凸月",
      "moonPhaseIcon": "803",
      "tempMax": "12",
      "tempMin": "-1",
      "iconDay": "101",
      "textDay": "多云",
      "iconNight": "150",
      "textNight": "晴",
    },
    {
      "fxDate": "2021-11-16",
      "sunrise": "07:00",
      "sunset": "16:58",
      "moonrise": "15:38",
      "moonset": "04:40",
      "moonPhase": "盈凸月",
      "moonPhaseIcon": "803",
      "tempMax": "13",
      "tempMin": "0",
      "iconDay": "100",
      "textDay": "晴",
      "iconNight": "101",
      "textNight": "多云",
    }
  ],
  "refer": {
    "sources": [
      "QWeather",
      "NMC",
      "ECMWF"
    ],
    "license": [
      "QWeather Developers License"
    ]
  }
}

Estos son los datos json que solicitamos usando la API y los explicaremos a continuación.


El formato de JSON es muy similar a los diccionarios y matrices en Objective-C. Las claves del formato JSON estándar deben estar entre comillas dobles. Al igual que el código de los datos anteriores, updateTime es la clave en el diccionario. Usamos un gráfico para explicar nuestros datos json:
inserte la descripción de la imagen aquí
Por ejemplo, en los datos json anteriores, diario es equivalente a nuestro NSArray, y el tipo de cada elemento en la matriz es NSDictionary (diccionario).
Después de determinar el tipo de cada dato en los datos json, tenemos que obtener los datos correspondientes.Cómo obtenerlo se explicará a continuación después de explicar la solicitud simple de datos de red.Aquí solo necesitamos conocer el tipo de datos correspondiente a los datos json en OC

2. Solicitud de datos de red simple

Antes de aprender sobre las solicitudes de datos de la red, debemos comprender dos conceptos: URL y API.

Existe una estrecha relación entre API (Interfaz de programación de aplicaciones) y URL (Localizador uniforme de recursos) , pero representan conceptos diferentes.

Una URL es una dirección utilizada para localizar un recurso en la red y describe la ubicación y el método de acceso del recurso. En la Web, las URL se utilizan habitualmente para identificar y localizar páginas web, imágenes, vídeos u otros archivos. Una URL estándar normalmente consta de un protocolo (como HTTP o HTTPS), un nombre de host (como www.example.com), un número de puerto opcional, una ruta de archivo y parámetros de consulta. Por ejemplo: https://www.example.com/api/get_data.

Una API es un conjunto de reglas y protocolos prescritos para la comunicación e interacción entre diferentes aplicaciones de software. API define cómo las aplicaciones solicitan e intercambian información. En el desarrollo web, una API generalmente se proporciona en forma de URL, se envía al servidor a través de una solicitud HTTP y devuelve datos en un formato como JSON o XML. Las API permiten a los desarrolladores acceder a la funcionalidad o los datos de servicios remotos sin conocer los detalles de implementación subyacentes.

Por lo tanto, la URL puede considerarse parte de la API. La URL es una parte importante para acceder a la API: es una dirección de red que apunta a la API y se utiliza para identificar y localizar funciones y recursos específicos de la API. Al construir y enviar solicitudes HTTP a la URL de la API, puede interactuar con la API, solicitar datos o realizar operaciones.

Generalmente se accede a la API en forma de URL, la API es equivalente a una interfaz y la URL es el parámetro necesario para que accedamos a la API correspondiente.


A continuación, el autor explica brevemente los seis pasos que debe seguir iOS para realizar solicitudes sencillas de datos de red :

  1. Cree una URL de API: cree una URL de API, incluida la especificación de la dirección base, la ruta y los parámetros de consulta.
  2. Cree un objeto NSURL: use la cadena URL para crear un objeto NSURL para usarlo en la solicitud.
  3. Crear NSURLRequest: utilice el objeto NSURL para crear un objeto NSURLRequest que contendrá el tipo de solicitud (GET, POST, etc.) y otra información necesaria.
  4. Crear NSURLSession: inicialice NSURLSession para administrar sesiones de red, que es el componente principal para enviar solicitudes.
  5. Cree NSURLSessionDataTask: utilice NSURLSession para crear un objeto NSURLSessionDataTask para enviar solicitudes de red y recibir datos una vez completada la solicitud.
  6. Procesamiento de los resultados de la solicitud: una vez completada la solicitud, procese los datos devueltos por el servidor y realice el procesamiento correspondiente, como analizar los datos o actualizar la interfaz de usuario.
// 引入头文件
#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    
    
    [super viewDidLoad];
    
    // 1. 创建API的URL
    NSString *urlString = @"https://api.example.com/data"; // 请替换为实际的API地址
    
    // 2. 创建NSURL对象
    NSURL *url = [NSURL URLWithString:urlString];
    
    // 3. 创建NSURLRequest
    NSURLRequest *request = [NSURLRequest requestWithURL:url];
    
    // 4. 创建NSURLSession
    NSURLSession *session = [NSURLSession sharedSession];
    
    // 5. 创建NSURLSessionDataTask
    NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
    
    
        if (error) {
    
    
            // 处理请求出错
            NSLog(@"Error: %@", error.localizedDescription);
        } else {
    
    
            // 6. 处理请求结果(这里简单地将返回的数据转为字符串并输出)
            NSString *responseData = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
            NSLog(@"Response: %@", responseData);
            
            // 如果需要解析JSON数据,可以使用NSJSONSerialization类进行解析
            // NSDictionary *jsonObject = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:nil];
        }
    }];
    
    // 7. 启动数据任务
    [dataTask resume];
}

@end

Cabe señalar que esta es solo la solicitud GET más simple, y habrá conocimientos como solicitudes POST en el futuro. Lo agregaré después de aprenderlo.


Al mismo tiempo, observamos que nuestro método del cuarto paso también se puede
+ (NSURLSession *)sessionWithConfiguration:(NSURLSessionConfiguration *)configuration delegate:(nullable id <NSURLSessionDelegate>)delegate delegateQueue:(nullable NSOperationQueue *)queue;implementar con este método. [NSURLSession sharedSession]La diferencia entre este y el método es que este último solo se puede usar para solicitudes de red simples, mientras que el primero le permite usar configuraciones personalizadas para crear sesiones y puede configurar delegados para manejar eventos relacionados

Suponiendo que nuestra API requiere autenticación básica HTTP, debemos incluir un nombre de usuario y una contraseña en la solicitud. URLSession:task:didReceiveChallenge:completionHandler:En este caso, podemos implementar un método en NSURLSessionDelegate para manejar la autenticación.

#import "ViewController.h"

@interface ViewController () <NSURLSessionDelegate>

@end

@implementation ViewController

- (void)viewDidLoad {
    
    
    [super viewDidLoad];
    
    // 1. 创建API的URL
    NSString *urlString = @"https://api.example.com/data"; // 请替换为实际的API地址
    
    // 2. 创建NSURL对象
    NSURL *url = [NSURL URLWithString:urlString];
    
    // 3. 创建NSURLSessionConfiguration
    NSURLSessionConfiguration *sessionConfig = [NSURLSessionConfiguration defaultSessionConfiguration];
    
    // 4. 创建NSURLSession并设置代理
    NSURLSession *session = [NSURLSession sessionWithConfiguration:sessionConfig delegate:self delegateQueue:[NSOperationQueue mainQueue]];
    
    // 5. 创建NSURLSessionDataTask
    NSURLSessionDataTask *dataTask = [session dataTaskWithURL:url completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
    
    
        if (error) {
    
    
            // 处理请求出错
            NSLog(@"Error: %@", error.localizedDescription);
        } else {
    
    
            // 处理请求结果(这里简单地将返回的数据转为字符串并输出)
            NSString *responseData = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
            NSLog(@"Response: %@", responseData);
        }
    }];
    
    // 6. 启动数据任务
    [dataTask resume];
}

#pragma mark - NSURLSessionDelegate

- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition disposition, NSURLCredential * _Nullable credential))completionHandler {
    
    
    
    // 这里我们处理HTTP基本认证(Basic Authentication)
    if ([challenge.protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodHTTPBasic]) {
    
    
        
        // 在这里设置您的用户名和密码
        NSString *username = @"your_username";
        NSString *password = @"your_password";
        
        // 创建NSURLCredential对象
        NSURLCredential *credential = [NSURLCredential credentialWithUser:username password:password persistence:NSURLCredentialPersistenceForSession];
        
        // 调用完成处理程序,将凭据传递给会话
        completionHandler(NSURLSessionAuthChallengeUseCredential, credential);
    }
}

@end

De manera similar, en el quinto paso, también podemos usar dos métodos para realizar nuestra solicitud de datos.
inserte la descripción de la imagen aquí

El método dataTaskWithRequest:completionHandler: requiere que usted mismo cree y configure un objeto NSURLRequest y luego lo pase como parámetro a este método para lograr más opciones de personalización y configuración.
El método dataTaskWithURL:completionHandler: es más conciso y solo necesita pasar un objeto NSURL, que es la URL de destino de la solicitud, en lugar de crear y configurar el objeto NSURLRequest usted mismo. Este método esUn atajo para enviar solicitudes GET, adecuado para obtener datos simples

Pero en el código real, recomendamos usar el primer método para realizar una solicitud, porque nuestro POST y GET generalmente se usan juntos. Tal vez el método GET no necesite usar la Solicitud, pero definitivamente se usará el método POST. Aquí lo aprenderé más adelante. Cuando se trata de blogs específicos para explicar, aquí están las castañas de POST:

- (void)sendPOSTRequest {
    
    
    // 1. 创建API的URL
    NSString *urlString = @"https://api.example.com/post_endpoint"; // 请替换为实际的POST请求的URL
    
    // 2. 创建NSURL对象
    NSURL *url = [NSURL URLWithString:urlString];
    
    // 3. 创建NSMutableURLRequest对象,并设置HTTP方法为POST
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
    [request setHTTPMethod:@"POST"];
    
    // 4. 如果有需要,设置HTTP请求头,例如Content-Type等
    [request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
    
    // 5. 如果有参数或需要发送数据,可以将其添加到HTTP请求体中
    NSDictionary *parameters = @{
    
    @"key1": @"value1", @"key2": @"value2"};
    NSError *error;
    NSData *postData = [NSJSONSerialization dataWithJSONObject:parameters options:0 error:&error];
    if (!error) {
    
    
        [request setHTTPBody:postData];
    } else {
    
    
        NSLog(@"Error creating POST data: %@", error.localizedDescription);
        return;
    }
    
    // 6. 创建NSURLSession,并发送POST请求
    NSURLSession *session = [NSURLSession sharedSession];
    NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
    
    
        if (error) {
    
    
            // 处理请求出错
            NSLog(@"Error: %@", error.localizedDescription);
        } else {
    
    
            // 处理请求结果
            NSString *responseData = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
            NSLog(@"Response: %@", responseData);
        }
    }];
    
    // 7. 启动数据任务
    [dataTask resume];
}


3. Obtenga acceso a API para obtener datos de la red

Después de explicar nuestros pasos básicos de solicitud de datos de red, tomemos nuestros datos json anteriores como ejemplo para realizar una solicitud de datos de red simple:

{
  "code": "200",
  "updateTime": "2021-11-15T16:35+08:00",
  "fxLink": "http://hfx.link/2ax1",
  "daily": [
    {
      "fxDate": "2021-11-15",
      "sunrise": "06:58",
      "sunset": "16:59",
      "moonrise": "15:16",
      "moonset": "03:40",
      "moonPhase": "盈凸月",
      "moonPhaseIcon": "803",
      "tempMax": "12",
      "tempMin": "-1",
      "iconDay": "101",
      "textDay": "多云",
      "iconNight": "150",
      "textNight": "晴",
    },
    {
      "fxDate": "2021-11-16",
      "sunrise": "07:00",
      "sunset": "16:58",
      "moonrise": "15:38",
      "moonset": "04:40",
      "moonPhase": "盈凸月",
      "moonPhaseIcon": "803",
      "tempMax": "13",
      "tempMin": "0",
      "iconDay": "100",
      "textDay": "晴",
      "iconNight": "101",
      "textNight": "多云",
    }
  ],
  "refer": {
    "sources": [
      "QWeather",
      "NMC",
      "ECMWF"
    ],
    "license": [
      "QWeather Developers License"
    ]
  }
}

Por ejemplo, si queremos obtener fxDate en datos json , primero debemos usar para
+ (nullable id)JSONObjectWithData:(NSData *)data options:(NSJSONReadingOptions)opt error:(NSError **)error;
analizar los datos binarios obtenidos por nuestra API de acceso en un objeto NSDictionary (u objeto NSArray). Según el conocimiento anterior, podemos saber que debemos analizarlo en NSDictionary. Así que nosotrosUtilice el siguiente código para analizar primero todos nuestros datos json
NSDictionary *weatherData = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&error];

Entonces podemos saber que el tipo de clave "diaria" correspondiente en nuestro diccionario es en realidad un objeto NSArray. Si queremos obtener fxDate, primero debemos acceder diariamente, por lo que usamos el siguiente código para obtener diariamente NSArray *dailyArray = weatherData[@"daily"];

Dado que cada tipo de objeto en nuestra matriz diaria es NSDictionary, podemos usar el siguiente código para obtener todos los fxDate en nuestra matriz

for (NSDictionary *currentDayData in dailyArray) {
    
      
     NSString *timeString = currentDayData[@"fxDate"]; // 时间
     NSLog(@"%@", timeString);
}

Obtenga nuestros siguientes resultados:
inserte la descripción de la imagen aquí
Proporcione el código completo para su referencia:

    NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
    
    
        if (error) {
    
    
              // 请求出错处理
          } else {
    
    
              NSDictionary *weatherData = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&error];
              if (error) {
    
    
                  // 解析数据出错处理
              } else {
    
    
                  // 解析数据成功
                  NSArray *dailyArray = weatherData[@"daily"];
                      for (NSDictionary *currentDayData in dailyArray) {
    
    
                          NSString *timeString = currentDayData[@"fxDate"]; // 时间
                          NSLog(@"%@", timeString);
                      }
                      NSLog(@"无法获取当前时间的天气数据。");
                  }
              }
          }
      }];

Resumir

El autor explicó brevemente las solicitudes básicas de datos de red aquí. De hecho, con el desarrollo de iOS, ha habido muchas bibliotecas de terceros como JSONModel, etc., que nos permiten analizar json y solicitar datos de red de manera más conveniente. Hay solicitudes de datos de red. No sé mucho sobre el uso de POST y lo resumiré más adelante.

fuente de datos json:
Hefeng Daily Weather

Supongo que te gusta

Origin blog.csdn.net/weixin_72437555/article/details/132016710
Recomendado
Clasificación