এইচটিটিপিস্ট্যাটাসকোড সাফল্য বা ব্যর্থতার প্রতিনিধিত্ব করে কিনা তা পরীক্ষা করা হচ্ছে


96

ধরা যাক আমার কাছে নিম্নলিখিত পরিবর্তনশীল রয়েছে:

System.Net.HttpStatusCode status = System.Net.HttpStatusCode.OK;

এটি কীভাবে সফলতা স্থিতি কোড বা একটি ব্যর্থতা তা আমি পরীক্ষা করতে পারি?

উদাহরণস্বরূপ, আমি নিম্নলিখিতগুলি করতে পারি:

int code = (int)status;
if(code >= 200 && code < 300) {
    //Success
}

আমার কাছে এক ধরণের সাদা তালিকা থাকতে পারে:

HttpStatusCode[] successStatus = new HttpStatusCode[] {
     HttpStatusCode.OK,
     HttpStatusCode.Created,
     HttpStatusCode.Accepted,
     HttpStatusCode.NonAuthoritativeInformation,
     HttpStatusCode.NoContent,
     HttpStatusCode.ResetContent,
     HttpStatusCode.PartialContent
};
if(successStatus.Contains(status)) //LINQ
{
    //Success
}

এই বিকল্পগুলির কোনওটিই আমাকে বিশ্বাস করে না এবং আমি একটি নেট নেট ক্লাস বা পদ্ধতির আশা করছিলাম যা এই কাজটি আমার পক্ষে করতে পারে যেমন:

bool isSuccess = HttpUtilities.IsSuccess(status);

আপনাকে যা করতে হবে int code = (int)Response.StatusCodeসেখান থেকে আপনি আপনার নিজের তৈরি করতে হবে Enumউদাহরণ কাজ করার জন্য এখানে চেক করুন stackoverflow.com/questions/1330856/...
MethodMan

আপনি HttpClientক্লাস ব্যবহার করে কোন সুযোগে ?
ডাস্ট্রো

4
@ ডাস্ট্রো না, আমি দুঃখিত। আমি একটি উচ্চ-স্তরের এপিআই ব্যবহার করছি যা এটি অভ্যন্তরীণভাবে ব্যবহার করতে পারে (বা না পারে)। এপিআই প্রতিক্রিয়াটির স্থিতি কোডটি প্রকাশ করে তবে অভ্যন্তরটিকে HttpResponseMessageউদাহরণ হিসাবে প্রকাশ করে না
মাটিয়াস সিসেরো

@ ম্যাটিসিসেরো এটি খুব খারাপ: / আপনি সর্বদা ব্যবহারের পুনরায় ব্যবহার করতে পারেন HttpResponseMessage.IsSuccessStatusCode(আমার উত্তর দেখুন) যা আপনার প্রথম পদ্ধতির মতোই একই রকম এবং এটিকে HttpStatusCodeপ্রকারের ক্ষেত্রে একটি এক্সটেনশন পদ্ধতি হিসাবে তৈরি করতে পারেন ।
ডেসট্রো

উত্তর:


180

আপনি যদি HttpClientক্লাসটি ব্যবহার করছেন তবে আপনি HttpResponseMessageফিরে পাবেন।

এই শ্রেণীর একটি দরকারী সম্পত্তি বলা হয়েছে IsSuccessStatusCodeযা আপনার জন্য চেক করবে।

using (var client = new HttpClient())
{
    var response = await client.PostAsync(uri, content);
    if (response.IsSuccessStatusCode)
    {
        //...
    }
}

আপনি যদি কৌতূহলী হন তবে এই সম্পত্তিটি হিসাবে প্রয়োগ করা হবে:

public bool IsSuccessStatusCode
{
    get { return ((int)statusCode >= 200) && ((int)statusCode <= 299); }
}

আপনি যদি সরাসরি ব্যবহার না করেন তবে আপনি কেবল এই অ্যালগরিদমটি পুনরায় ব্যবহার করতে পারেন HttpClient

