Générique de la requête POST à l'aide de Microsoft.HttpClient et HttpContentExtensions

Je suis en utilisant le très impressionnant HttpClient fournis dans la WCF REST Kit de démarrage. J'ai la méthode suivante qui va à l'encontre de la HelloTxt API:

public UserValidateResponse Validate()
{
    HttpClient client = new HttpClient(baseUrl);

    HttpMultipartMimeForm form = new HttpMultipartMimeForm();
    form.Add("app_key", this.AppKey);
    form.Add("user_key", this.UserKey);
    HttpResponseMessage response = client.Post("user.validate", form.CreateHttpContent());

    return response.Content.ReadAsXmlSerializable<UserValidateResponse>();
}

J'ai un beau générique GetRequest méthode qui ressemble à ceci:

public T GetRequest<T>(string query)
{
    HttpClient client = new HttpClient(baseUrl);
    client.DefaultHeaders.UserAgent.AddString(@"http://www.simply-watches.co.uk/");

    HttpResponseMessage response = client.Get(query);
    response.EnsureStatusIsSuccessful();

    T data = default(T);
    try
    {
        data = response.Content.ReadAsXmlSerializable<T>();
        return data;
    }
    catch (Exception ex)
    {
        Console.Write(String.Format("{0}: {1}", ex.Message, ex.InnerException.Message));
    }

    return data;
}

L'avantage est que vous pouvez passe-T-il que le type de réponse que par ce aléatoire exemple:

public List<User> GetUsers(int deptid)
{
    string query = String.Format("department.getUsers?api_key={0}&dept_id={1}", this.APIKey, deptId);

    return GetRequest<List<User>>(query);
}

Je veux le même style générique de la méthode POST, plutôt que d'OBTENIR et je suis sûr que je peux utiliser le HttpContentExtensions, mais je ne peux pas comprendre comment transformer la demande en un HttpMultipartMimeForm. c'est ce que j'ai à ce jour:

public T PostRequest<K, T>(string query, K request)
{
    HttpClient client = new HttpClient(baseUrl);
    //the following line doesn't work! Any suggestions?
    HttpContent content = HttpContentExtensions.CreateDataContract<K>(request, Encoding.UTF8, "application/x-www-form-urlencoded", typeof(HttpMultipartMimeForm));

    HttpResponseMessage response = client.Post(query, content);
    response.EnsureStatusIsSuccessful();

    T data = default(T);
    try
    {
        data = response.Content.ReadAsXmlSerializable<T>();
        return data;
    }
    catch (Exception ex)
    {
        Console.Write(String.Format("{0}: {1}", ex.Message, ex.InnerException.Message));
    }

    return data;
}

Il serait appelé comme ceci:

UserValidateResponse response = PostRequest<UserValidateRequest, UserValidateResponse>("user.validate", new UserValidateRequest(this.AppKey, this.UserKey));

C'est de travailler à l'encontre de cette API: http://hellotxt.com/developers/documentation. Toutes les suggestions sont bienvenues! Je pourrais définir une forme différente pour chaque POSTE, mais il serait bien de faire cela d'une manière générique.

  • J'ai le sentiment que la seule façon de le faire est d'utiliser la réflexion et de construire un HttpMultipartMimeForm basé sur le simple des propriétés d'une classe, ou de sérialiser l'objet, puis le premier des enfants en vertu de la racine nœud XML.
InformationsquelleAutor Rebecca | 2011-01-20