সুইফ্ট অ্যালামোফায়ার: কীভাবে এইচটিটিপি প্রতিক্রিয়া স্থিতি কোড পাবেন


106

অনুরোধ ব্যর্থতার জন্য (এবং আদর্শিকভাবে সাফল্যের জন্য) আমি HTTP প্রতিক্রিয়া স্থিতি কোডটি পুনরুদ্ধার করতে চাই (যেমন 400, 401, 403, 503, ইত্যাদি)। এই কোডটিতে, আমি HTTP বেসিকের সাথে ব্যবহারকারীর প্রমাণীকরণ সম্পাদন করছি এবং ব্যবহারকারী যখন তাদের পাসওয়ার্ডটি ভুল টাইপ করেন তখন প্রমাণীকরণ ব্যর্থ হয় এমন ব্যবহারকারীকে বার্তা দিতে সক্ষম হতে চাই।

Alamofire.request(.GET, "https://host.com/a/path").authenticate(user: "user", password: "typo")
    .responseString { (req, res, data, error) in
        if error != nil {
            println("STRING Error:: error:\(error)")
            println("  req:\(req)")
            println("  res:\(res)")
            println("  data:\(data)")
            return
        }
        println("SUCCESS for String")
}
    .responseJSON { (req, res, data, error) in
        if error != nil {
            println("JSON Error:: error:\(error)")
            println("  req:\(req)")
            println("  res:\(res)")
            println("  data:\(data)")
            return
        }
        println("SUCCESS for JSON")
}

দুর্ভাগ্যক্রমে, উত্পাদিত ত্রুটিটি কোনও HTTP স্থিতি কোড 409 আসলে প্রাপ্ত হয়েছিল তা বোঝায় না:

