Erro de codificação de URL do iOS NSURL
URL que abre no Firefox, navegadores Chrome na área de trabalho, não abre no WebView no iPhone. Este URL está acessando uma solicitação GET. Ao criar o NSURL sem percentescaping, o URL não é gerado. Ao usar o percentescape, o URL redireciona para um conteúdo de URL inválido.
Existe uma codificação diferente usada nos navegadores da área de trabalho e não no iPhone? ou Safari móvel? Existem maneiras diferentes de codificar a URL no iOS, além de usar
-stringByAddingPercentEscapesUsingEncoding
-CFURLCreateStringByAddingPercentEscapes
que gera páginas de conteúdo de solicitação incorreta do servidor.
Qualquer ajuda seria realmente ótima, obrigado.
EDITAR:
O URL gerado é como abaixohttp://something.test.com/iostest/index.html?{"a":"b"}
Conseguiu descobrir que não codificar os colchetes está causando o problema no iOS. como em
NSString *tempUrlSting = (NSString *)CFBridgingRelease(CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault, (CFStringRef)tempURLA,CFSTR("{}"), CFSTR("\""), CFStringConvertNSStringEncodingToEncoding(NSUTF8StringEncoding)));
NSURL *tempUrl=[NSURL URLWithString:tempUrlSting];
Se não estiver codificando os chavetas no URL, mas codificando o restante usando [Resposta de Rob] [1] como acima. Ao criar o NSURL, o URL está vazio.Se codificar os chavetas, a URL é gerada corretamente, mas o servidor lança uma exceção.estePergunta, questão sugere usar CFNetworking.
EDITAR
CFNetworking usado como abaixo
-(void)getDataFromUrl{
CFStringRef tempURLA = CFSTR("http://my.test.server/iostest/index.html?{\"a\":\"b\"}");
CFStringRef tempUrlSting = CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault, (CFStringRef)tempURLA,CFSTR("{}"), CFSTR("\""), CFStringConvertNSStringEncodingToEncoding(NSUTF8StringEncoding));
CFURLRef myURL = CFURLCreateWithString(kCFAllocatorDefault, tempUrlSting, NULL);
CFStringRef requestMethod = CFSTR("GET");
CFHTTPMessageRef myRequest = CFHTTPMessageCreateRequest(kCFAllocatorDefault, requestMethod, myURL,kCFHTTPVersion1_1);
CFStringRef headerFieldName = CFSTR("Accept");
CFStringRef headerFieldValue = CFSTR("text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8");
CFHTTPMessageSetHeaderFieldValue(myRequest, headerFieldName, headerFieldValue);
[self performHTTPRequest:myRequest];
}
-(void)performHTTPRequest:(CFHTTPMessageRef)request {
CFURLRef gotdatab = (__bridge CFURLRef)(CFBridgingRelease(CFHTTPMessageCopyRequestURL(request)));
// NSLog(@"(CFHTTPMessageRef request %@",gotdatab);
CFReadStreamRef requestStream = CFReadStreamCreateForHTTPRequest(NULL, request);
CFReadStreamOpen(requestStream);
NSMutableData *responseBytes = [NSMutableData data];
NSError *error;
while (TRUE) {
if (CFReadStreamHasBytesAvailable(requestStream)) {
UInt8 streambuffer[1024];
int readBytes = CFReadStreamRead (requestStream,streambuffer,sizeof(streambuffer));
NSLog(@"Read: %d",readBytes);
[responseBytes appendBytes:streambuffer length:readBytes];
}
if (CFReadStreamGetStatus(requestStream) == kCFStreamStatusError) {
error = (NSError*)CFBridgingRelease(CFReadStreamCopyError (requestStream));
if ([error code] == 61) {
// connection refused
NSLog(@"Error occured: %d",[error code]);
}
break;
}
if (CFReadStreamGetStatus(requestStream) == kCFStreamStatusAtEnd) {
NSLog(@"Stream reached end!");
error = nil;
break;
}
}//
CFHTTPMessageRef response = (CFHTTPMessageRef)CFReadStreamCopyProperty(requestStream, kCFStreamPropertyHTTPResponseHeader);
if (response==NULL) {
NSLog(@"response is null");
return;
}
}
O acima foi feito usando exemplos deaqui eaqui
O método acima ainda tem o mesmo problema. Ou seja: se {} não estiver codificado, o URL não será gerado. Se o {} estiver codificado, o servidor não retornará um valor adequado.
Alguma sugestão pls?