Vai al contenuto

oggetto per l'invio di una richiesta http


hdmvide

Messaggi raccomandati

Salve,

sto entrando da poco nello sviluppo di xcode e devo dire che mi piace molto perchè apple ha proprio messo a disposizione un sdk ordinato e che viene all'incontro dello sviluppatore.

Brevemente vi anticipo quello che sto facendo:

Ho realizzato un piccolo progetto di domotica con arduino, grazie ad arduino posso attivare e disattivare dei relè.

Su arduino ho sviluppato tutta la parte server che riceve richieste http, prende tutto quello che gli viene passato in GET(secondo una politica che ho dato io) ed effettua la sua elaborazione per attivare o disattivare i relè.

Questo è il succo del lavoro

La parte client che invia richieste http per attivare e disattivare i relè, l'ho già sviluppata in java e android. Adesso ho l'esigenza di svilupparla su iphone, per questo il motivo di questo post.

Ho già lavorato sull'interfaccia grafica e predisposto interfacce e implementazione dei metodi che mi serviranno per l'invio delle richieste http.

L'anello mancante è proprio la parte per l'invio della richiesta http, non ho idea di come si faccia su xcode. che oggetti ci sono?

C'è qualcuno che può aiutarmi o consigliarmi dove guardare

PS:

ho già implementato qualcosa di simile ma non funziona

   NSString *myRequestString = @"/?||RELE=1&STATE=1|||";

   NSData *myRequestData = [NSData dataWithBytes: [myRequestString UTF8String] length: [myRequestString length]];

   NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString: @"http://192.168.1.25"]];

   [request setHTTPMethod: @"GET"];

   [request setHTTPBody: myRequestData];

   [request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"content-type"];

   NSData *returnData = [NSURLConnection sendSynchronousRequest: request returningResponse: nil error: nil];

   NSString *strReturnData = [[NSString alloc] initWithData:returnData encoding: NSUTF8StringEncoding ];

   NSLog(@"strReturnData: %@" , strReturnData);

Link al commento
Condividi su altri siti

NSMutableUrlRequest è la classe che ti permette di effettuare chiamate http, sia in GET che in POST.

Quello che hai scritto qui sopra non è corretto, per questa ragione non funziona anche se hai usato le classi giuste.

Hai detto che sul server arduino hai implementato le chiamate in GET ma nel codice che hai riportato anche se imposti l'httpMethod GET (che comunque è quello di default se non lo setti) dopo passi i parametri nell'httpBody che è il metodo da usare nel caso fai una chiamata POST.

Quindi quello che devi fare per far funzionare il tuo codice è togliere questo:

[request setHTTPBody: myRequestData]

e concatena le 2 stringhe url e querystring

NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:[NSString stringWithFormat:@"http://192.168.1.25%@",myRequestString]]];

Poi ti consiglio di usare il metodo asincrono dell'NSUrlConnection per evitare di bloccare l'interfaccia grafica mentre attendi la risposta del server(Oppure metti questa chiamata in un thread separato).

Mobile & Web Developer | samuele@mr-apps.comMr.Apps

Link al commento
Condividi su altri siti

NSMutableUrlRequest è la classe che ti permette di effettuare chiamate http, sia in GET che in POST.

Quello che hai scritto qui sopra non è corretto, per questa ragione non funziona anche se hai usato le classi giuste.

Hai detto che sul server arduino hai implementato le chiamate in GET ma nel codice che hai riportato anche se imposti l'httpMethod GET (che comunque è quello di default se non lo setti) dopo passi i parametri nell'httpBody che è il metodo da usare nel caso fai una chiamata POST.

Quindi quello che devi fare per far funzionare il tuo codice è togliere questo:

[request setHTTPBody: myRequestData]

e concatena le 2 stringhe url e querystring

NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:[NSString stringWithFormat:@"http://192.168.1.25%@",myRequestString]]];

Poi ti consiglio di usare il metodo asincrono dell'NSUrlConnection per evitare di bloccare l'interfaccia grafica mentre attendi la risposta del server(Oppure metti questa chiamata in un thread separato).

grazie mille, provo subito e ti faccio sapere come va...

In effetti la chiamata asincrona è ciò che volevo fare come obiettivo finale, sai consigliarmi dove trovare degli esempi validi per fare chiamate asincrone?

