7 Mart 2018 Çarşamba

HttpWebRequest Sınıfı

Giriş
Bu sınıf ftp için ve http get/post işlemleri için kullanılır. Sınıf web crawling işlemlerinde bütün sayfayı indirmeden belli alanları çekmek için kullanılabilir.

Constructor
Bu sınıfı yaratmak için WebRequest sınıfı factory gibi kullanılıyor. Şöyle yaparız.
WebRequest webRequest = WebRequest.Create("http://example.com");
Ancak çoğu kod cast etmeyi tercih ediyor.
var http = (HttpWebRequest)WebRequest.Create("http://example.com");
Accept Alanı
Şöyle yaparız.
request.Accept = "text/html";
Şöyle yaparız.
request.Accept = "text/html,application/xhtml+xml,application/xml";
AllowAutoRedirect Alanı
Şöyle yaparız.
request.AllowAutoRedirect = false;
AllowWriteStreamBuffering Alanı
Şöyle yaparız.
// Turn off the buffering of data to be written, to prevent
// OutOfMemoryException when sending data
requestToServer.AllowWriteStreamBuffering = false;
AutomaticDecompression Alanı - Veriyi Açmak
Gzip ve deflate kabul edip etmediğimizi şöyle belirtiriz. DecompressionMethod.GZip ve DecompressionMethod.Deflate OR'lanarak kullanılabilir.
request.AutomaticDecompression = DecompressionMethods.GZip;
ClientCertificates Alanı
Şöyle yaparız.
X509Certificate cert = ...;
string url = "https://...";
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.ClientCertificates.Add(cert);
request.Method = WebRequestMethods.Http.Get;

WebResponse basicResponse = request.GetResponse();
string responseString = new StreamReader(basicResponse.GetResponseStream()).ReadToEnd();
ContentLength Alanı
Şöyle yaparız.
long totalRequestBodySize = ...
request.ContentLength = totalRequestBodySize;
ContentType Alanı
Şöyle yaparız.
request.ContentType = "application/x-www-form-urlencoded;charset=utf-8";
Şöyle yaparız.
// Define a boundary string
string boundaryString = "----";
request.ContentType = "multipart/form-data; boundary=" + boundaryString;
Şöyle yaparız.
request.ContentType = "application/zip";
Çıktı olarak şunu görürüz.
PUT http://... HTTP/1.1
Content-Type: application/zip
...
ContinueTimeout Alanı
Şöyle yaparız.
request.ContinueTimeout = 1000;
CookieContainer Alanı
Önce isteğe bir Cookie nesnesi atanır.
CookieContainer c   = new CookieContainer();
request.CookieContainer = c;
İsteğe cookie şöyle eklenir.
request.CookieContainer.Add(new Cookie(c.Name, c.Value, c.Path, c.Domain));
Credentials Alanı
Şöyle yaparız.
request.Credentials = new NetworkCredential("auser", "apassword");
Şöyle yaparız.
request.Credentials = CredentialCache.DefaultCredentials;
GetRequestStream metodu
Post yaparken kullanılır. Stream'in kapatılması gerekir.
using (Stream stream = httpRequest.GetRequestStream())
{
  stream.Write(postBytes, 0, postBytes.Length);
}
GetResponse metodu
Get veya Post isteği göndeririz. Web sunucusunun gönderdiği cevabı HttpWebResponse nesnesi olarak alırız.
var response = (HttpWebResponse) request.GetResponse();
Eğer istek ftp ise şöyle yaparız.
using (var response = (FtpWebResponse)_request.GetResponse()) {...}
Bu GetResponse ile alınan nesnenin mutlaka kapatılması gerekir.
Note that you do need to dispose of the WebResponse returned by request.GetResponse - otherwise the underlying infrastructure won't know that you're actually done with it, and won't be able to reuse the connection.
Dolayısıyla kod şöyle yazılmalı.
using (HttpWebResponse response = (HttpWebResponse)httpRequest.GetResponse())
{
  // discard response
}
GetResponseAsync metodu
Şöyle yaparız.
HttpWebResponse response = await request.GetResponseAsync();
Headers
WebHeaderCollection Sınıfı yazısına taşıdım.

