web-dev-qa-db-ja.com

Windows Phone 8のHttpClientリクエストでPost本文を送信する方法は?

以下のコードを書いて、ヘッダーを送信し、パラメーターを送信します。問題は、リクエストがGETまたはPOSTになる可能性があるため、SendAsyncを使用していることです。 POST Bodyをこのコードに追加して、投稿本文データがある場合、作成するリクエストに追加され、その単純なGETまたはPOSTが本文なしの場合要求をそのように送信します。以下のコードを更新してください:

HttpClient client = new HttpClient();

// Add a new Request Message
HttpRequestMessage requestMessage = new HttpRequestMessage(RequestHTTPMethod, ToString());

// Add our custom headers
if (RequestHeader != null)
{
    foreach (var item in RequestHeader)
    {

        requestMessage.Headers.Add(item.Key, item.Value);

    }
}

// Add request body


// Send the request to the server
HttpResponseMessage response = await client.SendAsync(requestMessage);

// Get the response
responseString = await response.Content.ReadAsStringAsync();
41
Balraj Singh

これは、どのコンテンツを持っているかによって異なります。 requestMessage.Contentプロパティを新しい HttpContent で初期化する必要があります。例えば:

...
// Add request body
if (isPostRequest)
{
    requestMessage.Content = new ByteArrayContent(content);
}
...

ここで、contentはエンコードされたコンテンツです。また、正しいContent-typeヘッダーを含める必要があります。

更新:

ああ、それはもっといいことがあります(これから answer ):

requestMessage.Content = new StringContent("{\"name\":\"John Doe\",\"age\":33}", Encoding.UTF8, "application/json");
89
Ilya Luzyanin

次の方法で実装しました。 APIを呼び出して要求の本文のコンテンツを受信し、応答を目的の型に逆シリアル化できる汎用のMakeRequestメソッドが必要でした。送信するコンテンツを格納するDictionary<string, string>オブジェクトを作成し、HttpRequestMessageContentプロパティを設定します:

APIを呼び出す汎用メソッド:

    private static T MakeRequest<T>(string httpMethod, string route, Dictionary<string, string> postParams = null)
    {
        using (var client = new HttpClient())
        {
            HttpRequestMessage requestMessage = new HttpRequestMessage(new HttpMethod(httpMethod), $"{_apiBaseUri}/{route}");

            if (postParams != null)
                requestMessage.Content = new FormUrlEncodedContent(postParams);   // This is where your content gets added to the request body


            HttpResponseMessage response = client.SendAsync(requestMessage).Result;

            string apiResponse = response.Content.ReadAsStringAsync().Result;
            try
            {
                // Attempt to deserialise the reponse to the desired type, otherwise throw an expetion with the response from the api.
                if (apiResponse != "")
                    return JsonConvert.DeserializeObject<T>(apiResponse);
                else
                    throw new Exception();
            }
            catch (Exception ex)
            {
                throw new Exception($"An error ocurred while calling the API. It responded with the following message: {response.StatusCode} {response.ReasonPhrase}");
            }
        }
    }

メソッドを呼び出す:

    public static CardInformation ValidateCard(string cardNumber, string country = "CAN")
    { 
        // Here you create your parameters to be added to the request content
        var postParams = new Dictionary<string, string> { { "cardNumber", cardNumber }, { "country", country } };
        // make a POST request to the "cards" endpoint and pass in the parameters
        return MakeRequest<CardInformation>("POST", "cards", postParams);
    }
5
Adam Hey