Aklımda Kalası Kelimeler

* давайте работать вместе
* Zarf ve Mazruf, Zerafet(xHoyratlık) ile aynı kökten(za-ra-fe) gelir
* Bedesten
* Suç subuta ermiştir - Suç sabit olmuştur
Fiddler etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
Fiddler etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster

16 Nisan 2015 Perşembe

Fiddler ile SQL Server'dan yapılan Web Servis Çağrılarını İzlemek

Fiddler and Microsoft Sql Server

SQL Prosedürmüzde sp_OACreate ile Web Servisi çağrısı yapacağımız bir OLE nesnesi örneğini yaratıp üstünden bir HTTP paketi gönderebiliriz ama Fiddler bunu göstermeyecek. Haydi başlayalım...
Temel itibarıyla aşağıdaki basit kod ile herhangi bir web sayfasını mssql içinden çağırabilirsiniz:
DECLARE @Request INT,
  @hr INT,
  @activeX VARCHAR(50) = 'Msxml2.ServerXMLHTTP.6.0';

 SET @activeX = '{88d96a0b-f192-11d4-a65f-0040963251e5}';
 EXEC @hr = sp_OACreate @activeX, @Request OUT;
 SELECT @hr, @Request
 
 EXEC sp_OAMethod @Request, 'open', NULL, 'GET','https://www.random.org/cgi-bin/randbyte?nbytes=1307&format=h', 'false'
 EXEC sp_OAMethod @Request, 'send', null, ''
  
 DECLARE @ResponseText Varchar(4000)
 EXEC sp_OAMethod @Request, 'responseText', @ResponseText OUTPUT
 SELECT @ResponseText
 Exec sp_OADestroy @Request
 
 IF @hr <> 0
 BEGIN
       DECLARE @src varchar(255), @desc varchar(255)
    EXEC sp_OAGetErrorInfo @Request, @src OUT, @desc OUT 
    SELECT hr=convert(varbinary(4),@hr), Source=@src, Description=@desc
    RETURN
 END
 ELSE
    Exec sp_OADestroy @Request

Ekşi Sözlük'te Ole tanımları:
Biraz anlatayım ne nedir diye. sp_OACreate ile MSSQL içinde bir OLE nesnesinin örneğini yaratır.

ole 2.0 kendi icinde (bkz: com) (bkz: activex) gibi teknolojileri icherir..

nesne baglama ve nesne gomme(yerleshtirme). bir yazilim tarafindan olushturulan bir nesnenin ozelliklerini kaybetmeden bashka bir yazilim tarafindan kullanilabilmesini saglar. bu tur nesneler uzerinde deishiklik yapmak istenirse nesne uzerinden orjinal yazilima baglanmak olanaklidir.

object linking and embedding kisaltmasidir turkcesi ise nesne baglama ve gömme olarak cevrile bilir microsoft office uygulamaları arasında verialı$veri$ini mümkün kılan teklojinin adıdır.ole'nin 2 farkli boyutta islem gormektedir.bunlar baglama ve gömme ne demek simdi bu derseniz sole ki excelde bi islem yaptınız worldbelgesine transferini yapmayı dusunuyorsunuz iste bu hadise bunu mumkun kılmaktadır.

Demek ki bizim bir nesnemiz var ve ondan bir örnek yaratıp, örneğimiz üzerinden işlemler yapmak istiyoruz.

Peki buradaki OLE nesnemiz olan Msxml2.ServerXMLHTTP.6.0 kimdir?

Önce MSXML'den başlayalım. Microsoft XML Core Services (MSXML) W3C uyumlu XML API leri ile yüksek performanslı XML temelli uygulamalar geliştirmeye yarar. Bu kısım biraz genişçe devam edebilir ama konumuzdan sapmayacağım. Neydi konumuz Fiddler ile SQL Server üstünden yaptığımız Web Servisi çağrılarını görüntülemek.
Sırada bu örneği yaratırken kullandığımız INT tipinde @hr ve @Request değişkenleri. @hr sayesinde bu örnekleme işimiz eğer 0 dan başka bir sonuç gelmişse HATA olarak değerlendirecek ve hatayı görüntülemek için IF @hr <> 0 satırını kullanacağız. Burada detaylandırılacak bir şey varsa ben bilmiyorum. Gelin ekran çıktılarına bakalım:

Peki BAŞARISIZ bir örneklendirmeye bakalım:

Açıktırki örneklendiremememiz makinede olmayan bir OLE nesnesini kullanmak arzumuzdan.
Msxml2.ServerXMLHTTP.6.0 OLE nesnesi sistemimizde kayıtlıyken

Msxml2.ServerXMLHTTP.5.0 Registry'de kayıtlı değil.
Sorgulamak için registry sorgusu da deneyebilirsiniz:
C:\>reg query hkcr /f xmlhttp

HKEY_CLASSES_ROOT\Microsoft.XMLHTTP
HKEY_CLASSES_ROOT\Microsoft.XMLHTTP.1.0
HKEY_CLASSES_ROOT\Msxml2.ServerXMLHTTP
HKEY_CLASSES_ROOT\Msxml2.ServerXMLHTTP.3.0
HKEY_CLASSES_ROOT\Msxml2.ServerXMLHTTP.4.0
HKEY_CLASSES_ROOT\Msxml2.ServerXMLHTTP.6.0
HKEY_CLASSES_ROOT\Msxml2.XMLHTTP
HKEY_CLASSES_ROOT\Msxml2.XMLHTTP.3.0
HKEY_CLASSES_ROOT\Msxml2.XMLHTTP.4.0
HKEY_CLASSES_ROOT\Msxml2.XMLHTTP.6.0
End of search: 10 match(es) found.

C:\>

Ayrıca OLE nesnelerimizi ProgId ya da ClsId ile çağırabiliriz

Peki CLS Id nedir?

Ya ProgId?

OLE nesnelerimizi eğer CLS ID leri ile yaratmak istersek önce CLS ID lerini nerede bulabileceğimize bakalım:

Ve şimdide CLS ID ile SQL içinde örnekleme işine bakalım:

Devamını yazacağım ama önce Verdi nin konserine gitmeliyim. Yarın devam ederim ;)

Bir Verdi Konseri harikaydı...

Fiddler SQL'i nasıl dinler

Normalde dinlemesini bekleriz ama Fiddler'e düşmez SQL web servis çağrılarınız. SQL Server sizin login olduğunuz oturum üstünden çalışmadığı için Fiddler görüntüleyemeyecektir.
Aşağıda nasıl yapacağımızı görelim:
Artık fiddler sql web service çağrılarını görebileceksiniz.

Neden tüm web servis çağrılarım Fiddler'e düşmüyor

Önce düşen web servis sonuçları var ve düşmeyen var. O halde sorunu tespit için fiddlere baktım ve http talebinin sonuçlarının boyutundan şüphelendim. Bunu test etmek için dönen cevabın boyutunu ayarlayabileceğim bir site buldum. Url adresinden dönecek sonucun boyutunu değiştirebilirsiniz https://www.random.org/cgi-bin/randbyte?nbytes=1324&format=h ve fiddler üstünde görebiliyorsunuz.
SQL kodumuzla çağrı yapalım ve sonucu SQL tarafından alınamayan durumu inceleyelim:
DECLARE @Request INT,
  @hr INT,
  @activeX VARCHAR(50) = 'Msxml2.ServerXMLHTTP.6.0';
  SET @activeX = '{88d96a0b-f192-11d4-a65f-0040963251e5}';

EXEC @hr = sp_OACreate @activeX, @Request OUT;
EXEC sp_OAMethod @Request, 'open', NULL, 'GET','https://www.random.org/cgi-bin/randbyte?nbytes=1307&format=h', 'false'
EXEC sp_OAMethod @Request, 'send', null, ''

DECLARE @ResponseText Varchar(4000)
EXEC sp_OAMethod @Request, 'responseText', @ResponseText OUTPUT
SELECT @ResponseText as Response
Exec sp_OADestroy @Request
 
IF @hr <> 0
BEGIN
   DECLARE @src varchar(255), @desc varchar(255)
   EXEC sp_OAGetErrorInfo @Request, @src OUT, @desc OUT 
   SELECT hr=convert(varbinary(4),@hr), Source=@src, Description=@desc
   RETURN
END
ELSE
 Exec sp_OADestroy @Request

Bu kezde başarılı bir web sayfası çağrısını SQL'den yapalım:

