এইচটিটিপি ক্লায়েন্ট প্রতিক্রিয়া থেকে জিজেপ স্ট্রিমকে সঙ্কোচিত করছে


97

আমি এমন একটি এপিআই-র সাথে সংযোগ স্থাপনের চেষ্টা করছি, যা জিজেপ এনকোডড জেএসওনকে ডাব্লুসিএফ পরিষেবা (ডাব্লুসিএফ পরিষেবা ডাব্লুসিএফ পরিষেবা) থেকে ফেরত দেয়। আমি এপিআই-তে সংযোগ রাখতে HTTPClient ব্যবহার করছি এবং JSON অবজেক্টটিকে স্ট্রিং হিসাবে ফিরিয়ে দিতে সক্ষম হয়েছি। তবে আমার এই ফিরিয়ে নেওয়া ডেটাটি একটি ডাটাবেসে সংরক্ষণ করতে সক্ষম হওয়া দরকার এবং যেমনটি আমি জেনেছি যে ভাল উপায় হচ্ছে JSON অবজেক্টটিকে একটি অ্যারে বা বাইটে বা সেই লাইনে বরাবর কিছুতে সংরক্ষণ করা।

বিশেষ করে আমার যে সমস্যাটি হচ্ছে তা হ'ল জিজেপ এনকোডিংটি সঙ্কোচন করা এবং প্রচুর বিভিন্ন উদাহরণ চেষ্টা করেও এখনও তা পাওয়া যায় না।

নীচের কোডটি হ'ল আমি কীভাবে আমার সংযোগ স্থাপন করছি এবং প্রতিক্রিয়া পাচ্ছি, এটি কোড যা এপিআই থেকে স্ট্রিং দেয়।

public string getData(string foo)
{
    string url = "";
    HttpClient client = new HttpClient();
    HttpResponseMessage response;
    string responseJsonContent;
    try
    {
        client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
        response = client.GetAsync(url + foo).Result;
        responseJsonContent = response.Content.ReadAsStringAsync().Result;
        return responseJsonContent;
    }
    catch (Exception ex)
    {
        System.Windows.Forms.MessageBox.Show(ex.Message);
        return "";
    }
}

আমি এই স্ট্যাকএক্সচেঞ্জ এপিআই , এমএসডিএন এবং স্ট্যাকওভারফ্লোতে থাকা একটি দম্পতির মতো কয়েকটি পৃথক উদাহরণ অনুসরণ করে চলেছি , তবে আমার পক্ষে কাজ করার জন্য আমি এর কোনওটি পেতে সক্ষম হইনি।

এটি সম্পাদন করার সর্বোত্তম উপায় কী, আমি কি সঠিক পথে রয়েছি?

ধন্যবাদ বন্ধুরা.


"সর্বোত্তম উপায় হ'ল JSON অবজেক্টটিকে একটি অ্যারে বা বাইটে সঞ্চয় করা" নোট করুন যে স্ট্রিংটি বাইটের একটি অ্যারে।
ব্যবহারকারী 3285954

উত্তর:


239

এইচটিটিপিপ্লায়েন্টকে কেবল ইনস্ট্যান্ট করুন:

HttpClientHandler handler = new HttpClientHandler()
{
    AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate
};

using (var client = new HttpClient(handler))
{
    // your code
}

জুন 19, 2020 আপডেট করুন: এটি কোনও 'ব্যবহার' ব্লকে httpclient ব্যবহার করার পরামর্শ দেওয়া হয়নি কারণ এটি বন্দর ক্লান্তি হতে পারে।

private static HttpClient client = null;

ContructorMethod()
{
   if(client == null)
   {
        HttpClientHandler handler = new HttpClientHandler()
        {
            AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate
        };        
        client = new HttpClient(handler);
   }
// your code            
 }

। নেট কোর ২.১+ ব্যবহার করা হলে, আইএইচটিপিপ্লিয়েন্টফ্যাক্টরি ব্যবহার এবং আপনার স্টার্টআপ কোডে এই জাতীয় ইনজেকশন বিবেচনা করুন ।

 var timeout = Policy.TimeoutAsync<HttpResponseMessage>(
            TimeSpan.FromSeconds(60));

 services.AddHttpClient<XApiClient>().ConfigurePrimaryHttpMessageHandler(() => new HttpClientHandler
        {
            AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate
        }).AddPolicyHandler(request => timeout);

