Καλώς ορίσατε στο dotNETZone.gr - Σύνδεση | Εγγραφή | Βοήθεια
σε

 

Αρχική σελίδα Ιστολόγια Συζητήσεις Εκθέσεις Φωτογραφιών Αρχειοθήκες

c# HttpClient

Îåêßíçóå áðü ôï ìÝëïò evagelos. Τελευταία δημοσίευση από το μέλος George J. Capnias στις 26-10-2014, 17:52. Υπάρχουν 3 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  26-10-2014, 11:24 75850

    c# HttpClient

    γεια σας παιδιά,

    φτιαχνω ενα connection μεταξυ ενος web site και μιας τοπικής Βάσης δεδομένων.

    Η ερώτηση μου ειναι ως προς το web request

    ο κατασκευαστης εχει ενα παραδειγμα:

     using (var http = new HttpClient())
    {
     http.DefaultRequestHeaders.Accept.Clear();
     http.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
     http.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", Convert.ToBase64String(Encoding.UTF8.GetBytes("username:password")));
     http.BaseAddress = new Uri("https://demo.checkfront.com/api/3.0/");
     Task<HttpResponseMessage> message = http.GetAsync("booking/index");
     String result = message.Result.Content.ReadAsStringAsync().Result;
     JObject obj = JObject.Parse(result);
    }

    1 ερώτηση. Λέει ο κατασκευαστής:

    For example, instead of manually building a query string in a request such as:
    demo.checkfront.com/api/3.0/booking/index?start_date=today&status_id=PAID HTTP/1.1

    You could instead use:

    $data = array(
            'start_date'=>'today',
            'status_id'=>'PAID'
    );
    Checkfront->get('booking/index',$data);

    αυτό πως μπορώ να το "μεταφράσω" σε c# και να περάσω την παραμετρο $data στην HttpClient που εχω;

    2 ερώτηση. Το παράδειγμα που δεινει, ειναι asynchronous ή όχι;

    που ειναι η BeginGetRequestStream , BeginGetResponse, GetResponseCallback;

     

     

  •  26-10-2014, 12:31 75853 σε απάντηση της 75850

    Απ: c# HttpClient

    1. Στην C# μπορείς να χρησιμοποιήσεις το NameValueCollection class που με την .ToString() μπορείς να πάρεις το μέρος του url που είναι μετά το "?" χωρίς το "?". Αφού έχεις θέσει το BaseAddress το relative url που χρειάζεσαι είναι "index?" + nameValueCollection.ToString() για να το περάσεις στην μέθοδο GetAsync(). Προσωπικά θα σου πρότεινα να χρησιμοποιήσεις κάτι σαν αυτό για την κλήση του web service:

      var client = new HttpClient();
      HttpRequestMessage req = new HttpRequestMessage(HttpMethod.Get, apiPath);
      try
      {
       HttpResponseMessage response = await client.SendAsync(req);
       response.EnsureSuccessStatusCode();

       return true;
      }
      catch (HttpRequestException ex)
      {
       throw ex;
      }
      catch (Exception ex)
      {
       throw ex;
      }

    2. 2. Αυτά που περιγράφεις είναι το Asynchronous pattern, που πλέον - λίγο ως πολύ - είναι obsolete, γιατί όλα έχουν γυρίσει να χρησιμοποιούν Tasks. Το HttpClient είναι βασισμένο σε χρήση των Tasks.

     

    George J. 


    George J. Capnias: Χειροπρακτικός Υπολογιστών, Ύψιστος Γκουράρχης της Κουμπουτερολογίας
    w: capnias.org, t: @gcapnias, l: gr.linkedin.com/in/gcapnias
    dotNETZone.gr News
  •  26-10-2014, 16:16 75855 σε απάντηση της 75853

    Απ: c# HttpClient

    Συγνώμη αλλα δεν το εχω.

    var http = new HttpClient();
    http.DefaultRequestHeaders.Accept.Clear();
    http.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
    HttpRequestMessage req = new HttpRequestMessage(HttpMethod.Get, apiPath);
    http.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", Convert.ToBase64String(Encoding.UTF8.GetBytes("username:pass")));
    try
    {
     HttpResponseMessage response = await http.SendAsync(req);
     if (response.EnsureSuccessStatusCode().StatusCode.ToString() == "OK")
     {
      Task<HttpResponseMessage> message = http.GetAsync(apiPath + "booking/index" );
      String result = message.Result.Content.ReadAsStringAsync().Result;
      JObject obj = JObject.Parse(result);
     }
    }
    catch (HttpRequestException ex)
    {
     throw ex;
    }
    catch (Exception ex)
    {
     throw ex;
    }

     

    Τι βαζω στο  "message" ή πρέπει καπου αλλού;

    Αν το βαλω έτσι, παιζει μια χαρα:
    string q1 = "?status_id=PEND";
    string mq = apiPath + "booking/index" + q1;
    Task message = http.GetAsync(mq);
    String result = message.Result.Content.ReadAsStringAsync().Result;
    JObject obj = JObject.Parse(result);


  •  26-10-2014, 17:52 75856 σε απάντηση της 75855

    Απ: c# HttpClient

    Εγώ θα το έγγραφα κάπως έτσι:

    public async Task<ResultObject> Test(string username, string password, string start_date, string status_id)

    {

    string apiPath = "booking/index?start_date={0}&status_id={1}";

    string AuthenticationToken = string.Format("{0}:{1}", username, password);


    using (var client = new HttpClient())

    {

    client.BaseAddress = new Uri("https://demo.checkfront.com/api/3.0/");

    client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

    client.DefaultRequestHeaders.AcceptLanguage.Add(new StringWithQualityHeaderValue("en-US"));

    client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", Convert.ToBase64String(Encoding.UTF8.GetBytes(AuthenticationToken)));


    HttpRequestMessage req = new HttpRequestMessage(HttpMethod.Get, string.Format(apiPath, start_date, status_id));


    try

    {

    HttpResponseMessage response = await client.SendAsync(req);

    response.EnsureSuccessStatusCode();


    string responseText = await response.Content.ReadAsStringAsync();

    ResultObject result = JsonConvert.DeserializeObject<ResultObject>(responseText);


    return result;

    }

    catch (HttpRequestException ex)

    {

    throw ex;

    }

    catch (Exception ex)

    {

    throw ex;

    }

    }

    }

    Το ResultObject είναι η κλάση του αντικειμένου που περιμένεις για απάντηση - υποθέτω ότι έιναι αντικείμενο, μπορεί να είναι κάτι άλλο. Τις παραμέτρους που περνάω στην μέθοδο τις καταλαβαίνεις.

    Εγώ είμαι εγώ - δεν μου αρέσει το concatenation των strings, θέλω να είμαι safe από injection, θέλω η μέθοδός μου να είναι testable και πολλά άλλα παράξενα. Το τροποποιείς κατά βούλιση...

     

    George J. 


    George J. Capnias: Χειροπρακτικός Υπολογιστών, Ύψιστος Γκουράρχης της Κουμπουτερολογίας
    w: capnias.org, t: @gcapnias, l: gr.linkedin.com/in/gcapnias
    dotNETZone.gr News
Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems