WebRequestでPOSTリクエストを送信して、レスポンスの文字列とステータスコードを受け取る

WebRequestでPOSTリクエストを送信して、レスポンスの文字列とステータスコードを受け取る

/// <summary>
/// POSTリクエストする
/// </summary>
/// <param name="requestUri">リクエスト先URL</param>
/// <param name="postData">POST送信するデータ</param>
/// <param name="responseEncofing">レスポンスのエンコード</param>
/// <param name="result">リクエスト結果出力先</param>
/// <remarks>
/// WebRequest#GetResponseのWebExceptionは関数内部でキャッチするが、
/// その他の例外はハンドリングしない。
///
/// なので WebRequest#GetRequestStream 時のWebExceptionや ArgumentException,
/// InvalidOperationException, IOExceptionなどの例外が送出される可能性あり。
/// </remarks>
/// <returns>HTTPステータスコードを返す。
/// レスポンスが存在しない場合は 0 を返す</returns>
public static HttpStatusCode PostRequest(Uri requestUri,
  byte[] postData,
  Encoding responseEncoding,
  out string result)
{
  if (postData == null)
  {
    postData = new byte[0];
  }

  HttpWebRequest request = null;
  HttpWebResponse response = null;
  try
  {
    request = HttpWebRequest.Create(requestUri) as HttpWebRequest;
    request.ContentLength = postData.Length;
    request.Method = "POST";
    request.ContentType = "application/x-www-form-urlencoded";
    request.CachePolicy = new HttpRequestCachePolicy(
      HttpRequestCacheLevel.NoCacheNoStore);
    request.Timeout = 1000; // タイムアウト 1000ミリ秒
    // その他の設定
    // request.KeepAlive = false;
    // request.ServicePoint.Expect100Continue = false;
    // request.Proxy = new WebProxy("http://example.com");

    using (Stream requestStream = request.GetRequestStream())
    {
      requestStream.Write(postData, 0, postData.Length);
    }

    try
    {
      response = request.GetResponse() as HttpWebResponse;
    }
    catch (WebException ex)
    {
      // レスポンスのHTTPステータスが500などの場合
      response = ex.Response as HttpWebResponse;
      if (response == null)
      {
        // 接続不能だったりタイムアウトの場合は 0 を返す
        result = null;
        return 0;
      }
    }

    using (Stream responseStream = response.GetResponseStream())
    using (StreamReader reader = new StreamReader(responseStream, responseEncoding))
    {
      result = reader.ReadToEnd();
      return response.StatusCode;
    }
  }
  finally
  {
    if (request != null)
    {
      request.Abort(); // 念のため…必要ないとは思うけど
    }

    if (response != null)
    {
      response.Close();
    }
  }
}
Share
関連記事