আমি যদি এই কাঠামোটি ব্যবহার করি তবে আমি কীভাবে এইচটিসিপিএলেন্টের থেকে আমার প্রতিক্রিয়াটির বিষয়বস্তুটি পুনরুদ্ধার করব? আমি সি # তে নতুন নতুন এবং আমার মনে হয় না আমি এটি পাচ্ছি।
ফক্সডেপলয়ে

4
আপনি এই সমাধানটি ব্যবহার করার সময় @ ফক্সডেপ্লয়ে কোনও বিষয়বস্তু পেতে কোডের কোনও পরিবর্তন দরকার নেই। রেফারেন্সের জন্য এখানে দেখুন: স্ট্যাকওভারফ্লো
ডিআইজি

4
যদিও এটি একটি পুরাতন পোস্ট, এই উত্তরটি আমার নেটটোরের মধ্যে সবেমাত্র 1.1 থেকে 2.0 তে সরে গেছে বলে মনে হচ্ছে ক্লায়েন্টটি স্বয়ংক্রিয়ভাবে ডিকম্প্রেশন করছে, কাজেই এটির জন্য আমাকে এই কোডটি 2.0 এ যুক্ত করতে হয়েছিল ... ধন্যবাদ !
সেবাস্তিয়ান কাস্তালদি

4
কেবলমাত্র @SbasbasCastaldi এ পিগির পিছনে, কিন্তু। নেট কোর 1.1 এ অটোমেটিকডেকম্প্রেশন সঠিকভাবে সেট হয়েছে, তবে। নেট কোর ২.০ এ এটি কোনও নয় set এটি বের করার জন্য আমাকে অনেক দীর্ঘ সময় নিয়েছে ...
কলড্রেইক্সিক্স

4
দ্রষ্টব্য: HttpClientভিতরে ব্যবহার করা উচিত নয়using
imba-tjd

1

ঠিক আছে তাই আমি শেষ পর্যন্ত আমার সমস্যার সমাধান করেছি। আরও ভাল উপায় থাকলে দয়া করে আমাকে জানান :-)

        public DataSet getData(string strFoo)
    {
        string url = "foo";

        HttpClient client = new HttpClient();
        HttpResponseMessage response;   
        DataSet dsTable = new DataSet();
        try
        {
               //Gets the headers that should be sent with each request
            client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
              //Returned JSON
            response = client.GetAsync(url).Result;
              //converts JSON to string
            string responseJSONContent = response.Content.ReadAsStringAsync().Result;
              //deserializes string to list
            var jsonList = DeSerializeJsonString(responseJSONContent);
              //converts list to dataset. Bad name I know.
            dsTable = Foo_ConnectAPI.ExtentsionHelpers.ToDataSet<RootObject>(jsonList);
              //Returns the dataset                
            return dsTable;
        }
        catch (Exception ex)
        {
            System.Windows.Forms.MessageBox.Show(ex.Message);
            return null;
        }
    }

       //deserializes the string to a list. Utilizes JSON.net. RootObject is a class that contains the get and set for the JSON elements

    public List<RootObject> DeSerializeJsonString(string jsonString)
    {
          //Initialized the List
        List<RootObject> list = new List<RootObject>();
          //json.net deserializes string
        list = (List<RootObject>)JsonConvert.DeserializeObject<List<RootObject>>(jsonString);

        return list;
    }

রুটবজেক্টটিতে জেট সেট রয়েছে যা জেএসএনের মান পাবে।

public class RootObject
{  
      //These string will be set to the elements within the JSON. Each one is directly mapped to the JSON elements.
      //This only takes into account a JSON that doesn't contain nested arrays
    public string EntityID { get; set; }

    public string Address1 { get; set; }

    public string Address2 { get; set; }

    public string Address3 { get; set; }

}

উপরের ক্লাসটি তৈরি করার সহজ উপায় হ'ল json2charp ব্যবহার করা যা সে অনুসারে এটি ফর্ম্যাট করবে এবং সঠিক ডেটাটাইপগুলি সরবরাহ করবে।

