Com todos os objetos de manipulação de URL disponíveis nas bibliotecas Cocoa padrão (NSURL, NSMutableURL, NSMutableURLRequest, etc), eu sei que devo estar negligenciando uma maneira fácil de compor programaticamente uma solicitação GET.
Atualmente estou acrescentando manualmente "?" seguido por pares de valor de nome unidos por "&", mas todos os meus pares de nome e valor precisam ser codificados manualmente para que NSMutableURLRequest não falhe totalmente ao tentar se conectar ao URL.
Isso parece algo que eu deveria ser capaz de usar uma API pré-preparada para ... há algo pronto para ser usado para anexar um NSDictionary de parâmetros de consulta a um NSURL? Existe outra maneira de abordar isso?
objective-c
nsurl
Zev Eisenberg
fonte
fonte
Respostas:
Introduzido no iOS8 e no OS X 10.10 é
NSURLQueryItem
, que pode ser usado para construir consultas. Dos documentos em NSURLQueryItem :Para criar um, use o inicializador designado
queryItemWithName:value:
e, em seguida, adicione-os aNSURLComponents
para gerar umNSURL
. Por exemplo:Observe que o ponto de interrogação e o e comercial são tratados automaticamente. Criar um a
NSURL
partir de um dicionário de parâmetros é tão simples quanto:Também escrevi uma postagem no blog sobre como construir URLs com
NSURLComponents
eNSURLQueryItems
.fonte
Você pode criar uma categoria para
NSDictionary
fazer isso - não há uma forma padrão na biblioteca Cocoa que eu possa encontrar. O código que uso é parecido com este:com esta implementação:
Acho o código bastante simples, mas discuto-o com mais detalhes em http://blog.ablepear.com/2008/12/urlencoding-category-for-nsdictionary.html .
fonte
Eu queria usar a resposta de Chris, mas ela não foi escrita para contagem automática de referência (ARC), então eu a atualizei. Pensei em colar minha solução, caso outra pessoa tenha o mesmo problema. Nota: substitua
self
pela instância ou nome da classe onde apropriado.fonte
As outras respostas funcionam bem se os valores forem strings, no entanto, se os valores forem dicionários ou matrizes, este código tratará disso.
É importante notar que não existe uma forma padrão de passar um array / dicionário através da string de consulta, mas o PHP lida com esta saída muito bem
Exemplos
foo = bar & traduções [um] = uno & traduções [dois] = dos & traduções [três] = três
foo = bar & traduções [] = uno & traduções [] = dos & traduções [] = tres
fonte
CFURLCreateStringByAddingPercentEscapes
chamadas porstringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]
Refatorei e converti para a resposta ARC de AlBeebe
}
fonte
[NSString stringWithFormat:@"?%@",[pairs componentsJoinedByString:@"&"]];
CFURLCreateStringByAddingPercentEscapes
chamadasstringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]
Se você já está usando AFNetworking (como foi o meu caso), você pode usar sua classe
AFHTTPRequestSerializer
para criar o necessárioNSURLRequest
.[[AFHTTPRequestSerializer serializer] requestWithMethod:@"GET" URLString:@"YOUR_URL" parameters:@{PARAMS} error:nil];
Caso você precise apenas da URL para o seu trabalho, use
NSURLRequest.URL
.fonte
Aqui está um exemplo simples em Swift (iOS8 +):
fonte
queryItems
estão disponíveis a partir do iOS8.0.Eu segui a recomendação de Joel de usar
URLQueryItems
e me transformei em uma extensão Swift (Swift 3)(O
self.init
método é meio cafona, mas não haviaNSURL
init com componentes)Pode ser usado como
fonte
Eu tenho outra solução:
http://splinter.com.au/build-a-url-query-string-in-obj-c-from-a-dict
Você pode usá-lo assim:
fonte
fonte
Outra solução, se você usar o RestKit, há uma função
RKURLEncodedSerialization
chamadaRKURLEncodedStringFromDictionaryWithEncoding
que faz exatamente o que você deseja.fonte
Maneira simples de converter NSDictionary em string de consulta de url em Objective-c
Ex: first_name = Steve & middle_name = Gates & last_name = Jobs & address = Palo Alto, Califórnia
Espero que ajude :)
fonte