এনএসআরএলসেশন ব্যবহার করে পোস্টের অনুরোধ প্রেরণ করুন


219

আপডেট: সমাধান পাওয়া গেছে। আপনি পোস্টের শেষে এটি পড়তে পারেন।

আমি একটি রিমোট REST এপিআই ব্যবহার করে একটি পোস্ট অনুরোধ সম্পাদন করার চেষ্টা করছি NSURLSession। ধারণাটি দুটি পরামিতি সহ একটি অনুরোধ করা হয়: deviceIdএবং textContent

সমস্যাটি হ'ল সেই পরামিতিগুলি সার্ভার দ্বারা স্বীকৃত নয়। সার্ভার অংশটি সঠিকভাবে কাজ করে কারণ আমি গুগল ক্রোমের জন্য পোষ্টম্যান ব্যবহার করে একটি পোস্ট পাঠিয়েছি এবং এটি পুরোপুরি কার্যকরভাবে কাজ করেছে।

এই মুহূর্তে আমি এই কোডটি ব্যবহার করছি:

NSString *deviceID = [[NSUserDefaults standardUserDefaults] objectForKey:@"deviceID"];
NSString *textContent = @"New note";
NSString *noteDataString = [NSString stringWithFormat:@"deviceId=%@&textContent=%@", deviceID, textContent];

NSURLSessionConfiguration *sessionConfiguration = [NSURLSessionConfiguration defaultSessionConfiguration];
sessionConfiguration.HTTPAdditionalHeaders = @{
                                               @"api-key"       : @"API_KEY",
                                               @"Content-Type"  : @"application/json"
                                               };
NSURLSession *session = [NSURLSession sessionWithConfiguration:sessionConfiguration];
NSURL *url = [NSURL URLWithString:@"http://url_to_manage_post_requests"];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
request.HTTPBody = [noteDataString dataUsingEncoding:NSUTF8StringEncoding];
request.HTTPMethod = @"POST";
NSURLSessionDataTask *postDataTask = [session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
    // The server answers with an error because it doesn't receive the params
}];
[postDataTask resume];

আমি একটি একই পদ্ধতি চেষ্টা করেছি NSURLSessionUploadTask:

// ...
NSURL *url = [NSURL URLWithString:@"http://url_to_manage_post_requests"];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
request.HTTPMethod = @"POST";
NSURLSessionUploadTask *uploadTask = [session uploadTaskWithRequest:request fromData:[noteDataString dataUsingEncoding:NSUTF8StringEncoding] completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
    // The server answers with an error because it doesn't receive the params
}];
[uploadTask resume];

কোন ধারনা?

সমাধান

আমার পদ্ধতির সাথে সমস্যাটি হ'ল আমি Content-Typeআমার সমস্ত অনুরোধগুলি সহ ভুল শিরোনামটি পাঠাচ্ছিলাম । সুতরাং কোডটি সঠিকভাবে কাজ করার জন্য কেবলমাত্র পরিবর্তনটি হ'ল Content-Type = application/jsonএইচটিটিপি শিরোলেখ অপসারণ করা । সুতরাং সঠিক কোডটি হ'ল:

NSString *deviceID = [[NSUserDefaults standardUserDefaults] objectForKey:@"deviceID"];
NSString *textContent = @"New note";
NSString *noteDataString = [NSString stringWithFormat:@"deviceId=%@&textContent=%@", deviceID, textContent];

NSURLSessionConfiguration *sessionConfiguration = [NSURLSessionConfiguration defaultSessionConfiguration];
sessionConfiguration.HTTPAdditionalHeaders = @{
                                               @"api-key"       : @"API_KEY"
                                               };
NSURLSession *session = [NSURLSession sessionWithConfiguration:sessionConfiguration];
NSURL *url = [NSURL URLWithString:@"http://url_to_manage_post_requests"];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
request.HTTPBody = [noteDataString dataUsingEncoding:NSUTF8StringEncoding];
request.HTTPMethod = @"POST";
NSURLSessionDataTask *postDataTask = [session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
    // The server answers with an error because it doesn't receive the params
}];
[postDataTask resume];

