এইচটিটিপি অনুরোধ থেকে জেএসএন ডেটা ফিরে পাওয়া


91

আমার কাছে একটি ওয়েব অনুরোধ রয়েছে যা সঠিকভাবে কাজ করছে, তবে এটি কেবল স্থিতিটি ফিরিয়ে দিচ্ছে ঠিক আছে, তবে যে জিনিসটি আমি ফিরে পেতে চাইছি তা প্রয়োজন I আমি অনুরোধ করছি যে জসন মানটি কীভাবে পাবেন তা নিশ্চিত নই। আমি এইচটিটিপিপ্লিনেন্ট অবজেক্টটি ব্যবহার করতে নতুন, আমি এখানে এমন কোনও সম্পত্তি খুঁজে পাচ্ছি না যা আমি মিস করছি? আমার সত্যিকারের রিটার্নিং অবজেক্ট দরকার need কোন সাহায্যের জন্য ধন্যবাদ

কল করা - জরিমানা ঠিক স্থিতি ঠিক করে।

HttpClient client = new HttpClient();
client.DefaultRequestHeaders.Accept
  .Add(new MediaTypeWithQualityHeaderValue("application/json"));
var responseMsg = client.GetAsync(string.Format("http://localhost:5057/api/Photo")).Result;

এপিআই পদ্ধতিটি

//Cut out alot of code but you get the idea
public string Get()
{
    return JsonConvert.SerializeObject(returnedPhoto);
}

.NET 4.5 এইচটিটিপি ক্লায়েন্ট ক্লাসটি ব্যবহার করার সময় আপনি কীভাবে প্রতিক্রিয়া সামগ্রী পেতে পারেন তা জিজ্ঞাসা করছেন?
পানাগিওটিস কানভোস

উত্তর:


162

আপনি যদি নেট .৪.৫-এ সিস্টেম. নেট.এইচটিটিপিপ্লিনেন্টের উল্লেখ করছেন তবে আপনি এইচটিটিপি কনসেন্ট- ডিজাইভ অবজেক্ট হিসাবে এইচটিপিআরএসপোনসমেজেজ.সন্টিটি সম্পত্তি ব্যবহার করে গেটসায়েন্সের মাধ্যমে সামগ্রীটি ফিরে পেতে পারবেন । এর পরে আপনি একটি স্ট্রিং ব্যবহার করে বিষয়বস্তু পড়তে পারেন HttpContent.ReadAsStringAsync পদ্ধতি বা একটি স্ট্রিম ব্যবহার ReadAsStreamAsync পদ্ধতি।

HttpClient বর্গ ডকুমেন্টেশন এই উদাহরণে রয়েছে:

  HttpClient client = new HttpClient();
  HttpResponseMessage response = await client.GetAsync("http://www.contoso.com/");
  response.EnsureSuccessStatusCode();
  string responseBody = await response.Content.ReadAsStringAsync();

4
এটি পরীক্ষা করা হয়নি তবে এনসুরসুকসেসটাসটাসকোডের ডকুমেন্টেশন বলছে "যদি বিষয়বস্তুটি বাতিল না হয় তবে এই পদ্ধতিটি ডিসপোজকেও বিনামূল্যে পরিচালিত এবং নিয়ন্ত্রণহীন সংস্থানগুলিতে কল করবে" " সুতরাং আপনি প্রথমে সামগ্রীটি পড়তে ইচ্ছুক হতে পারেন। এমএসডিএন.মাইক্রোসফটকম
রায়ান উইলিয়ামস

4
এর কোনও কারণ নেই। রিফ্লেক্টর দ্বারা প্রমাণিত হিসাবে, ইনসুরসুসেসটাসটাসকোড ব্যতিক্রম ছুঁড়ে দেওয়ার আগেই যদি স্থিতি কোডটি ব্যর্থ হয় তবে কেবল তা নিষ্পত্তি করবে। তবুও অন্য একটি ক্ষেত্রে যেখানে ডকুমেন্টেশনের পাঠ্যটি কিছুটা বিভ্রান্তিকর।
পানাগিওটিস কানভোস

4
শুধু কেন নয় client.GetStringAsync(...)? তারা উভয় একটি ব্যতিক্রম নিক্ষেপ চাই যে 2012 সালে প্রায় না দেওয়া থাকে প্রতিক্রিয়া ছিল না 200ডান?
সাইমন_উইভার

4
@ সিমন_উইভার কারণ এটি প্রশ্ন ছিল না - ওপি প্রতিক্রিয়া থেকে স্ট্রিংটি কীভাবে পড়তে হবে তা জিজ্ঞাসা করেছিল। সেখানে হয় পার্থক্য। আপনি প্রতিক্রিয়াটি পরীক্ষা করতে পারবেন না GetStringAsyncযার অর্থ আপনি প্রতিক্রিয়া বার্তাটি কী তা জানেন না। যদি কোনও 3xx প্রতিক্রিয়া ফিরে আসে তবে আপনি সম্ভবত ছুঁড়ে ফেলতে চান না । কোনও থ্রোটলিং ত্রুটি যদি ফিরে আসে তবে আপনি সম্ভবত ছোঁড়া ছাড়াই আবার চেষ্টা করতে চান ।
পানাগিওটিস কানভোস

