Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 12
  1. #1

    [C#] Inviare richieste post

    ciao!

    sto cercando di inviare richieste POST da una appa in xamarin.

    lato server ho solo questo:
    codice:
    var_dump($_POST);
    e non ho problemi ad inviare richieste da terminale con curl o simili.

    poi ho fatto questo al click sul bottone:
    codice:
           asyncvoidOnButton_Clicked(objectsender,EventArgsargs)
    {
    using(varclient=newHttpClient())
    {
    Itembook=newItem();
    book.Title=Titolo.Text;
    varurl=string.Format(Costanti.addBook);
    varjson=JsonConvert.SerializeObject(book);
    varresp=awaitclient.PostAsync(url,newStringContent(json));
    if(resp.IsSuccessStatusCode)
    {
    Console.WriteLine(resp.Content.ReadAsStringAsync());
    }
    }
    }

    in console ottengo sempre questo:
    codice:
    System.Threading.Tasks.Task`1[System.String]
    sinceramente non ho capito se sto facendo bene o no.

  2. #2
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,296
    Il metodo ReadAsStringAsync è asincrono: quello che leggi non è il risultato, bensì il task che è stato avviato su un thread separato e che sta gestendo l'operazione in modo parallelo al flusso principale del programma.

    Devi usare la parola chiave await oppure fare Wait sull'oggetto Task per ottenere la risposta nel momento in cui l'operazione è terminata.

    Ciao!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  3. #3
    ciao alka.

    ad essere sincero questo meccanismo mi mette un pò difficoltà.

    allora, questa la classe col metodo "originario":
    codice:
    namespace Book.Services
    {
        public class MockDataStore : IDataStore<Item>
        {
            List<Item> items;
            private string remoteFile = "";
    
            public MockDataStore(string remoteFile)
            {
                items = new List<Item>();
                this.remoteFile = remoteFile;
            }
    
            public async Task<dynamic> AddItemAsync(Item item)
            {
                HttpClient client = new HttpClient();
                var uri = new Uri(Costanti.addBook);
                string json = JsonConvert.SerializeObject(item);
                var content = new StringContent(json, System.Text.Encoding.UTF8, "application/json");
                HttpResponseMessage response = await client.PostAsync(uri, content);
                String responseJson = await response.Content.ReadAsStringAsync();
                return Task.FromResult<dynamic>(responseJson);
            }
        }
    }
    poi richiamo tutto così al click del bottone:
    codice:
            void OnButton_Clicked(object sender, EventArgs args)
            {
                Item book = new Item();
                book.Title = Titolo.Text;
                MockDataStore mds = new MockDataStore(Costanti.addBook);
                Console.WriteLine(mds.AddItemAsync(book));
            }
    ed ottengo un bel:
    codice:
    System.Threading.Tasks.Task`1[System.Object]
    quello che non ho capito è come posso usare la risposta del server.

  4. #4
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,296
    Se usi i metodi asincroni, devi imparare come gestirli.
    Se ti creano tutte queste difficoltà, allora usa le versioni non asincrone.
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  5. #5
    Quote Originariamente inviata da alka Visualizza il messaggio
    Se usi i metodi asincroni, devi imparare come gestirli.
    Se ti creano tutte queste difficoltà, allora usa le versioni non asincrone.
    eh si, sono solo 5 giorni che ci sbatto la testa.
    ho letto esempi su esempi e documentazione.
    non ne esco fuori, sennò non chiedevo....

    continuo a cercare.
    grazie lo stesso.

  6. #6
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,296
    Quote Originariamente inviata da fermat Visualizza il messaggio
    non ne esco fuori, sennò non chiedevo....
    Basta togliere l'appendice ...Async dai nomi dei metodi che stai invocando.
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  7. #7
    Quote Originariamente inviata da alka Visualizza il messaggio
    Basta togliere l'appendice ...Async dai nomi dei metodi che stai invocando.
    si per averlo sincrono.
    ma io vorrei usare i metodi asincroni.
    mi sto sbattendo per quello.
    sennò ripeto, non avrei chiesto.

    essendo una app mobile, penso sia la soluzione migliore.

  8. #8
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,296
    Quote Originariamente inviata da fermat Visualizza il messaggio
    si per averlo sincrono.
    ma io vorrei usare i metodi asincroni.
    E allora torno al suggerimento originale: alle chiamate dei metodi asincroni, come questo

    codice:
    public async Task<dynamic> AddItemAsync(Item item)

    devi anteporre await alla chiamata.

    Quindi questo non va bene:
    codice:
    Console.WriteLine(mds.AddItemAsync(book));

    poiché va invocato così:
    codice:
    Console.WriteLine(await mds.AddItemAsync(book));
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  9. #9
    Quote Originariamente inviata da alka Visualizza il messaggio
    E allora torno al suggerimento originale: alle chiamate dei metodi asincroni, come questo

    ................

    poiché va invocato così:
    codice:
    Console.WriteLine(await mds.AddItemAsync(book));
    ecco, questo mi mancava.
    io facevo stupidamente così:
    codice:
    await Console.WriteLine(mds.AddItemAsync(book));
    appena torno a casa provo!

  10. #10
    allora, ho modificato come da tuo suggerimento, ed ottengo la risposta dal server:
    codice:
       async void OnButton_Clicked(object sender, EventArgs args)
            {
                Item book = new Item();
                //book.Title = Titolo.Text;
                book.Title = "CIAO";
                MockDataStore mds = new MockDataStore(Costanti.addBook);
                string resp = await mds.AddItemAsync(book);
                Console.WriteLine(resp);
            }
    il mio problema adesso è che ottengo sempre un array vuoto in risposta.
    come se non avessi mandato nulla:
    codice:
            public async Task<string> AddItemAsync(Item item)
            {
                HttpClient client = new HttpClient();
                var uri = new Uri(Costanti.addBook);
                string json = JsonConvert.SerializeObject(item);
                Console.WriteLine(json);
                var content = new StringContent(json, System.Text.Encoding.UTF8, "application/json");
                HttpResponseMessage response = await client.PostAsync(uri, content);
                String responseJson = await response.Content.ReadAsStringAsync();
                return responseJson;
            }
    in console vedo questo:
    codice:
    2018-12-03 11:37:21.252517+0100 Book.iOS[15499:1152549] {"Id":null,"Title":"CIAO","Author":null,"Editor":null,"Price":null,"Isbn":null,"Note":null}
    
    2018-12-03 11:37:21.503325+0100 Book.iOS[15499:1152549] array(0) {
    }
    quindi qualche dato dovrei averglielo inviato, ma in risposta sembra di no.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.