অন্যান্য পরামিতিগুলির সাথে চিত্র পাঠানো

আপনি যদি NSURLSessionএখানে অন্যান্য পরামিতি ব্যবহার করে ছবি পোস্ট করতে চান তবে আপনার একটি উদাহরণ রয়েছে:

NSString *deviceID = [[NSUserDefaults standardUserDefaults] objectForKey:@"deviceID"];
NSString *textContent = @"This is a new note";

// Build the request body
NSString *boundary = @"SportuondoFormBoundary";
NSMutableData *body = [NSMutableData data];
// Body part for "deviceId" parameter. This is a string.
[body appendData:[[NSString stringWithFormat:@"--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"%@\"\r\n\r\n", @"deviceId"] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[[NSString stringWithFormat:@"%@\r\n", deviceID] dataUsingEncoding:NSUTF8StringEncoding]];
// Body part for "textContent" parameter. This is a string.
[body appendData:[[NSString stringWithFormat:@"--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"%@\"\r\n\r\n", @"textContent"] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[[NSString stringWithFormat:@"%@\r\n", textContent] dataUsingEncoding:NSUTF8StringEncoding]];
// Body part for the attachament. This is an image.
NSData *imageData = UIImageJPEGRepresentation([UIImage imageNamed:@"ranking"], 0.6);
if (imageData) {
    [body appendData:[[NSString stringWithFormat:@"--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]];
    [body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"%@\"; filename=\"image.jpg\"\r\n", @"image"] dataUsingEncoding:NSUTF8StringEncoding]];
    [body appendData:[@"Content-Type: image/jpeg\r\n\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
    [body appendData:imageData];
    [body appendData:[[NSString stringWithFormat:@"\r\n"] dataUsingEncoding:NSUTF8StringEncoding]];
}
[body appendData:[[NSString stringWithFormat:@"--%@--\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]];

// Setup the session
NSURLSessionConfiguration *sessionConfiguration = [NSURLSessionConfiguration defaultSessionConfiguration];
sessionConfiguration.HTTPAdditionalHeaders = @{
                                               @"api-key"       : @"55e76dc4bbae25b066cb",
                                               @"Accept"        : @"application/json",
                                               @"Content-Type"  : [NSString stringWithFormat:@"multipart/form-data; boundary=%@", boundary]
                                               };

// Create the session
// We can use the delegate to track upload progress
NSURLSession *session = [NSURLSession sessionWithConfiguration:sessionConfiguration delegate:self delegateQueue:nil];

// Data uploading task. We could use NSURLSessionUploadTask instead of NSURLSessionDataTask if we needed to support uploads in the background
NSURL *url = [NSURL URLWithString:@"URL_TO_UPLOAD_TO"];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
request.HTTPMethod = @"POST";
request.HTTPBody = body;
NSURLSessionDataTask *uploadTask = [session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
    // Process the response
}];
[uploadTask resume];

স্পর্শকাতরভাবে, আপনি যদি কেবল একটি ব্যবহার করেন তবে NSURLSessionUploadTaskএটি আপনার সার্ভারে কাঁচা ডেটা পোস্ট করে। যার সাহায্যে আপনি এখনও কাজ করতে পারেন - উদাহরণস্বরূপ, এর মাধ্যমে file_get_contents('php://input') in PHP- তবে আপনাকে হেডারগুলিতে অন্যান্য ডেটা অন্তর্ভুক্ত করতে হবে।
এরিক গোল্ডবার্গ

চমৎকার সমাধান! এটি আমার নিজস্ব মাল্টিপার্ট ফর্ম সুরকার তৈরি করতে ব্যবহৃত হয়েছে।
আন্তন ওগারকভ

আমার একটি আলাদা সমস্যা ছিল তবে Content-Typeআমার কাছে জিনিসগুলি বের করার জন্য প্রয়োজনীয় টিপ-অফ ছিল। ধন্যবাদ!
জন এর্ক

2
প্রশ্নের "সমাধান" একটি উত্তর হিসাবে যুক্ত করা উচিত :)
pkamb

2
দয়া করে আপনার প্রশ্নের উত্তরগুলি রাখবেন না, যদি আপনার উত্তর সেখানে রাখার চেয়ে উত্তর হিসাবে একটি পোস্ট থাকে। দয়া করে মেটা
E-Riddie

উত্তর:


169

আপনি প্যারামগুলির জন্য একটি এনএসডি অভিধান ব্যবহার করার চেষ্টা করতে পারেন। নিম্নলিখিতগুলি কোনও JSON সার্ভারে সঠিকভাবে পরামিতি প্রেরণ করবে।

NSError *error;

NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
NSURLSession *session = [NSURLSession sessionWithConfiguration:configuration delegate:self delegateQueue:nil];
NSURL *url = [NSURL URLWithString:@"[JSON SERVER"];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url
                                                       cachePolicy:NSURLRequestUseProtocolCachePolicy
                                                   timeoutInterval:60.0];

[request addValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
[request addValue:@"application/json" forHTTPHeaderField:@"Accept"];

[request setHTTPMethod:@"POST"];
NSDictionary *mapData = [[NSDictionary alloc] initWithObjectsAndKeys: @"TEST IOS", @"name",
                     @"IOS TYPE", @"typemap",
                     nil];
NSData *postData = [NSJSONSerialization dataWithJSONObject:mapData options:0 error:&error];
[request setHTTPBody:postData];


NSURLSessionDataTask *postDataTask = [session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {

}];

[postDataTask resume];

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


এটা নিখুঁত কাজ! আপনাকে ধন্যবাদ গ্রেটেন্টর! কোনও ধারণা কীভাবে আমি "প্লেইন" ডেটার পাশাপাশি কোনও চিত্র আপলোড করতে পারি?
সেন্ডোয়া

2
আমি আমার প্রথম সমস্যার সমাধান পেয়েছি (কোনও ঝামেলা করার দরকার নেই NSJSONSerialization) এবং আমি অন্যান্য পরামিতিগুলির সাথে চিত্রগুলি পোস্ট করার জন্য কোডটি যুক্ত করেছি। আমি আসল পোস্ট আপডেট করেছি। আপনার সহায়তার জন্য আপনাকে ধন্যবাদ :-)
সেন্ডোয়া

আপনাকে অনেক ধন্যবাদ, অনেক দিন থেকেই সমাধান খুঁজে পেয়েছি। আপনার পোস্টটি আমাকে আইওএস 7
রাধী

@ সেন্ডোয়া, আপনি কীভাবে থ্রিন "প্লেইন" ডেটা বরাবর কোনও চিত্র আপলোড করবেন তা কীভাবে জানেন? আমার জরুরি জরুরি সমাধান দরকার অগ্রিম অনেক ধন্যবাদ
গগন জোশী

@ গাগন জোশি আমার প্রাথমিক পোস্টের "অন্যান্য পরামিতিগুলির সাথে চিত্রগুলি প্রেরণ করুন" বিভাগটি
পড়েছেন

20

প্রেরণা

কখনও কখনও আপনি কিছু থেকে ত্রুটি পেয়ে যাচ্ছিলেন যখন আপনি httpBodyData থেকে সিরিয়ালাইজড পাস করতে চান Dictionaryযা বেশিরভাগ ক্ষেত্রে এনএসকোডিং-এর অনুকরণকারী অবজেক্টের কারণে ভুল এনকোডিং বা ত্রুটিযুক্ত ডেটার কারণে হয় Dictionary

সমাধান

আপনার প্রয়োজনীয়তার উপর নির্ভর করে একটি সহজ সমাধান হ'ল তার Stringপরিবর্তে Dictionaryএটি তৈরি করা এবং এতে রূপান্তর করা Data। আপনার নীচে কোড নমুনা লিখিত আছে Objective-Cএবং Swift 3.0

উদ্দেশ্য গ

// Create the URLSession on the default configuration
NSURLSessionConfiguration *defaultSessionConfiguration = [NSURLSessionConfiguration defaultSessionConfiguration];
NSURLSession *defaultSession = [NSURLSession sessionWithConfiguration:defaultSessionConfiguration];

// Setup the request with URL
NSURL *url = [NSURL URLWithString:@"yourURL"];
NSMutableURLRequest *urlRequest = [NSMutableURLRequest requestWithURL:url];

// Convert POST string parameters to data using UTF8 Encoding
NSString *postParams = @"api_key=APIKEY&email=example@example.com&password=password";
NSData *postData = [postParams dataUsingEncoding:NSUTF8StringEncoding];

// Convert POST string parameters to data using UTF8 Encoding
[urlRequest setHTTPMethod:@"POST"];
[urlRequest setHTTPBody:postData];

// Create dataTask
NSURLSessionDataTask *dataTask = [defaultSession dataTaskWithRequest:urlRequest completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
    // Handle your response here
}];

// Fire the request
[dataTask resume];

দ্রুতগতি

// Create the URLSession on the default configuration
let defaultSessionConfiguration = URLSessionConfiguration.default
let defaultSession = URLSession(configuration: defaultSessionConfiguration)

// Setup the request with URL
let url = URL(string: "yourURL")
var urlRequest = URLRequest(url: url!)  // Note: This is a demo, that's why I use implicitly unwrapped optional

// Convert POST string parameters to data using UTF8 Encoding
let postParams = "api_key=APIKEY&email=example@example.com&password=password"
let postData = postParams.data(using: .utf8)

// Set the httpMethod and assign httpBody
urlRequest.httpMethod = "POST"
urlRequest.httpBody = postData

// Create dataTask
let dataTask = defaultSession.dataTask(with: urlRequest) { (data, response, error) in
    // Handle your response here
}

// Fire the request
dataTask.resume()

1
UrlRequest এর আগে এনএসআরএলসেশন ডেটাটাস্ক লাইনটি একটি কোলন অনুপস্থিত।
বিসিএফ এন্টি

1
ধন্যবাদ। খুব পরিষ্কার উত্তর। কেন সেই অনুরোধটি পরিবর্তনীয় হতে হবে? কি সম্ভবত পরিবর্তন হতে পারে? নাকি আপনি ক্রমাগত (একটি বিন্যাস বা অভিধান মত হয়তো) সংযোজন করা হয় url, তারপর methodতারপর bodyতাই এটি চপল হতে হবে? এবং যদি এটি হয় তবে NSURLRequestকখন ব্যবহার করার দরকার ছিল ?
মধু

1
আরে +1 ব্যাখ্যাটির জন্য আপনি কীভাবে আমাকে বলতে পারেন যে আমি কীভাবে কোনও সার্ভারে একটি চিত্র পাঠাতে পারি যা আমি জানি সমস্তই এপিআই এবং কী "চিত্র" আমাকে দয়া করে প্রচুর টিউটোরিয়ালটি সহায়তা করবে তবে কোনও ব্যাখ্যা কোনও সাহায্যের প্রশংসা হবে না: (
চেষ্টাকুলদীপতানওয়ার

1
@ কুলদীপ 1007 তানওয়ার ভালই এটি আপনার সার্ভারের উপর নির্ভর করে, আপনি পোস্টম্যান নামে একটি সরঞ্জামের মাধ্যমে এটি করার চেষ্টা করতে পারেন, এবং অবশেষে যখন দেখবেন আপনাকে কীভাবে চিত্রটি প্রেরণ করা দরকার তখন আমি আপনাকে সহায়তা করতে পারি :)
ই-রিদ্দি

1
এটি একটি পিএইচপি সার্ভার পোস্টম্যান সম্পর্কিত কোনও রেফারেন্স আছে?
কুলদীপতানওয়ার

8

আপনি https://github.com/mxcl/OMGHTTPURLRQ ব্যবহার করতে পারেন

id config = [NSURLSessionConfiguration backgroundSessionConfigurationWithIdentifier:someID];
id session = [NSURLSession sessionWithConfiguration:config delegate:someObject delegateQueue:[NSOperationQueue new]];

OMGMultipartFormData *multipartFormData = [OMGMultipartFormData new];
[multipartFormData addFile:data1 parameterName:@"file1" filename:@"myimage1.png" contentType:@"image/png"];

NSURLRequest *rq = [OMGHTTPURLRQ POST:url:multipartFormData];

id path = [[NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:@"upload.NSData"];
[rq.HTTPBody writeToFile:path atomically:YES];

[[session uploadTaskWithRequest:rq fromFile:[NSURL fileURLWithPath:path]] resume];

2
লিঙ্কের জন্য ধন্যবাদ। আমি নিশ্চিত নই যে এটি "ক্লিয়ার কোডিং" না হওয়ার বিষয়ে আমি অভিযোগটি বুঝতে পেরেছি। যদি আপনাকে কখনও এনএসআরএলসেশন দিয়ে আপনার নিজস্ব মাল্টিপার্ট ফর্ম ডেটা তৈরি করতে হত তবে আপনি জানতেন যে এটি আপনাকে একটি পাগল পরিমাণ কোডিং সাশ্রয় করে। উপরের উদাহরণে @ এমএক্সসিএল দ্বারা অনুরোধটি তৈরি করতে কেবল দুটি লাইন লাগে। এটি নিজের দ্বারা প্রয়োগ করার জন্য এটি আপনাকে কমপক্ষে 12 লাইনের মতো লাগবে।
হটফজজসুন্ডে

3
আমি ঠিক বুঝতে পেরেছি যে তারা কীভাবে মাল্টিপার্ট অনুরোধটি তৈরি করতে পরিচালিত করেছে। তারা আপলোড করার জন্য ফাইলটি দখল করে এবং এটিতে অনুরোধের মূল অংশের সাথে এটি অন্য কোনও ফাইলে সংরক্ষণ করে। তারপরে তারা আপলোডটাস্কউইথ রিকোয়েস্ট: ফাইল থেকে: ব্যবহার করতে পারেন। যেহেতু আপনি পটভূমিতে আপলোড করার জন্য এনএসডিটা পদ্ধতিগুলির কোনও ব্যবহার করতে পারবেন না, তারা আসল ফাইলটি পরিবর্তন করেছে। ভালো বুদ্ধি. ব্যাকগ্রাউন্ডসেশন কনফিগারেশন কাস্টম বডি জন্য অনুমতি দেয় না। আপনি যা অনুরোধের বস্তুর শরীরে রেখেছেন তা এড়ানো হবে।
হটফজজসুন্ডে

8

সুইফট ২.০ সমাধান এখানে রয়েছে:

 let urlStr = http://url_to_manage_post_requests” 
 let url = NSURL(string: urlStr) 
 let request: NSMutableURLRequest =
 NSMutableURLRequest(URL: url!) request.HTTPMethod = "POST"
 request.setValue(“application/json forHTTPHeaderField:”Content-Type”)
 request.timeoutInterval = 60.0 
 //additional headers
 request.setValue(“deviceIDValue”, forHTTPHeaderField:”DeviceId”)

 let bodyStr = string or data to add to body of request 
 let bodyData = bodyStr.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: true) 
 request.HTTPBody = bodyData

 let session = NSURLSession.sharedSession()

 let task = session.dataTaskWithRequest(request){
             (data: NSData?, response: NSURLResponse?, error: NSError?) -> Void in

             if let httpResponse = response as? NSHTTPURLResponse {
                print("responseCode \(httpResponse.statusCode)")
             }

            if error != nil {

                 // You can handle error response here
                 print("\(error)")
             }else {
                  //Converting response to collection formate (array or dictionary)
                 do{
                     let jsonResult: AnyObject = (try NSJSONSerialization.JSONObjectWithData(data!, options:
 NSJSONReadingOptions.MutableContainers))

                     //success code
                 }catch{
                     //failure code
                 }
             }
         }

   task.resume()

6

আপনি যদি সুইফ্ট ব্যবহার করছেন তবে জাস্ট লাইব্রেরি এটি আপনার জন্য করে। এটি রিডমে ফাইল থেকে উদাহরণ:

//  talk to registration end point
Just.post(
    "http://justiceleauge.org/member/register",
    data: ["username": "barryallen", "password":"ReverseF1ashSucks"],
    files: ["profile_photo": .URL(fileURLWithPath:"flash.jpeg", nil)]
) { (r)
    if (r.ok) { /* success! */ }
}

আকর্ষণীয়, খুব সাধারণ এবং
সোজাসাপ্টা

1
আমি সাধারণ প্যাটার্নটি পছন্দ করি
মেডস্কিল

2

তিজা কুমার বেথিনার কোডটি সুইফট 3 এর জন্য পরিবর্তিত হয়েছে:

    let urlStr = "http://url_to_manage_post_requests"
    let url = URL(string: urlStr)

    var request: URLRequest = URLRequest(url: url!)

    request.httpMethod = "POST"

    request.setValue("application/json", forHTTPHeaderField:"Content-Type")
    request.timeoutInterval = 60.0

    //additional headers
    request.setValue("deviceIDValue", forHTTPHeaderField:"DeviceId")

    let bodyStr = "string or data to add to body of request"
    let bodyData = bodyStr.data(using: String.Encoding.utf8, allowLossyConversion: true)
    request.httpBody = bodyData

    let task = URLSession.shared.dataTask(with: request) {
        (data: Data?, response: URLResponse?, error: Error?) -> Void in

        if let httpResponse = response as? HTTPURLResponse {
            print("responseCode \(httpResponse.statusCode)")
        }

        if error != nil {

            // You can handle error response here
            print("\(error)")
        } else {
            //Converting response to collection formate (array or dictionary)
            do {
                let jsonResult = (try JSONSerialization.jsonObject(with: data!, options:
                    JSONSerialization.ReadingOptions.mutableContainers))

                //success code
            } catch {
                //failure code
            }
        }
    }

    task.resume()

0
    use like this.....

    Create file

    #import <Foundation/Foundation.h>`    
    #import "SharedManager.h"
    #import "Constant.h"
    #import "UserDetails.h"

    @interface APISession : NSURLSession<NSURLSessionDelegate>
    @property (nonatomic, retain) NSMutableData *responseData;
    +(void)postRequetsWithParam:(NSMutableDictionary* )objDic withAPIName:(NSString* 
    )strAPIURL completionHandler:(void (^)(id result, BOOL status))completionHandler;
    @end

****************.m*************************
    #import "APISession.h"
    #import <UIKit/UIKit.h>
    @implementation APISession

    +(void)postRequetsWithParam:(NSMutableDictionary *)objDic withAPIName:(NSString 
    *)strAPIURL completionHandler:(void (^)(id, BOOL))completionHandler
    {
    NSURL *url=[NSURL URLWithString:strAPIURL];
    NSMutableURLRequest *request=[[NSMutableURLRequest alloc]initWithURL:url];
    [request setHTTPMethod:@"POST"];
    [request addValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
    NSError *err = nil;

    NSData *data=[NSJSONSerialization dataWithJSONObject:objDic options:NSJSONWritingPrettyPrinted error:&err];
    [request setHTTPBody:data];

    NSString *strJsonFormat = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
    NSLog(@"API URL: %@ \t  Api Request Parameter ::::::::::::::%@",url,strJsonFormat);
    //    NSLog(@"Request data===%@",objDic);
    NSURLSessionConfiguration *defaultConfigObject = [NSURLSessionConfiguration defaultSessionConfiguration];
    NSURLSession *session = [NSURLSession sessionWithConfiguration: defaultConfigObject delegate: nil delegateQueue: [NSOperationQueue mainQueue]];

    //  NSURLSession *session=[NSURLSession sharedSession];

    NSURLSessionTask *task=[session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error)
                            {
                                if (error==nil) {
                                    NSDictionary *dicData=[NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:&error];\
                                    NSLog(@"Response Data=============%@",dicData);
                                    if([[dicData valueForKey:@"tokenExpired"]integerValue] == 1)
                                    {

                                        NSLog(@"hello");
                                        NSDictionary *dict = [NSDictionary dictionaryWithObject:@"Access Token Expire." forKey:@"message"];
                                        [[NSNotificationCenter defaultCenter] postNotificationName:@"UserLogOut" object:self userInfo:dict];
                                    }
                                    dispatch_async(dispatch_get_main_queue(), ^{
                                        completionHandler(dicData,(error == nil));
                                    });
                                    NSLog(@"%@",dicData);
                                }
                                else{
                                    dispatch_async(dispatch_get_main_queue(), ^{
                                        completionHandler(error.localizedDescription,NO);
                                    });
                                }
                            }];
    //    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
    [task resume];
    //    });
    }
    @end

    *****************************in .your view controller***********
    #import "file"
    txtEmail.text = [txtEmail.text stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];

    {
            [SVProgressHUD showWithStatus:@"Loading..."];
            [SVProgressHUD setDefaultMaskType:SVProgressHUDMaskTypeGradient];

            NSMutableDictionary *objLoginDic=[[NSMutableDictionary alloc] init];
            [objLoginDic setValue:txtEmail.text forKey:@"email"];
            [objLoginDic setValue:@0            forKey:kDeviceType];
            [objLoginDic setValue:txtPassword.text forKey:kPassword];
            [objLoginDic setValue:@"376545432"  forKey:kDeviceTokan];
            [objLoginDic setValue:@""           forKey:kcountryId];
            [objLoginDic setValue:@""           forKey:kfbAccessToken];
            [objLoginDic setValue:@0            forKey:kloginType];

            [APISession postRequetsWithParam:objLoginDic withAPIName:KLOGIN_URL completionHandler:^(id result, BOOL status) {

                [SVProgressHUD dismiss];

                NSInteger statusResponse=[[result valueForKey:kStatus] integerValue];
                NSString *strMessage=[result valueForKey:KMessage];
                if (status) {
                    if (statusResponse == 1)
                {
                        UserDetails *objLoginUserDetail=[[UserDetails alloc] 
                        initWithObject:[result valueForKey:@"userDetails"]];
                          [[NSUserDefaults standardUserDefaults] 
                        setObject:@(objLoginUserDetail.userId) forKey:@"user_id"];
                        [[NSUserDefaults standardUserDefaults] synchronize];
                        [self clearTextfeilds];
                        HomeScreen *obj=[Kiran_Storyboard instantiateViewControllerWithIdentifier:@"HomeScreen"];
                        [self.navigationController pushViewController:obj animated:YES];
                    }
                    else{
                        [strMessage showAsAlert:self];
                    }
                }
            }];
        }
**********use model class for represnt data*************

    #import <Foundation/Foundation.h>
    #import "Constant.h"
    #import <objc/runtime.h>


    @interface UserDetails : NSObject
    @property(strong,nonatomic) NSString *emailId,
    *deviceToken,
    *countryId,
    *fbAccessToken,
    *accessToken,
    *countryName,
    *isProfileSetup,
    *profilePic,
    *firstName,
    *lastName,
    *password;

    @property (assign) NSInteger userId,deviceType,loginType;

    -(id)initWithObject :(NSDictionary *)dicUserData;
    -(void)saveLoginUserDetail;
    +(UserDetails *)getLoginUserDetail;
    -(UserDetails *)getEmptyModel;
    - (NSArray *)allPropertyNames;
    -(void)printDescription;
       -(NSMutableDictionary *)getDictionary;

    @end

    ******************model.m*************

    #import "UserDetails.h"
    #import "SharedManager.h"

    @implementation UserDetails



      -(id)initWithObject :(NSDictionary *)dicUserData
       {
       self = [[UserDetails alloc] init];
       if (self)
       {
           @try {
               [self setFirstName:([dicUserData valueForKey:@"firstName"] != [NSNull null])? 
               [dicUserData valueForKey:@"firstName"]:@""];


               [self setUserId:([dicUserData valueForKey:kUserId] != [NSNull null])? 
               [[dicUserData valueForKey:kUserId] integerValue]:0];


               }
        @catch (NSException *exception) {
            NSLog(@"Exception: %@",exception.description);
        }
        @finally {
        }
    }
    return self;
}

    -(UserDetails *)getEmptyModel{
    [self setFirstName:@""];
    [self setLastName:@""];



    [self setDeviceType:0];


    return self;
       }

     -  (void)encodeWithCoder:(NSCoder *)encoder {
    //    Encode properties, other class variables, etc
    [encoder encodeObject:_firstName forKey:kFirstName];


    [encoder encodeObject:[NSNumber numberWithInteger:_deviceType] forKey:kDeviceType];

    }

    - (id)initWithCoder:(NSCoder *)decoder {
    if((self = [super init])) {
        _firstName = [decoder decodeObjectForKey:kEmailId];

        _deviceType= [[decoder decodeObjectForKey:kDeviceType] integerValue];

    }
    return self;
    }
    - (NSArray *)allPropertyNames
    {
    unsigned count;
    objc_property_t *properties = class_copyPropertyList([self class], &count);

    NSMutableArray *rv = [NSMutableArray array];

    unsigned i;
    for (i = 0; i < count; i++)
    {
        objc_property_t property = properties[i];
        NSString *name = [NSString stringWithUTF8String:property_getName(property)];
        [rv addObject:name];
    }

    free(properties);

    return rv; 
    } 

    -(void)printDescription{
    NSMutableDictionary *dic = [[NSMutableDictionary alloc] init];

    for(NSString *key in [self allPropertyNames])
    {
        [dic setValue:[self valueForKey:key] forKey:key];
    }
    NSLog(@"\n========================= User Detail ==============================\n");
    NSLog(@"%@",[dic description]);
    NSLog(@"\n=============================================================\n");
    }
    -(NSMutableDictionary *)getDictionary{
    NSMutableDictionary *dic = [[NSMutableDictionary alloc] init];
    for(NSString *key in [self allPropertyNames])
    {
        [dic setValue:[self valueForKey:key] forKey:key];
    }
    return dic;
    }
    #pragma mark
    #pragma mark - Save and get User details
    -(void)saveLoginUserDetail{
    NSData *encodedObject = [NSKeyedArchiver archivedDataWithRootObject:self];
    [Shared_UserDefault setObject:encodedObject forKey:kUserDefault_SavedUserDetail];
    [Shared_UserDefault synchronize];
    }
      +(UserDetails *)getLoginUserDetail{
      NSData *encodedObject = [Shared_UserDefault objectForKey:kUserDefault_SavedUserDetail];
    UserDetails *object = [NSKeyedUnarchiver unarchiveObjectWithData:encodedObject];
    return object;
   }
    @end


     ************************usefull code while add data into model and get data********

                   NSLog(@"Response %@",result);
                  NSString *strMessg = [result objectForKey:kMessage];
                 NSString *status = [NSString stringWithFormat:@"%@",[result 
                objectForKey:kStatus]];

            if([status isEqualToString:@"1"])
            {
                arryBankList =[[NSMutableArray alloc]init];

                NSMutableArray *arrEvents=[result valueForKey:kbankList];
                ShareOBJ.isDefaultBank = [result valueForKey:kisDefaultBank];
                if ([arrEvents count]>0)
                {

                for (NSMutableArray *dic in arrEvents)
                    {
                        BankList *objBankListDetail =[[BankList alloc]initWithObject:[dic 
                         mutableCopy]];
                        [arryBankList addObject:objBankListDetail];
                    }
           //display data using model...
           BankList *objBankListing  =[arryBankList objectAtIndex:indexPath.row];

1
ব্যবহার করবেন না -[NSUserDefaults synchronize]। থেকে অ্যাপলের ডকুমেন্টেশন "এই পদ্ধতি অপ্রয়োজনীয় এবং ব্যবহার করা উচিত নয়।"
অ্যাশলে মিলস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.