Peki Sorun OLE Nesnesinde mi?

SQL'de göremiyoruz ama arada OLE nesnemiz var acaba sorun onda mı? OLE nesnemizin çektiği sonucu bir dosyaya yazalım ve görelim gelen cevabı kesiyor ya da kırpıyormu.
Test için yine fiddler ve OLE nesnemizden örneğimizi yazıp konsoldan çalıştırmak için bir script dosyası oluşturalım.
Dim oXMLHTTP
Dim oStream

Set oXMLHTTP = CreateObject("MSXML2.ServerXMLHTTP.6.0")

Dim byteSize 
byteSize="1306"

oXMLHTTP.Open "GET", "https://www.random.org/cgi-bin/randbyte?nbytes="+byteSize+"&format=h", False
oXMLHTTP.Send

If oXMLHTTP.Status = 200 Then
 Wscript.Echo oXMLHTTP.responseBody
 Set oStream = CreateObject("ADODB.Stream")
 oStream.Open
 oStream.Type = 1
 oStream.Write oXMLHTTP.responseBody
 oStream.SaveToFile "c:\temp\sonuc"+byteSize+".txt"
 oStream.Close
End If
Yukarıdaki kodumuzun çalışması için MSXML nin internet explorer->internet options -> Security Settings -> Custom Level -> Access data sources accross domains -> Enable ayarının yapılması gerekecek:

4000 altındaki cevapları SQL içinde görebildiğimiz için öncelikle bunu dosyaya yazdırabiliyor muyuz diye bakalım:

SQL'e yazdıramadığımız sonucu bakalım dosyaya yazabilecek miyiz ve acaba OLE nesnemiz mi SQL'e aktarmıyor diye kontrol edelim:
Geldiğimiz noktada sorun sp_OACreate 'in NVarchar(4000) limitine takılmamızmış :) Öğrendiğim adres ve çözmek isterseniz çözümleri için buraya veya buraya tıklayabilirsiniz.

Bu noktadan sonra ben .Net assemblysi yazarak ilgili fonksiyonlarını çağırmayı tercih edeceğim :)

Azim ve bilgi dolu okumalar olsun....

1 Nisan 2015 Çarşamba

Fiddler ile WCF servisini çağırmak

WSDL'ı parça parça aşağıdan okuyalım.

Çağıracağımız fonksiyonda iki farklı tipte iki parametre var QueryInboxInvoiceStatus(InvoiceLogin _invoiceLogin, string[] _invoiceIds)
İşte fonksiyonumuzun WSDL'daki ifadesi:
<xs:element name="QueryInboxInvoiceStatus">
 <xs:complexType>
  <xs:sequence>
   <xs:element xmlns:q29="http://schemas.datacontract.org/2004/07/FMC.Turkiye.Lib.EInvoice" minOccurs="0" name="_invoiceLogin" nillable="true" type="q29:InvoiceLogin"/>
   <xs:element xmlns:q30="http://schemas.microsoft.com/2003/10/Serialization/Arrays" minOccurs="0" name="_invoiceIds" nillable="true" type="q30:ArrayOfstring"/>
  </xs:sequence>
 </xs:complexType>
</xs:element>

_invoiceIds parametremiz string tipinde bir dizi. Bunda dikkat edeceğimiz husus xml namespace bilgisinin doğru yazılması. Karmaşık bir tip(complex type) olmadığı için detayı yok ama InvoiceLogin için var:
<xs:complexType name="InvoiceLogin">
 <xs:sequence>
  <xs:element minOccurs="0" name="Password" nillable="true" type="xs:string"/>
  <xs:element minOccurs="0" name="UserName" nillable="true" type="xs:string"/>
 </xs:sequence>
</xs:complexType>
2 tane string tipinde özelliği olan bir sınıf. Şuna benziyor olsa gerek:
class InvoiceLogin
{
  public string UserName;
  public string Password;
}
Şimdi xml namespace bilgileri fiddler ile talebimizi yaparken nasıl yer alıyor:


O halde bu web servis metodunu çağırdığımak için aşağıdaki http gövdesini kullanacağız:
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
 <s:Body>
  <QueryInboxInvoiceStatus xmlns="http://gib.fresenius.com.tr/FEFatura">
   <_invoiceLogin xmlns:a="http://schemas.datacontract.org/2004/07/FMC.Turkiye.Lib.EInvoice" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
    <a:Password>şifremiz</a:Password>
    <a:UserName>kullanıcıAdı</a:UserName>
   </_invoiceLogin>
   <_invoiceIds  xmlns:b="http://schemas.microsoft.com/2003/10/Serialization/Arrays" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
    <b:string>353d5faf-f227-4600-8efe-3fb5ab0f1f48</b:string>
   </_invoiceIds>
  </QueryInboxInvoiceStatus>
 </s:Body>
</s:Envelope>

Bu da fiddler üstünden çağırmak için kullanacağımız http talebi ve cevabı:
POST http://localhost:53644/FEInvoice.svc HTTP/1.1
Content-Type: text/xml; charset=utf-8
VsDebuggerCausalityData: uIDPoxWgzmMUISZHhT9DgBmdvzAAAAAAA/+at96K6Uq35zPRjKxBIsVGn2pZnrlOgakzi+yKWdsACQAA
SOAPAction: "http://gib.fresenius.com.tr/FEFatura/IFEInvoice/QueryInboxInvoiceStatus" 
Host: localhost:53644
Content-Length: 677
Expect: 100-continue
Accept-Encoding: gzip, deflate
Connection: Keep-Alive

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
 <s:Body>
  <QueryInboxInvoiceStatus xmlns="http://gib.fresenius.com.tr/FEFatura">
   <_invoiceLogin xmlns:a="http://schemas.datacontract.org/2004/07/FMC.Turkiye.Lib.EInvoice" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
    <a:Password>şifremizBudur</a:Password>
    <a:UserName>kullaniciAdimizBuOlsun</a:UserName>
   </_invoiceLogin>
   <_invoiceIds  xmlns:b="http://schemas.microsoft.com/2003/10/Serialization/Arrays" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
    <b:string>353d5faf-f227-4600-8efe-3fb5ab0f1f48</b:string>
   </_invoiceIds>
  </QueryInboxInvoiceStatus>
 </s:Body>
</s:Envelope>

HTTP/1.1 200 OK
Content-Type: text/xml; charset=utf-8
Vary: Accept-Encoding
Server: Microsoft-IIS/8.0
X-SourceFiles: =?UTF-8?B?QzpcUHJvamVsZXJcRk1DLlR1cmtpeWUuV2NmLkVGYXR1cmFcdHJ1bmtcRkVJbnZvaWNlLnN2Yw==?=
X-Powered-By: ASP.NET
Date: Wed, 01 Apr 2015 10:07:45 GMT
Content-Length: 929

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
 <s:Body>
  <QueryInboxInvoiceStatusResponse xmlns="http://gib.fresenius.com.tr/FEFatura">
   <QueryInboxInvoiceStatusResult xmlns:a="http://schemas.datacontract.org/2004/07/FMC.Turkiye.Lib.EInvoice" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
    <a:Nesne i:nil="true"/>
    <a:hasError>false</a:hasError>
    <a:invoiceResult i:nil="true"/>
    <a:islem>QueryInboxInvoiceStatus Metodu</a:islem>
    <a:istisna i:nil="true"/>
    <a:lstWsResult>
     <a:WSResult>
      <a:Nesne i:nil="true"/>
      <a:hasError>false</a:hasError>
      <a:invoiceResult i:nil="true"/>
      <a:islem>QueryInboxInvoiceStatus Metodu</a:islem>
      <a:istisna i:nil="true"/>
      <a:lstWsResult/>
      <a:sonuc i:nil="true"/>
      <a:succeedTransaction>true</a:succeedTransaction>
     </a:WSResult>
    </a:lstWsResult>
    <a:sonuc i:nil="true"/>
    <a:succeedTransaction>false</a:succeedTransaction>
   </QueryInboxInvoiceStatusResult>
  </QueryInboxInvoiceStatusResponse>
 </s:Body>
</s:Envelope>

Uyumsoft WCF Servisine Talep

Şimdi bu talebi uyumsoft'un e-fatura servislerine nasıl yapabiliriz bakalım ve bilgimizi ikinci bir örnek ile ilerletelimki anlayışımız artsın.
Önce metodumuzu wsdl içinde bulalım:
soapAction servisi çağırırken hangi metodu çağıracağı bilgisini içeriyor.