4
@ সিমন_আমি যে কল করার অনেকগুলি উপায় আছে - কেন নয় GetAsync<T>? বা গেটস্ট্রিএমিশন করুন এবং অস্থায়ী স্ট্রিং এড়িয়ে স্ট্রিমোটি Json.NET এ পাস করবেন? আবার, GetAsyncপ্রথমে ব্যবহার করা পছন্দনীয় হতে পারে তবে সামগ্রী সামগ্রীতে অ্যাক্সেস করুন
Panagiotis Kanavos

40

@ পানাজিওটিস কানভোসের উত্তরে বিল্ডিং , উদাহরণস্বরূপ এখানে একটি কার্য পদ্ধতি রয়েছে যা স্ট্রিংয়ের পরিবর্তে কোনও প্রতিক্রিয়াটিকে বস্তুরূপেও ফিরিয়ে দেবে:

using System.Text;
using System.Net.Http;
using System.Threading.Tasks;
using Newtonsoft.Json; // Nuget Package

public static async Task<object> PostCallAPI(string url, object jsonObject)
{
    try
    {
        using (HttpClient client = new HttpClient())
        {
            var content = new StringContent(jsonObject.ToString(), Encoding.UTF8, "application/json");
            var response = await client.PostAsync(url, content);
            if (response != null)
            {
                var jsonString = await response.Content.ReadAsStringAsync();
                return JsonConvert.DeserializeObject<object>(jsonString);
            }
        }
    }
    catch (Exception ex)
    {
        myCustomLogger.LogException(ex);
    }
    return null;
}

মনে রাখবেন যে এটি কেবল একটি উদাহরণ এবং আপনি সম্ভবত HttpClientএটি ব্যবহার-দফায় ব্যবহার না করে ভাগ করে নেওয়া উদাহরণ হিসাবে ব্যবহার করতে চাইবেন ।


সাবধান থাকুন httpclient ব্যবহারের
স্ট্যাটমেন্ট

যেহেতু তত্ক্ষণাত্ রিটার্নের অপেক্ষায় রয়েছে, if (response != null)পোস্ট কল শেষ হওয়ার আগেই এটি কার্যকর করা সম্ভব ?
নিশান্ত

9

মাইক্রোসফ্ট থেকে এই নুগেট প্যাকেজটি ইনস্টল করুন System.Net.Http.Json। এটিতে এক্সটেনশন পদ্ধতি রয়েছে।

পরে যুক্ত using System.Net.Http.Json

এখন, আপনি এই পদ্ধতিগুলি দেখতে সক্ষম হবেন:

এখানে চিত্র বর্ণনা লিখুন

সুতরাং আপনি এখন এটি করতে পারেন:

await httpClient.GetFromJsonAsync<IList<WeatherForecast>>("weatherforecast");

সূত্র: https://www.stevejgordon.co.uk/sending-and-receiving-json- using- httpclient- with- system- net- http- json


7

আমি মনে করি সবচেয়ে সংক্ষিপ্ততম উপায়:

var client = new HttpClient();
string reqUrl = $"http://myhost.mydomain.com/api/products/{ProdId}";
var prodResp = await client.GetAsync(reqUrl);
if (!prodResp.IsSuccessStatusCode){
    FailRequirement();
}
var prods = await prodResp.Content.ReadAsAsync<Products>();

7
সবেমাত্র চিন্তিত আইডি যুক্ত করুন যে রিডএএএসেন্স একটি এক্সটেনশন পদ্ধতি। আপনার নেট সিস্টেমের জন্য .Net 4+ এবং Microsoft.AspNet.WebApi.Client। এই কাজ পেতে।
স্কুয়েবলली

0

আমি সাধারণত যা করি, তার উত্তরটির অনুরূপ:

var response = await httpClient.GetAsync(completeURL); // http://192.168.0.1:915/api/Controller/Object

if (response.IsSuccessStatusCode == true)
    {
        string res = await response.Content.ReadAsStringAsync();
        var content = Json.Deserialize<Model>(res);

// do whatever you need with the JSON which is in 'content'
// ex: int id = content.Id;

        Navigate();
        return true;
    }
    else
    {
        await JSRuntime.Current.InvokeAsync<string>("alert", "Warning, the credentials you have entered are incorrect.");
        return false;
    }

যেখানে 'মডেল' আপনার সি # মডেল শ্রেণি।


0

এটি নিম্নলিখিত উপায়ে আমার পক্ষে ভাল কাজ করছে -

public async Task<object> TestMethod(TestModel model)
    {
        try
        {
            var apicallObject = new
            {
                Id= model.Id,
                name= model.Name
            };

            if (apicallObject != null)
            {
                var bodyContent = JsonConvert.SerializeObject(apicallObject);
                using (HttpClient client = new HttpClient())
                {
                    var content = new StringContent(bodyContent.ToString(), Encoding.UTF8, "application/json");
                    content.Headers.ContentType = new MediaTypeHeaderValue("application/json");
                    client.DefaultRequestHeaders.Add("access-token", _token); // _token = access token
                    var response = await client.PostAsync(_url, content); // _url =api endpoint url
                    if (response != null)
                    {
                        var jsonString = await response.Content.ReadAsStringAsync();

                        try
                        {
                            var result = JsonConvert.DeserializeObject<TestModel2>(jsonString); // TestModel2 = deserialize object
                        }
                        catch (Exception e){
                            //msg
                            throw e;
                        }
                    }
                }
            }
        }
        catch (Exception ex)
        {
            throw ex;
        }
        return null;
    }
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.