নীচে আবার স্ট্যাকওভারফ্লো এর অন্য উত্তর থেকে এটি নেস্টেড জেএসওএন বিবেচনায় নেয় না।

    internal static class ExtentsionHelpers
{
    public static DataSet ToDataSet<T>(this List<RootObject> list)
    {
        try
        {
            Type elementType = typeof(RootObject);
            DataSet ds = new DataSet();
            DataTable t = new DataTable();
            ds.Tables.Add(t);

            try
            {
                //add a column to table for each public property on T
                foreach (var propInfo in elementType.GetProperties())
                {
                    try
                    {
                        Type ColType = Nullable.GetUnderlyingType(propInfo.PropertyType) ?? propInfo.PropertyType;

                            t.Columns.Add(propInfo.Name, ColType);

                    }
                    catch (Exception ex)
                    {
                        System.Windows.Forms.MessageBox.Show(ex.Message);
                    }

                }
            }
            catch (Exception ex)
            {
                System.Windows.Forms.MessageBox.Show(ex.Message);
            }

            try
            {
                //go through each property on T and add each value to the table
                foreach (RootObject item in list)
                {
                    DataRow row = t.NewRow();

                    foreach (var propInfo in elementType.GetProperties())
                    {
                        row[propInfo.Name] = propInfo.GetValue(item, null) ?? DBNull.Value;
                    }

                    t.Rows.Add(row);
                }
            }
            catch (Exception ex)
            {
                System.Windows.Forms.MessageBox.Show(ex.Message);
            }

            insert.insertCategories(t);
            return ds.
        }
        catch (Exception ex)
        {
            System.Windows.Forms.MessageBox.Show(ex.Message);

            return null;
        }
    }
};

তারপরে পরিশেষে JSON- এ ম্যাপযুক্ত কলামগুলির সাথে একটি টেবিলের উপরের ডেটাসেটটি সারণিতে আমি এসকিউএল বাল্ক অনুলিপি এবং নিম্নলিখিত ক্লাসটি ব্যবহার করেছি

public class insert
{ 
    public static string insertCategories(DataTable table)
    {     
        SqlConnection objConnection = new SqlConnection();
          //As specified in the App.config/web.config file
        objConnection.ConnectionString = System.Configuration.ConfigurationManager.ConnectionStrings["foo"].ToString();

        try
        {                                 
            objConnection.Open();
            var bulkCopy = new SqlBulkCopy(objConnection.ConnectionString);

            bulkCopy.DestinationTableName = "dbo.foo";
            bulkCopy.BulkCopyTimeout = 600;
            bulkCopy.WriteToServer(table);

            return "";
        }
        catch (Exception ex)
        {
            System.Windows.Forms.MessageBox.Show(ex.Message);
            return "";
        }
        finally
        {
            objConnection.Close();
        }         
    }
};

সুতরাং উপরের কাজ করে একটি ওয়েবএপিআই থেকে একটি ডাটাবেসে জেএসএন sertোকানোর জন্য। এটি এমন কিছু যা আমি কাজ করতে পারি। তবে কোনও উপায়েই আমি এটি নিখুঁত হওয়ার প্রত্যাশা করি না। আপনার যদি কোনও উন্নতি হয় তবে দয়া করে এটি আপডেট করুন।


4
অন্তর্নিহিত স্ট্রিমগুলির যথাযথ, সময়োপযোগী নিষ্পত্তি এবং বন্ধের বিষয়টি নিশ্চিত করার জন্য HttpClientআপনার প্রতিটি এবং HttpResponseএকটি using()বিবৃতি তৈরি করা উচিত ।
ইয়ান মেরার 0

1

আমি জিজিপ স্ট্রিমটি সংক্ষেপিত করতে নীচের লিঙ্ক থেকে কোড ব্যবহার করেছি hen তারপরে প্রয়োজনীয় জেএসওএন অবজেক্টটি পেতে সংক্ষেপিত বাইট অ্যারে ব্যবহার করেছি। আশা করি এটি কারওর পক্ষে সহায়তা করতে পারে।

var readTask = result.Content.ReadAsByteArrayAsync().Result;
var decompressedData = Decompress(readTask);
string jsonString = System.Text.Encoding.UTF8.GetString(decompressedData, 0, decompressedData.Length);
ResponseObjectClass responseObject = Newtonsoft.Json.JsonConvert.DeserializeObject<ResponseObjectClass>(jsonString);

https://www.dotnetperls.com/decompress

static byte[] Decompress(byte[] gzip)
{
    using (GZipStream stream = new GZipStream(new MemoryStream(gzip), CompressionMode.Decompress))
    {
        const int size = 4096;
        byte[] buffer = new byte[size];
        using (MemoryStream memory = new MemoryStream())
        {
            int count = 0;
            do
            {
                count = stream.Read(buffer, 0, size);
                if (count > 0)
                {
                    memory.Write(buffer, 0, count);
                }
            }
            while (count > 0);
            return memory.ToArray();
        }
    }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.