input ile metoda verilecek parametreleri, output ile çıktı olarak üreteceği sonucu görüyorsunuz.

Peki parametrenin veri tipi ne?
ArrayOfString tipi olacak.

Şimdi talebimizi yapalım:
POST https://efatura.uyumsoft.com.tr/Services/Integration HTTP/1.1
Content-Type: text/xml; charset=utf-8
SOAPAction: "http://tempuri.org/IIntegration/QueryInboxInvoiceStatus"
Host: efatura.uyumsoft.com.tr
Expect: 100-continue
Accept-Encoding: gzip, deflate
Connection: Keep-Alive
Content-Length: 937


 
  
   
    kullaniciAdimiz
    şifremiz
   
  
 
 
  
   
    353d5faf-f227-4600-8efe-3fb5ab0f1f48
   
  
 

Ve cevabımız:
HTTP/1.1 200 OK
Cache-Control: private
Content-Type: text/xml; charset=utf-8
Vary: Accept-Encoding
Server: Microsoft-IIS/7.5
Set-Cookie: ASP.NET_SessionId=giq1anjro5kiajmwxzar1t11; path=/; HttpOnly
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET
Date: Wed, 01 Apr 2015 11:26:03 GMT
Content-Length: 845


 
  
   
    2015-04-01T11:26:04.353Z
    2015-04-01T11:31:04.353Z
   
  
 
 
  
   
    
   
  
 

Kolay gelsin....

17 Mart 2015 Salı

Only Web services with a [ScriptService] attribute on the class definition can be called from script.

Hata aşağıdaki gibi:

Servisimizde:
<%@ WebService Language="C#" Class="NSCem.Cem" %>

using System;
using System.Collections.Generic;
using System.Configuration;
using System.Web.Services;
using System.Xml.Serialization;

namespace NSCem
{
    [WebService(Namespace = "http://tempuri.org/")]
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
    [System.ComponentModel.ToolboxItem(false)]
    //[System.Web.Script.Services.ScriptService]
    public class Cem : System.Web.Services.WebService
    {
  [WebMethod]
        public string f_Hello(string _gelen)
        {
   return "Gelen: "+_gelen;
  }
    }
}

