2013-09-24 4 views
148
public static async Task<string> GetData(string url, string data) 
{ 
    UriBuilder fullUri = new UriBuilder(url); 

    if (!string.IsNullOrEmpty(data)) 
     fullUri.Query = data; 

    HttpClient client = new HttpClient(); 

    HttpResponseMessage response = await client.PostAsync(new Uri(url), /*expects HttpContent*/); 

    response.Content.Headers.ContentType = new MediaTypeHeaderValue("application/json"); 
    response.EnsureSuccessStatusCode(); 
    string responseBody = await response.Content.ReadAsStringAsync(); 

    return responseBody; 
} 

PostAsync принимает еще один параметр, который должен быть HttpContent.Как настроить HttpContent для моего второго параметра PostAsync HttpClient?

Как настроить HttpContent? Нет документации в любом месте, который работает для Windows Phone 8.

Если у меня GetAsync, он отлично работает! но она должна быть POST с содержанием ключа = «бла», что-то = «яй»

// EDIT

спасибо за ответ ... Это хорошо работает, но все-таки несколько unsures здесь:

public static async Task<string> GetData(string url, string data) 
    { 
     data = "test=something"; 

     HttpClient client = new HttpClient(); 
     StringContent queryString = new StringContent(data); 

     HttpResponseMessage response = await client.PostAsync(new Uri(url), queryString); 

     //response.Content.Headers.ContentType = new MediaTypeHeaderValue("application/json"); 
     response.EnsureSuccessStatusCode(); 
     string responseBody = await response.Content.ReadAsStringAsync(); 

     return responseBody; 
    } 

данные «тест = что-то» я предположил бы забрать на стороне апи как разместить данные «тест», по-видимому, это не так. По другому вопросу мне может потребоваться опубликовать целые объекты/массивы с помощью почтовых данных, поэтому я предполагаю, что json будет лучше всего сделать это. Любые мысли о том, как я получаю данные для публикации?

Может быть что-то вроде:

class SomeSubData 
{ 
    public string line1 { get; set; } 
    public string line2 { get; set; } 
} 

class PostData 
{ 
    public string test { get; set; } 
    public SomeSubData lines { get; set; } 
} 

PostData data = new PostData { 
    test = "something", 
    lines = new SomeSubData { 
     line1 = "a line", 
     line2 = "a second line" 
    } 
} 
StringContent queryString = new StringContent(data); // But obviously that won't work 

ответ

89

Это отвечает на некоторые из ответов на Can't find how to use HttpContent, а также в этом blog post.

Таким образом, вы не можете напрямую настроить экземпляр HttpContent, так как это абстракционный класс. Вы должны использовать один из классов, полученных от него, в зависимости от ваших потребностей. Скорее всего, StringContent, который позволяет вам установить строковое значение ответа, кодировку и тип носителя в конструкторе. См: http://msdn.microsoft.com/en-us/library/system.net.http.stringcontent.aspx

+2

Я проверю это. Я думаю, когда я это выясню, мне придется положить это где-нибудь, где все смогут это увидеть! Это привело меня к работе 4 дня, пытаясь получить простой REST API. – Jimmyt1988

+0

StringContent отлично работает, но на самом деле не может получить PostData для доступа к сайту, на который я звоню сейчас: D. Я отредактирую вопрос, чтобы показать вам, что у меня сейчас есть – Jimmyt1988

+2

. Быстрый ответ на вопрос «как отправить JSON-рецензию на мой класс» - это «сериализовать объект JSON, возможно, с помощью JSON.Net», но это действительно относится к отдельный вопрос. –

29

Чтобы добавить ответ Престон, вот полный список HttpContent производных классов доступны в стандартной библиотеке:

Credit: https://pfelix.wordpress.com/2012/01/16/the-new-system-net-http-classes-message-content/

Кредит: https://pfelix.wordpress.com/2012/01/16/the-new-system-net-http-classes-message-content/

Там также предполагается ObjectContent, но не удалось найти его в ASP.NET Core.

Конечно, вы можете пропустить всю HttpContent вещь все вместе с Microsoft.AspNet.WebApi.Client расширениями (вы должны сделать импорт, чтобы заставить его работать в ASP.NET Ядра сейчас: https://github.com/aspnet/Home/issues/1558), а затем вы можете сделать что-то вроде :

var response = await client.PostAsJsonAsync("AddNewArticle", new Post 
{ 
    Title = "New Article Title", 
    Body = "New Article Body" 
}); 
Смежные вопросы