EnsureSuccessStatusCodeপ্রতিক্রিয়া সফল না হলে আপনি একটি ব্যতিক্রম ছুঁড়ে ফেলতেও ব্যবহার করতে পারেন ।


4
এফওয়াইআই: আমার জন্য ছিল 'প্রতিক্রিয়া .সসফল'।
টোফার জন্ম

আপনার উত্তরটি বেশ সহায়ক তবে এখন এটি এর মতো কাজ করে: যদি (প্রতিক্রিয়া
IIsCompletedSuccessfully

12

এইচটিটিপিআরস্পোনমেসেজ ক্লাসটির একটি ইসসুকসেসট্যাটাসকোড সম্পত্তি রয়েছে, উত্স কোডটি দেখে এটি এর মতো হয় যাতে ইউএসআর ইতিমধ্যে 200-299 এর পরামর্শ দিয়েছিল সম্ভবত আপনি সবচেয়ে ভাল করতে পারেন।

public bool IsSuccessStatusCode
{
    get { return ((int)statusCode >= 200) && ((int)statusCode <= 299); }
}

11

গৃহীত উত্তরটি আমাকে কিছুটা বিরক্ত করে কারণ এর মধ্যে দ্বিতীয় অংশে যাদু সংখ্যা রয়েছে (যদিও তারা মানসম্পন্ন)। এবং প্রথম অংশটি সরল পূর্ণসংখ্যার স্থিতি কোডগুলির পক্ষে জেনারিক নয়, যদিও এটি আমার উত্তরের নিকটবর্তী।

আপনি আপনার স্থিতি কোড দিয়ে HTTPResponseMessage ইনস্ট্যান্ট করে এবং সাফল্যের জন্য যাচাই করে ঠিক একই ফলাফল অর্জন করতে পারেন। মানটি শূন্যের চেয়ে ছোট বা 999 এর চেয়ে বেশি হলে এটি একটি যুক্তিযুক্ত ব্যতিক্রম ছুঁড়ে ফেলে।

if (new HttpResponseMessage((HttpStatusCode)statusCode).IsSuccessStatusCode)
{
    // ...
}

এটি ঠিক সংক্ষিপ্ত নয়, তবে আপনি এটিকে একটি এক্সটেনশান করতে পারেন make


এটি আমার পক্ষে নিখুঁতভাবে কাজ করেছে কারণ আমার কাছে কেবল একটি HTTPStatusCode ছিল এবং না কোনও প্রতিক্রিয়া বার্তা। ভাল করেছ!
টড ভ্যানস

6
"গৃহীত উত্তরটি আমাকে কিছুটা বিরক্ত করে কারণ এর মধ্যে যাদু সংখ্যা রয়েছে (যদিও তারা মানসম্পন্ন)" - তারা মানদণ্ডযুক্ত, ভাল বোঝা এবং কখনও পরিবর্তন হতে না পারলে তারা "যাদু" নন। সরাসরি কোডগুলি ব্যবহার করে কোনও ভুল নেই। যদি আপনার কাছে IsSuccessStatusCodeদুর্দান্ত থাকে তবে এটি ব্যবহার করুন (যেমন স্বীকৃত উত্তর বলে)) অন্যথায়, আপনি সমস্ত জায়গা জুড়ে এই চেকটি সম্পাদন না করে কোনও বিমূর্ততা ব্যবহার করে আপনার নিজস্ব ক্রাফ্টটি যুক্ত করবেন না
এড এস।

4
মনে রাখবেন যে HttpResponseMessageএর একটি বৈশিষ্ট্য ব্যবহার করার জন্য ইনস্ট্যান্ট করাতে দুটি যৌক্তিক শর্ত পরীক্ষা করার চেয়ে বেশি সময় নেয় int
মিরো জে

10