KeepAlive Alanı
Şöyle yaparız.
request.KeepAlive = true;
MaximumAutomaticRedirections Alanı
Şöyle yaparız.
request.MaximumAutomaticRedirections = 4;
MaximumResponseHeaderLength Alanı
Şöyle yaparız.
request.MaximumResponseHeadersLength = 4;
Method Alanı
Şöyle yaparız. String kullanmak yerine sabitleri kullanmak daha iyi.
request.Method = "POST";
Sabit için şöyle yaparız.
request.Method = WebRequestMethods.Http.Post;
ftp için şöyle yaparız.
request.Method = WebRequestMethods.Ftp.DownloadFile;
Proxy Alanı
Şöyle yaparız. WebProxy Sınıfı yazısına bakabilirsiniz.
string MyProxyHostString = "192.168.1.200";
int MyProxyPort = 8080;

request.Proxy = new WebProxy (MyProxyHostString, MyProxyPort);
Referrer Alanı
Şöyle yaparız.
request.Referer = "...";
ServerCertificateValidationCallback Alanı
Şöyle yaparız
HttpWebRequest request = ...;
request.ServerCertificateValidationCallback += (sender, certificate, chain,
  sslPolicyErrors) => true;
Timeout Alanı
Şöyle yaparız.
request.Timeout = 20000;
UserAgent Alanı
Şöyle yaparız.
request.UserAgent = "...";
Diğer

Http Post İle Login Olmak İçin kullanmak
Burada amaç logic olmak yani cookie almak. Alınan cookie daha sonraki her istekte gönderilir.
static string login(string url, string username, string password)
{
  HttpWebRequest req  = (HttpWebRequest)WebRequest.Create(url);
  string cookie       = "";
  string values       = "vb_login_username="+username+
                      "&vb_login_password="+password
                      + "securitytoken=guest&"
                      + "cookieuser=checked&"
                      + "do=login";
  req.Method          = "POST";
  req.ContentType     = "application/x-www-form-urlencoded";
  req.ContentLength   = values.Length;
  CookieContainer a   = new CookieContainer();
  req.CookieContainer = a;

  System.Net.ServicePointManager.Expect100Continue = false; // prevents 417 error

  using (StreamWriter writer = new StreamWriter(req.GetRequestStream(),
    System.Text.Encoding.ASCII)) 
  {
    writer.Write(values);           }

    HttpWebResponse c = (HttpWebResponse)req.GetResponse();
    foreach (Cookie cook in c.Cookies)            {
      cookie = cookie + cook.ToString() + ";";            }

    return cookie;
  }
Http Post İçin kullanmak
Basit bir örnek şöyle. Sınıfın Method, ContentType, ContentLength gibi alanları doldurulur.
var request = (HttpWebRequest) WebRequest.Create("https://example.com");

var postData = "&username=testing";
postData += "&password=Testing";
postData += "&hotelId=h075-103";
var data = Encoding.ASCII.GetBytes(postData);

request.Method = "POST";
request.ContentType = "application/x-www-form-urlencoded";
request.ContentLength = data.Length;
Daha sonra gönderilecek veri yazılır.
byte[] data = ...;
using (stream = request.GetRequestStream())
{
  stream.Write(data, 0, data.Length);
}
Ve post işlemi yapılıp cevap okunur.
var response = (HttpWebResponse) request.GetResponse();
if (response.GetResponseStream() != null)
{
  string str = new StreamReader(response.GetResponseStream()).ReadToEnd();
  ...
}
Eğer cevap xml ise şöyle kullanılabilir.
XmlDocument doc = new XmlDocument();
doc.LoadXml(str);
Http Get İçin Kullanmak
Basit bir örnek şöyle. Sınıfın Method, Accept alanları doldurulur. json döndüren bir API'yı çağırmak için şöyle yaparız.
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(path);
request.Method = WebRequestMethods.Http.Get;
request.Accept = "application/json";
HttpWebResponse response = (HttpWebResponse)request.GetResponse();


Hiç yorum yok:

Yorum Gönder