STRING Error:: error:Optional(Error Domain=NSURLErrorDomain Code=-999 "cancelled" UserInfo=0x7f9beb8efce0 {NSErrorFailingURLKey=https://host.com/a/path, NSLocalizedDescription=cancelled, NSErrorFailingURLStringKey=https://host.com/a/path})
  req:<NSMutableURLRequest: 0x7f9beb89d5e0> { URL: https://host.com/a/path }
  res:nil
  data:Optional("")
JSON Error:: error:Optional(Error Domain=NSURLErrorDomain Code=-999 "cancelled" UserInfo=0x7f9beb8efce0 {NSErrorFailingURLKey=https://host.com/a/path, NSLocalizedDescription=cancelled, NSErrorFailingURLStringKey=https://host.com/a/path})
  req:<NSMutableURLRequest: 0x7f9beb89d5e0> { URL: https://host.com/a/path }
  res:nil
  data:nil

তদ্ব্যতীত, কোনও ত্রুটি দেখা দিলে HTTP বডিটি পুনরুদ্ধার করা ভাল হবে কারণ আমার সার্ভার-সাইড ত্রুটিটির একটি পাঠ্য বিবরণ দেবে।

প্রশ্নগুলি
কি নন-টুএক্সএক্স প্রতিক্রিয়া অনুসারে স্থিতি কোডটি পাওয়া সম্ভব?
2XX প্রতিক্রিয়া অনুসারে কি নির্দিষ্ট স্থিতি কোডটি পাওয়া সম্ভব?
নন-টুএক্সএক্স প্রতিক্রিয়া অনুসারে কি এইচটিটিপি বডিটি পুনরুদ্ধার করা সম্ভব?

ধন্যবাদ!


1
আপনি যদি অমানুষিক হন তবে আপনি ডিজাইনের মাধ্যমে একটি -999 পান। এটি কেন বা কীভাবে এটি সমাধান করা যেতে পারে তা নিশ্চিত নন ... আপনি কি এটি সমাধান করেছেন?
গাইডো হেন্ডরিক্স

উত্তর:


187

জন্য সুইফট 3.x / সুইফট 4.0 / সুইফট 5.0 ব্যবহারকারীদের Alamofire> = 4.0 / Alamofire> = 5.0


response.response?.statusCode

আরও ভার্বোজের উদাহরণ:

Alamofire.request(urlString)
        .responseString { response in
            print("Success: \(response.result.isSuccess)")
            print("Response String: \(response.result.value)")

            var statusCode = response.response?.statusCode
            if let error = response.result.error as? AFError {  
                statusCode = error._code // statusCode private                 
                switch error {
                case .invalidURL(let url):
                    print("Invalid URL: \(url) - \(error.localizedDescription)")
                case .parameterEncodingFailed(let reason):
                    print("Parameter encoding failed: \(error.localizedDescription)")
                    print("Failure Reason: \(reason)")
                case .multipartEncodingFailed(let reason):
                    print("Multipart encoding failed: \(error.localizedDescription)")
                    print("Failure Reason: \(reason)")
                case .responseValidationFailed(let reason):
                    print("Response validation failed: \(error.localizedDescription)")
                    print("Failure Reason: \(reason)")

                    switch reason {
                    case .dataFileNil, .dataFileReadFailed:
                        print("Downloaded file could not be read")
                    case .missingContentType(let acceptableContentTypes):
                        print("Content Type Missing: \(acceptableContentTypes)")
                    case .unacceptableContentType(let acceptableContentTypes, let responseContentType):
                        print("Response content type: \(responseContentType) was unacceptable: \(acceptableContentTypes)")
                    case .unacceptableStatusCode(let code):
                        print("Response status code was unacceptable: \(code)")
                        statusCode = code
                    }
                case .responseSerializationFailed(let reason):
                    print("Response serialization failed: \(error.localizedDescription)")
                    print("Failure Reason: \(reason)")
                    // statusCode = 3840 ???? maybe..
                default:break
                }

                print("Underlying error: \(error.underlyingError)")
            } else if let error = response.result.error as? URLError {
                print("URLError occurred: \(error)")
            } else {
                print("Unknown error: \(response.result.error)")
            }

            print(statusCode) // the status code
    } 

(অ্যালামোফায়ার ৪ এ সম্পূর্ণ নতুন ত্রুটি সিস্টেম রয়েছে, বিশদগুলির জন্য এখানে দেখুন)

অ্যালামোফায়ার> = 3.0 সহ সুইফট 2.x ব্যবহারকারীদের জন্য

Alamofire.request(.GET, urlString)
      .responseString { response in
             print("Success: \(response.result.isSuccess)")
             print("Response String: \(response.result.value)")
             if let alamoError = response.result.error {
               let alamoCode = alamoError.code
               let statusCode = (response.response?.statusCode)!
             } else { //no errors
               let statusCode = (response.response?.statusCode)! //example : 200
             }
}

প্রতিক্রিয়া.সাল্ট.অররর আপনাকে একটি আলমোফায়ার ত্রুটি দিতে পারে, উদাহরণস্বরূপ। StatusCodeValidationFailed, FAILURE: Error Domain=com.alamofire.error Code=-6003। এটি যদি আপনি এইচটিটিপি প্রতিক্রিয়া ত্রুটিটি পেতে চান তবে এটি ব্যবহারকারীর পক্ষে ভালresponse.response?.statusCode
কোস্টিয়ান্টিন কোভাল

@ কোস্টিয়ান্টিন কোভাল আমি আপনার সাথে একমত, আপনি একটি সঠিক ব্যাখ্যা দিয়েছেন। আমি আমার উত্তরটি স্পষ্টতার জন্য আপডেট করেছি
আলেসান্দ্রো ওর্নানো

50

responseনীচে যুক্তি সহকারে সমাপ্তি হ্যান্ডলারটিতে আমি দেখতে পাচ্ছি যে এইচটিসিপি স্থিতি কোডটি রয়েছে response.response.statusCode:

Alamofire.request(.POST, urlString, parameters: parameters)
            .responseJSON(completionHandler: {response in
                switch(response.result) {
                case .Success(let JSON):
                    // Yeah! Hand response
                case .Failure(let error):
                   let message : String
                   if let httpStatusCode = response.response?.statusCode {
                      switch(httpStatusCode) {
                      case 400:
                          message = "Username or password not provided."
                      case 401:
                          message = "Incorrect password for user '\(name)'."
                       ...
                      }
                   } else {
                      message = error.localizedDescription
                   }
                   // display alert with error message
                 }

হাই, স্ট্যাটাস কোড 200 ব্যর্থতায় পড়বে? আমার অনুরোধ সার্ভার সাইড এ সঠিকভাবে পরিচালনা করা হলেও সাড়া ব্যর্থ অধিকার করার অনুমতি
perwyl

1
@perwyl আমি মনে করি না 200 একটি HTTP ত্রুটি: দেখুন stackoverflow.com/questions/27921537/...
wcochran

2
@ ভারওয়াইল স্থিতি কোড 200 সাফল্যের ইঙ্গিত দিচ্ছে, যদি আপনার সার্ভারটি 200 ফেরত দেয় এবং প্রতিক্রিয়া নির্দেশ করে ত্রুটিটি (যেমন কিছু সম্পত্তিকে ইস্যুসিসেস = ভুয়া বলে ডাকা হয়), তবে আপনাকে সেটিকে সামনের কোডটিতে পরিচালনা করতে হবে
পরমা ধর্মিকা

16
    Alamofire
        .request(.GET, "REQUEST_URL", parameters: parms, headers: headers)
        .validate(statusCode: 200..<300)
        .responseJSON{ response in

            switch response.result{
            case .Success:
                if let JSON = response.result.value
                {
                }
            case .Failure(let error):
    }


ইউআরডাব্লু :) আপনার অনুরোধগুলির জন্য রাউটার বাস্তবায়নের চেষ্টা করুন। ;)
Abo3atef

11

অ্যালোমফায়ার ব্যবহার করে স্থিতি কোড পাওয়ার সর্বোত্তম উপায়।

 Alamofire.request (ইউআরএল)। অস্বীকার করুন JSON {
  প্রতিক্রিয়া

  আসুন স্ট্যাটাস = প্রতিক্রিয়া। প্রতিক্রিয়া?। স্ট্যাটাসকোড
  মুদ্রণ ("অবস্থা US (স্থিতি)")

}

5

আপনার responseJSONসমাপ্তিতে, আপনি প্রতিক্রিয়া অবজেক্ট থেকে স্থিতি কোডটি পেতে পারেন, এতে এক ধরণের রয়েছে NSHTTPURLResponse?:

if let response = res {
    var statusCode = response.statusCode
}

স্থিতি কোড ত্রুটি সীমাতে রয়েছে তা নির্বিশেষে এটি কাজ করবে। আরও তথ্যের জন্য, NSHTTPURLResponse ডকুমেন্টেশনটি একবার দেখুন

আপনার অন্যান্য প্রশ্নের জন্য, আপনি responseStringকাঁচা প্রতিক্রিয়া বডি পেতে ফাংশনটি ব্যবহার করতে পারেন । আপনি এটি যোগ করতে পারেন responseJSONএবং উভয় কল করা হবে।

.responseJson { (req, res, json, error) in
   // existing code
}
.responseString { (_, _, body, _) in
   // body is a String? containing the response body
}

3

আপনার ত্রুটিটি নির্দেশ করে যে কোনও কারণে অপারেশন বাতিল করা হচ্ছে। কেন বুঝতে আমার আরও বিশদ দরকার। তবে আমি মনে করি এর চেয়ে বড় সমস্যাটি এটি হতে পারে যেহেতু আপনার শেষ পয়েন্টটি https://host.com/a/pathবোগাস, তাই প্রতিবেদনের কোনও সত্যিকারের সার্ভার প্রতিক্রিয়া নেই, এবং তাই আপনি দেখছেন nil

আপনি যদি একটি যথাযথ প্রতিক্রিয়া সরবরাহ করে এমন কোনও বৈধ সমাপ্তি বিন্দুটি হিট করেন তবে আপনি resযেমন স্যামের উল্লেখযোগ্য কৌশলগুলি ব্যবহার করে ইত্যাদির NSURLHTTPResponseসাথে কোনও বস্তুর আকারে (যেমন স্যাম উল্লেখ করেছেন কৌশলগুলি ব্যবহার করে) এর জন্য একটি নন-নীল মান দেখতে হবে statusCodeetc.

এছাড়াও, শুধু পরিষ্কার হবে, errorধরনের হয় NSError। এটি আপনাকে বলবে কেন নেটওয়ার্কের অনুরোধটি ব্যর্থ হয়েছিল। সার্ভার পক্ষের ব্যর্থতার স্থিতি কোডটি আসলে প্রতিক্রিয়াটির একটি অংশ।

আশা করি এটি আপনার মূল প্রশ্নের উত্তর দিতে সহায়তা করবে।


ভাল ধরা, আমি নীচের প্রশ্নের তালিকায় খুব মনোযোগী ছিলাম।
সাম

1
এটি আসলে একটি কোড 401 অননুমোদিত পেয়েছে কারণ আমি ইচ্ছাকৃতভাবে কোনও ব্যবহারকারীকে তাদের পাসওয়ার্ড ভুল টাইপ করে অনুকরণ করতে ভুল পাসওয়ার্ডটি প্রেরণ করছি যাতে আমি সেই কেসটি ধরতে পারি এবং ব্যবহারকারীর প্রতিক্রিয়া জানাতে পারি। আমি যে প্রকৃত ইউআরএলটি ব্যবহার করছি তা নয়, তবে আমি একটি লিগ্যাল ইউআরএল ব্যবহার করছি যা আমি সঠিক পাসওয়ার্ডটি প্রেরণ করলে সাফল্যের ফলস্বরূপ। আমার আসল পোস্টে কনসোল আউটপুট হ'ল আসল আউটপুট হ'ল আসল ইউআরএল (URL টি ভুয়া ব্যতীত) এবং আপনি দেখতে পাচ্ছেন যে resবস্তুটি nilতাই, এই উত্তরটি সাহায্য করে না, দুঃখিত sorry
গ্রেগটি

স্পষ্ট করার জন্য ধন্যবাদ। ঠিক আছে, তবে এখানে কেবলমাত্র সন্দেহজনক বিষয়টি হ'ল -৯৯৯ ত্রুটিটি আমি এর মুখোমুখি হই নি, তবে ডকুমেন্টেশন সূচিত করে যে অনুরোধটি বাতিল করা হচ্ছে (সুতরাং এমনকি প্রতিক্রিয়া পাওয়ার প্রশ্নটিও মোটা হওয়া উচিত)। আপনি কি কোনও ভিন্ন ধরণের ত্রুটির জন্য প্রতিক্রিয়া অবজেক্টটি প্রিন্ট করার চেষ্টা করেছেন যা প্রমাণ-সম্পর্কিত নয়? উৎসুক.
রেইনপিক্সেলগুলি

আহহ আমি ভেবেছিলাম errorস্থিতি কোডগুলির প্রতিক্রিয়াগুলি উল্লেখ করা হচ্ছে যা আমরা সরবরাহ করি না তার বাইরে validate()। ধন্যবাদ !!!
জেরাল্ড

3

অথবা প্যাটার্ন ম্যাচিং ব্যবহার করুন

if let error = response.result.error as? AFError {
   if case .responseValidationFailed(.unacceptableStatusCode(let code)) = error {
       print(code)
   }
}

কবজির মতো কাজ করেছেন।
আলাস্কার

3

অ্যালামোফায়ার দ্বারা স্ট্যাটাস কোড হ্যান্ডলারের জন্য আপনি নিম্নলিখিত কোডটি চেক করতে পারেন

    let request = URLRequest(url: URL(string:"url string")!)    
    Alamofire.request(request).validate(statusCode: 200..<300).responseJSON { (response) in
        switch response.result {
        case .success(let data as [String:Any]):
            completion(true,data)
        case .failure(let err):
            print(err.localizedDescription)
            completion(false,err)
        default:
            completion(false,nil)
        }
    }

যদি স্থিতি কোডটি বৈধ না হয় তবে এটি স্যুইচ ক্ষেত্রে ব্যর্থতা প্রবেশ করবে


1

অ্যালামোফায়ার> ২.০ সহ সুইফট ২.০ ব্যবহারকারীদের জন্য

Alamofire.request(.GET, url)
  .responseString { _, response, result in
    if response?.statusCode == 200{
      //Do something with result
    }
}

1

আসল ত্রুটি কোড নম্বরটি কীভাবে পাবেন তা আমার জানা দরকার।

আমি অন্য কারও কাছ থেকে একটি প্রকল্প উত্তরাধিকার সূত্রে পেয়েছি এবং আমাকে এমন একটি .catchধারা থেকে ত্রুটি কোডগুলি পেয়েছিল যে তারা আগে অ্যালোমোফায়ারের জন্য সেটআপ করেছিল:

} .catch { (error) in

    guard let error = error as? AFError else { return }
    guard let statusCode = error.responseCode else { return }

    print("Alamofire statusCode num is: ", statusCode)
}

অথবা আপনার যদি responseমান থেকে এটির প্রয়োজন হয় তবে @ এমব্রিজিনস্কির উত্তর অনুসরণ করুন

Alamofire ... { (response) in

    guard let error = response.result.error as? AFError else { return }
    guard let statusCode = error.responseCode else { return }

    print("Alamofire statusCode num is: ", statusCode)
})
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.