@ টমডোসকোড উত্তরটিতে যুক্ত করা হচ্ছে আপনি যদি HTTPWebResponse ব্যবহার করছেন তবে আপনি এই এক্সটেনশন পদ্ধতিটি যুক্ত করতে পারেন:

public static bool IsSuccessStatusCode(this HttpWebResponse httpWebResponse)
{
    return ((int)httpWebResponse.StatusCode >= 200) && ((int)httpWebResponse.StatusCode <= 299);
}

8

আমি এক্সটেনশন পদ্ধতির আবিষ্কারের আংশিক।

public static class HttpStatusCodeExtensions
{
    public static bool IsSuccessStatusCode(this HttpStatusCode statusCode)
    {
        var asInt = (int)statusCode;
        return asInt >= 200 && asInt <= 299;
    }
}

আপনার নাম স্থানটি যতক্ষণ সুযোগে থাকবে ততক্ষণ ব্যবহার হবে statusCode.IsSuccessStatusCode()


এক্সটেনশন পদ্ধতিগুলি দুর্দান্ত, তবে আমি বিভ্রান্ত - এইচটিটিপিএসপ্লাইমেসেজের ইসসুকসেসটাসটাসকোড সম্পত্তি যা এইচটিটিপি ক্লিনেন্ট বা আইএইচটিটিপি ক্লায়েন্টফ্যাক্টরীর সাথে ব্যবহার করে, একই কাজ করে না? @ডিসাস্ট্রো এমনকি আমাদের দেখায় যে এটি নেট। নেটে ঠিক ঠিক এর মতোই প্রয়োগ করা হয়েছে। আমি / 2X রেঞ্জের এইচটিটিপিএস স্থিতি কোডগুলির জন্য এই জাতীয় সম্প্রসারণ পদ্ধতি কখন / কেন ব্যবহার করব?
এসফর্স বলছেন মনিকা

4
@ এসফর্স, হ্যাঁ, তবে যদি আপনার কেবল HttpStatusCodeসুযোগটি থাকে? প্রচুর লাইব্রেরি রয়েছে যা ব্যবহার বা পৃষ্ঠের ব্যবহার করে না HttpResponseMessageতবে আপনাকে স্ট্যাটাস কোড দেয়।
বোজিংগো

3

আপনি কোন HTTP সংস্থান কল করছেন তার উপর এটি নির্ভর করে। সাধারণত, 2xxপরিসীমা সাফল্যের স্থিতি কোডগুলির ব্যাপ্তি হিসাবে সংজ্ঞায়িত করা হয়। এটি স্পষ্টতই একটি কনভেনশন যা প্রতিটি এইচটিটিপি সার্ভার মেনে চলবে না।

উদাহরণস্বরূপ, কোনও ওয়েবসাইটে ফর্ম জমা দেওয়ার ফলে প্রায়শই 302 টি পুনর্নির্দেশ ফিরিয়ে দেওয়া হবে।

আপনি যদি কোনও সাধারণ পদ্ধতি অবলম্বন করতে চান তবে code >= 200 && code < 300ধারণাটি সম্ভবত আপনার সেরা শট।

আপনি যদি নিজের সার্ভারে কল দিচ্ছেন তবে আপনার সম্ভবত এটি মানীয় করা উচিত কিনা তা নিশ্চিত হওয়া উচিত 200


2

এটি পূর্ববর্তী উত্তরের একটি সম্প্রসারণ, যা প্রতিটি অনুরোধের জন্য একটি নতুন অবজেক্ট তৈরি এবং পরবর্তীকালে আবর্জনা সংগ্রহ এড়ানো যায়।

public static class StatusCodeExtensions
{
    private static readonly ConcurrentDictionary<HttpStatusCode, bool> IsSuccessStatusCode = new ConcurrentDictionary<HttpStatusCode, bool>();
    public static bool IsSuccess(this HttpStatusCode statusCode) => IsSuccessStatusCode.GetOrAdd(statusCode, c => new HttpResponseMessage(c).IsSuccessStatusCode);
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.