Con todos los objetos de manejo de URL que se encuentran en las bibliotecas estándar de Cocoa (NSURL, NSMutableURL, NSMutableURLRequest, etc.), sé que debo estar pasando por alto una manera fácil de componer programáticamente una solicitud GET.
Actualmente estoy agregando manualmente "?" seguido de pares de nombre y valor unidos por "&", pero todos mis pares de nombre y valor deben codificarse manualmente para que NSMutableURLRequest no falle por completo cuando intenta conectarse a la URL.
Esto se siente como algo para lo que debería poder usar una API prefabricada ... ¿hay algo fuera de la caja para agregar un NSDictionary de parámetros de consulta a una NSURL? ¿Hay otra forma de abordar esto?
objective-c
nsurl
Zev Eisenberg
fuente
fuente
Respuestas:
Introducido en iOS8 y OS X 10.10 es
NSURLQueryItem
, que se puede utilizar para crear consultas. De los documentos en NSURLQueryItem :Para crear uno, use el inicializador designado
queryItemWithName:value:
y luego agréguelosNSURLComponents
para generar unNSURL
. Por ejemplo:Observe que el signo de interrogación y el ampersand se manejan automáticamente. La creación
NSURL
de un diccionario de parámetros es tan simple como:También escribí una publicación de blog sobre cómo crear URL con
NSURLComponents
yNSURLQueryItems
.fuente
Puede crear una categoría para
NSDictionary
hacer esto; tampoco hay una forma estándar en la biblioteca de Cocoa que pueda encontrar. El código que utilizo se ve así:con esta implementación:
Creo que el código es bastante sencillo, pero lo analizo con más detalle en http://blog.ablepear.com/2008/12/urlencoding-category-for-nsdictionary.html .
fuente
Quería usar la respuesta de Chris, pero no estaba escrito para el Conteo automático de referencias (ARC), así que lo actualicé. Pensé en pegar mi solución en caso de que alguien más tuviera el mismo problema. Nota: reemplácelo
self
con el nombre de la instancia o la clase cuando corresponda.fuente
Las otras respuestas funcionan muy bien si los valores son cadenas, sin embargo, si los valores son diccionarios o matrices, este código se encargará de eso.
Es importante tener en cuenta que no hay una forma estándar de pasar una matriz / diccionario a través de la cadena de consulta, pero PHP maneja esta salida bien
Ejemplos
foo = barra y traducciones [uno] = uno y traducciones [dos] = dos y traducciones [tres] = tres
foo = barra y traducciones [] = uno y traducciones [] = dos y traducciones [] = tres
fuente
CFURLCreateStringByAddingPercentEscapes
llamadas constringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]
Refactoré y convertí a la respuesta ARC por AlBeebe
}
fuente
[NSString stringWithFormat:@"?%@",[pairs componentsJoinedByString:@"&"]];
CFURLCreateStringByAddingPercentEscapes
llamadasstringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]
Si ya está usando AFNetworking (como fue mi caso), puede usar su clase
AFHTTPRequestSerializer
para crear el archivoNSURLRequest
.[[AFHTTPRequestSerializer serializer] requestWithMethod:@"GET" URLString:@"YOUR_URL" parameters:@{PARAMS} error:nil];
En caso de que solo necesite la URL para su trabajo, utilice
NSURLRequest.URL
.fuente
Aquí hay un ejemplo simple en Swift (iOS8 +):
fuente
queryItems
están disponibles desde iOS8.0.Seguí la recomendación de Joel de usar
URLQueryItems
y la convertí en una extensión Swift (Swift 3)(El
self.init
método es un poco cursi, pero no habíaNSURL
init con componentes)Puede usarse como
fuente
Tengo otra solución:
http://splinter.com.au/build-a-url-query-string-in-obj-c-from-a-dict
Luego puedes usarlo así:
fuente
fuente
Otra solución más, si usa RestKit, hay una función
RKURLEncodedSerialization
llamadaRKURLEncodedStringFromDictionaryWithEncoding
que hace exactamente lo que desea.fuente
Manera simple de convertir NSDictionary a una cadena de consulta de URL en Objective-c
Ejemplo: first_name = Steve & middle_name = Gates & last_name = Jobs & address = Palo Alto, California
La esperanza ayudará :)
fuente