以下のコードを書いて、ヘッダーを送信し、パラメーターを送信します。問題は、リクエストが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();
これは、どのコンテンツを持っているかによって異なります。 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");
次の方法で実装しました。 APIを呼び出して要求の本文のコンテンツを受信し、応答を目的の型に逆シリアル化できる汎用のMakeRequest
メソッドが必要でした。送信するコンテンツを格納するDictionary<string, string>
オブジェクトを作成し、HttpRequestMessage
Content
プロパティを設定します:
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);
}