Olması gereken
...
    [System.ComponentModel.ToolboxItem(false)]
    //[System.Web.Script.Services.ScriptService]
    public class Cem : System.Web.Services.WebService
    {
...


POST /HTUS/cem.asmx/f_Hello HTTP/1.1
Host: 10.130.214.205:8082
Content-Type: application/json; charset=utf-8
Cache-Control: no-cache

{"_gelen":"cem"}

Fiddler ile web servisine çağrı yapmak

Bu yazdığımız servis:

POST http://10.130.214.205:8082/HTUS/HastaTahlilUyariServisi.asmx HTTP/1.1
HOST: 10.130.214.205:80828
Content-Type: text/xml; charset=utf-8
SoapAction: "http://tempuri.org/f_HastaninLabTestleri"
Content-Length: 863

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Header>
    <Ticket xmlns="http://tempuri.org/">
      <TicketNumber>string</TicketNumber>
    </Ticket>
  </soap:Header>
  <soap:Body>
    <f_HastaninLabTestleri xmlns="http://tempuri.org/">
      <_enumKanTahlilikontrolTarih>KAYITTARIHI</_enumKanTahlilikontrolTarih>
      <_enumHastaKontrolKodu>KLINIK_KODU</_enumHastaKontrolKodu>
      <_sCliniclist>18043</_sCliniclist>
      <_dtBaslamaTarihi>2015-01-07</_dtBaslamaTarihi>
      <_dtBitisTarihi>2015-01-07</_dtBitisTarihi>
      <_sTCKimlikNO>32963180024</_sTCKimlikNO>
      <_bGonderilmis>true</_bGonderilmis>
    </f_HastaninLabTestleri>
  </soap:Body>
</soap:Envelope>

XML içerikli bir request yaptık. Fiddler görüntüsü:

Sonucu:

POSTMAN ile yaptığımızda ilk olarak şu hatayı alabiliriz:
Request format is unrecognized for URL unexpectedly ending in '/f_HastaninLabTestleri'.
Metot adının POST ve GET metotlarıyla çağrılabilmesine dair web.config içinde ayar yapmamız gerekecek:
<configuration>
    <system.web>
    <webServices>
        <protocols>
            <add name="HttpGet"/>
            <add name="HttpPost"/>
        </protocols>
    </webServices>
    </system.web>
</configuration>
Kaynak: Stackoverflow sorusu.

Şimdi sonucu çekelim:

Şimdi bu talebin nasıl yapıldığına bakalım:
POST /HTUS/HastaTahlilUyariServisi.asmx/f_HastaninLabTestleri HTTP/1.1
Host: 10.130.214.205:8082
Cache-Control: no-cache
Content-Type: application/x-www-form-urlencoded

_enumKanTahlilikontrolTarih=KAYITTARIHI&_enumHastaKontrolKodu=KLINIK_KODU&_sCliniclist=18043&_dtBaslamaTarihi=2015%2F01%2F07&_dtBitisTarihi=2015%2F01%2F07&_sTCKimlikNO=32963180024&_bGonderilmis=true

11 Mart 2015 Çarşamba

How to set different default tab (like RAW) on fiddler's inspector view?, Fiddler de inspector görünümden farklı tab'ı varsayılan olarak yapmak

First you need to find QuickExec box:

Enter the config tab:

fiddler.ui.inspectors.request.alwaysuse RAW
fiddler.ui.inspectors.response.alwaysuse RAW

OR you can do with this QuickExec command:
PREFS SET fiddler.ui.inspectors.request.alwaysuse RAW
PREFS SET fiddler.ui.inspectors.response.alwaysuse RAW

And I wanted to add HTTP method column to fiddler and wanted to show how we can do:


Ref: http://stackoverflow.com/q/3319848/104085

28 Kasım 2014 Cuma

jQuery requires a window with a document

jQuery ile dom parse etmek içinde gezerek manipüle etmek istediğimde aldığım hataydı: jQuery requires a window with a document

jsdom, cheerio kullanımı tavsiye edilse de jQuery ile çalışmak için bir yol daha var. Şimdilik çok eski diyemeyeceğim 1.8.3 NodeJs tarafında çok fazlaca işlerimi gördüğünden
C:\Projeler\Test>npm install jquery@1.8.3
ile tam sürümünü kurabilirsiniz.

$ ile şöyle çalışabilirsiniz:
var fnCalisAbi = function () {
    var options = {
        method: 'GET',
        host: '127.0.0.1', // Fiddler içinde görünsün deyyu
        port: 8888,        // Fiddlerin dinlediği porta yönlendiriyoruz
        path: 'http://bidibidi.com/tata.aspx',
        headers: {
            Host: 'bidibidi.com',
            'Content-Type': 'application/x-www-form-urlencoded',
            'Cookie': "ASP.NET_SessionId=4etkmibuyjbg1qi3x04eouuz"
        }
    };
    var $ = require('jquery'),
        sayfa='';
    var req = http.request(options, function (res) {
        console.log('STATUS: ' + res.statusCode);
        console.log('HEADERS: ' + JSON.stringify(res.headers));

        res.setEncoding('utf8');  // sayfa cevap olarak utf8 gelecek

        res.on('data', function (chunk) {  // Tek bir pakette gelmezse ki gelmez, her parça geldiğinde
            sayfa+= chunk;                 // sayfa değişkenine ekleyelimki tüm html elimizde olsun
        });

        res.on('end', function (chunk) {   // Aktarım(response, cevap) tamamlandığında jQuery ile işleyelim
            $sayfa = $(sayfa);
            var tbl = $sayfa.find(".cssAdi").parents("table:first").find("tr").map(function() {
                return $(this).attr("style")
                    ? {
                        Cinsi:$(this).find("td:nth(1)").text(),
                        Miktari:$(this).find("td:nth(2)").text(),
                        Birim:$(this).find("td:nth(3)").text(),
                        Aciklama:$(this).find("td:nth(4)").text()
                      }
                    : null;
            }).get();
            console.log("Sonuçta oluşan dizi:");
            console.log(tbl);
        });
    });

    req.on('error', function (e) {
        console.log('problem with request: ' + e.message);
    });

    req.on('end', function (e) {

    });

    req.end();
};