Link al commento
Condividi su altri siti

grazie mille, provo subito e ti faccio sapere come va...

In effetti la chiamata asincrona è ciò che volevo fare come obiettivo finale, sai consigliarmi dove trovare degli esempi validi per fare chiamate asincrone?

niente, continua a non funzionare. E' come se la richiesta non partisse.

Da precisare che inviando la richiesta dal browser i relè si azionano regolarmente, anche con le richieste inviate dall'applicazione java e android.

Link al commento
Condividi su altri siti

Passa un NSError invece che nil e fai un log dell'errore per capire il problema tramite NSLog

questo è l'errore che ottengo

Error Domain=NSURLErrorDomain Code=-1000 "bad URL" UserInfo=0x68892e0 {NSUnderlyingError=0x688dc70 "bad URL", NSLocalizedDescription=bad URL}

sembra che non gli piace l'URL?!

Link al commento
Condividi su altri siti

questo è l'errore che ottengo

Error Domain=NSURLErrorDomain Code=-1000 "bad URL" UserInfo=0x68892e0 {NSUnderlyingError=0x688dc70 "bad URL", NSLocalizedDescription=bad URL}

sembra che non gli piace l'URL?!

molto probabilmente è per via delle PIPE che ci sono nei parametri del GET, devo cambiare qualcosina

Link al commento
Condividi su altri siti

si, direi che è per quello. Prova a codificare così myRequestString

[myRequestString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

sostituisci questo nella concatenazione di stringhe.

Così codifica tutti i caratteri in urlencoding, tu dovresti codificare solo i pipe.

Mobile & Web Developer | samuele@mr-apps.comMr.Apps

Link al commento
Condividi su altri siti

si, direi che è per quello. Prova a codificare così myRequestString

[myRequestString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

sostituisci questo nella concatenazione di stringhe.

Così codifica tutti i caratteri in urlencoding, tu dovresti codificare solo i pipe.

domani faccio questa prova perchè oggi non sono riuscito a farla... intanto ci tengo a ringraziarti per la tua disponibilità

Infatti se invio una richiesta http senza le pipe non ottengo più alcun errore. Purtroppo quelle PIPE hanno un loro scopo nella parte server di arduino, vorrei poter aggirare il problema. Che io sappia non ci sono restrizioni/convenzioni su ciò che si passa in GET, voglio dire, non credo che si debba per forza utilizzare una forma http://IP?var=valore&var=valore... o sbaglio?

Link al commento
Condividi su altri siti

In realtà di convenzione nella GET c'è la sostituzione dei caratteri speciali con caratteri di escape, quindi l'url encoding.

Ho fatto una verifica per capire a quale carattere di escape corrisponde la pipe. Per risolvere il problema invece che modificare il comportamento lato server ed invece di usare il metodo che ti ho riportato che codificherebbe anche i simboli ?,& e non andrebbe bene fai una replace della querystring del solo simbolo | con la stringa %7C così il problema è risolto.

Per fare ciò usa il metodo stringByReplacingOccurrencesOfString

Mobile & Web Developer | samuele@mr-apps.comMr.Apps

Link al commento
Condividi su altri siti

In realtà di convenzione nella GET c'è la sostituzione dei caratteri speciali con caratteri di escape, quindi l'url encoding.

Ho fatto una verifica per capire a quale carattere di escape corrisponde la pipe. Per risolvere il problema invece che modificare il comportamento lato server ed invece di usare il metodo che ti ho riportato che codificherebbe anche i simboli ?,& e non andrebbe bene fai una replace della querystring del solo simbolo | con la stringa %7C così il problema è risolto.

Per fare ciò usa il metodo stringByReplacingOccurrencesOfString

c'hai ragione, in effetti sostituendo le PIPE con i caratteri di escape, non ottengo più l'errore di connessione. Il problema adesso sta nel lato server, perchè arduino non interpreta da se i caratteri di escape e devo cmq apportare una piccola modifica per fare un replace manuale. ti faccio sapere

grazie mille per il tuo aiuto

Link al commento
Condividi su altri siti

Archiviato

Questa discussione è archiviata e chiusa a future risposte.

×
×
  • Crea Nuovo...