আইওএস: এইচটিটিপি পোস্টের অনুরোধটি কীভাবে সম্পাদন করবেন?


128

আমি আইওএস বিকাশের কাছে পৌঁছে যাচ্ছি এবং এইচটিটিপি পোস্ট অনুরোধটি সম্পাদনের জন্য আমার প্রথম অ্যাপ্লিকেশনগুলির মধ্যে একটি থাকতে চাই।

আমি যতদূর বুঝতে পারি, আমার এমন সংযোগটি পরিচালনা করা উচিত যা কোনও সামগ্রীর মাধ্যমে অনুরোধটি পরিচালনা করে NSURLConnection, যা আমাকে ডেলিগেট অবজেক্ট রাখতে বাধ্য করে, যার ফলে ডেটা ইভেন্টগুলি পরিচালনা করতে পারে।

কেউ দয়া করে ব্যবহারিক উদাহরণ দিয়ে কাজটি পরিষ্কার করতে পারেন?

প্রমাণীকরণের ডেটা (ব্যবহারকারী নাম এবং পাসওয়ার্ড) প্রেরণ এবং একটি সাধারণ পাঠ্য প্রতিক্রিয়া ফিরে পাওয়ার জন্য আমার কোনও https শেষের সাথে যোগাযোগ করা উচিত।

উত্তর:


167

আপনি নিম্নলিখিত হিসাবে এনএসআরএল সংযোগ ব্যবহার করতে পারেন:

  1. আপনার সেট করুন NSURLRequest: requestWithURL:(NSURL *)theURLঅনুরোধটি আরম্ভ করার জন্য ব্যবহার করুন ।

    আপনার যদি কোনও POST অনুরোধ এবং / অথবা HTTP শিরোনাম নির্দিষ্ট করতে হয় তবে এর NSMutableURLRequestসাথে ব্যবহার করুন

    • (void)setHTTPMethod:(NSString *)method
    • (void)setHTTPBody:(NSData *)data
    • (void)setValue:(NSString *)value forHTTPHeaderField:(NSString *)field
  2. আপনার অনুরোধটি 2 উপায়ে প্রেরণ করুন NSURLConnection:

    • সিঙ্ক্রোনাস: (NSData *)sendSynchronousRequest:(NSURLRequest *)request returningResponse:(NSURLResponse **)response error:(NSError **)error

      এটি NSDataএমন একটি পরিবর্তনশীল দেয় যা আপনি প্রক্রিয়া করতে পারেন can

      গুরুত্বপূর্ণ: ইউআইকে ব্লক করা এড়াতে আলাদা থ্রেডে সিঙ্ক্রোনাস অনুরোধটি বন্ধ করে দেওয়ার কথা মনে রাখবেন।

    • অ্যাসিঙ্ক্রোনাস: (void)start

নিম্নলিখিত হিসাবে সংযোগটি পরিচালনা করতে আপনার এনএসআরএল সংযোগের প্রতিনিধি সেট করতে ভুলবেন না:

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {
    [self.data setLength:0];
}

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)d {
    [self.data appendData:d];
}

- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error {
    [[[[UIAlertView alloc] initWithTitle:NSLocalizedString(@"Error", @"")
                                 message:[error localizedDescription]
                                delegate:nil
                       cancelButtonTitle:NSLocalizedString(@"OK", @"") 
                       otherButtonTitles:nil] autorelease] show];
}

- (void)connectionDidFinishLoading:(NSURLConnection *)connection {
    NSString *responseText = [[NSString alloc] initWithData:self.data encoding:NSUTF8StringEncoding];

    // Do anything you want with it 

    [responseText release];
}

// Handle basic authentication challenge if needed
- (void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge {
    NSString *username = @"username";
    NSString *password = @"password";

    NSURLCredential *credential = [NSURLCredential credentialWithUser:username
                                                             password:password
                                                          persistence:NSURLCredentialPersistenceForSession];
    [[challenge sender] useCredential:credential forAuthenticationChallenge:challenge];
}

4
অ্যাপল বলেছে যে সিঙ্ক্রোনাস অনুরোধগুলি ব্যবহার করা "প্রস্তাবিত নয়" বিকাশকারী app
অ্যারন ব্রাউন

@ অ্যান নিস উত্তর, তবে আমি শেষ পদ্ধতিটি নিয়ে একটু সংশয়ী ছিলাম didReceiveAuthenticationChallenge। হার্ড-কোডিং পাসওয়ার্ড / ব্যবহারকারীর নাম সহ কোনও সুরক্ষা সমস্যা আছে? এই কাছাকাছি কোন উপায় আছে?
স্যাম স্পেন্সার

2
সাধারণত আপনি শংসাপত্রগুলি কীচেইনে সংরক্ষণ করবেন এবং বেসিক-আথ পরিচালনা করতে সেখানে সেগুলি পুনরুদ্ধার করবেন।
আনহ দো

2
আইওএস 5 এর পরে + (অকার্যকর) সেন্ড ক্রোনাস রিকোয়েস্ট : (এনএসআরএলআরকিউয়েস্ট ) অনুরোধ সারি: (এনএসআরপিউশনকিউ *) সারি সমাপ্তি হ্যান্ডলার : (অকার্যকর (^) (এনএসআরএলআরএসপিএস , এনএসআরটা *)) হ্যান্ডলার
চুনকিগু

13

সম্পাদনা: ASIHTTPRequest বিকাশকারী দ্বারা পরিত্যাগ করা হয়েছে। এটি এখনও সত্যিই ভাল আইএমও, তবে সম্ভবত আপনার এখন অন্য কোথাও দেখা উচিত।

আপনি যদি HTTPS পরিচালনা করছেন তবে আমি ASIHTTPRequest লাইব্রেরিটি ব্যবহারের সুপারিশ করব । এমনকি https ছাড়াই এটি এ জাতীয় স্টাফগুলির জন্য সত্যিই দুর্দান্ত একটি মোড়ক সরবরাহ করে এবং সাদামাটা HTTP- র মাধ্যমে নিজেকে করা খুব কঠিন নয়, আমি কেবল লাইব্রেরিটি সুন্দর এবং শুরু করার দুর্দান্ত উপায় বলে মনে করি।

এইচটিটিপিএস জটিলতা বিভিন্ন পরিস্থিতিতে তুচ্ছ থেকে অনেক দূরে, এবং আপনি যদি সমস্ত প্রকারগুলি পরিচালনা করতে দৃ be় হতে চান তবে আপনি এএসআই লাইব্রেরিটিকে একটি সত্যিকারের সহায়তা খুঁজে পাবেন।


13
ASIHTTPRequest গ্রন্থাগারটি এই বিকাশকারী কর্তৃক আনুষ্ঠানিকভাবে ত্যাগ করা হয়েছে কারণ এই পোস্টটিতে বলা হয়েছে: allseeing-i.com/ [rerequest_re कृपया] ; , আমি আপনাকে অন্য লাইব্রেরিগুলি বিকাশকারীদের পরামর্শ অনুসারে ব্যবহার করার পরামর্শ দিচ্ছি বা আরও ভাল, এনএসআরএল অনুরোধ :) চিয়ার্স শেখার চেষ্টা করুন।
গোলস

@ মিস্টার গ্যান্ডো - আপনার লিঙ্কটি কাজ করছে বলে মনে হচ্ছে না - লক্ষ করুন যে আধা-কোলনটি উল্লেখযোগ্য। এটি বলেছিল, একে পরিত্যক্ত দেখে ভীষণ দুঃখ হয়েছে। এটি সত্যিকারের প্রচুর পরিমাণে সত্যই সুন্দরভাবে কাজ করে এবং এগুলি সমস্তটির প্রতিরূপ করা অনেক কাজ ... লজ্জাজনক ...
রোজার

এবং সেই লিঙ্কটিও কাজ করে না। যে কেউ এটির সন্ধান করার চেষ্টা করছেন, দয়া করে নোট করুন সঠিক ইউআরএলের শেষে একটি অর্ধ-কোলন প্রয়োজন - এসও হ'ল কারণ; লোকেরা পোস্ট করছে এমন লিঙ্কগুলি থেকে বাদ পড়তে।
রজার

3
বেশিরভাগ লোকেরা এখন ব্যবহার করছেন বলে মনে হচ্ছে এএফ নেটওয়ার্কিং
ভাদোফ

7

আমি ভেবেছিলাম যে আমি এই পোস্টটি কিছুটা আপডেট করব এবং বলব যে আইওএস সম্প্রদায়ের অনেকগুলি পরিত্যাজ্য হওয়ার পরে এএফ নেটওয়ার্কিংয়ে চলে গেছে ASIHTTPRequest। আমি এটি সুপারিশ। এটি চারপাশে একটি দুর্দান্ত মোড়ক NSURLConnectionএবং অ্যাসিক্রোনাস কলগুলি এবং মূলত আপনার যা প্রয়োজন হতে পারে তার জন্য অনুমতি দেয়।


2
আমি জানি যে গ্রহণযোগ্য উত্তরটি ভাল, আচরণ বা কিছু বা বোঝানোর অর্থ নয়, তবে অবশ্যই এটির আরও বেশি অগ্রগতি হওয়া উচিত। সম্ভবত যদি উদাহরণস্বরূপ এবং কিছু কোড টুকরা যুক্ত করা হয়, যেমন প্রশ্ন থেকেই যায়?
একরপো

6

আইওএস 7 + এর জন্য একটি আপডেট হওয়া উত্তর। এটি এনএসআরএলসেশন ব্যবহার করে, নতুন হটনেস। দাবি অস্বীকার, এটি অনির্ধারিত এবং একটি পাঠ্য ক্ষেত্রে লেখা হয়েছিল:

- (void)post {
    NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration] delegate:self delegateQueue:nil];
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"https://example.com/dontposthere"] cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:60.0];
    // Uncomment the following two lines if you're using JSON like I imagine many people are (the person who is asking specified plain text)
    // [request addValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
    // [request addValue:@"application/json" forHTTPHeaderField:@"Accept"]; 
    [request setHTTPMethod:@"POST"];
    NSURLSessionDataTask *postDataTask = [session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
        NSString *responseString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
    }];
    [postDataTask resume];
}

-(void)URLSession:(NSURLSession *)session didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge completionHandler:(void (^)(    NSURLSessionAuthChallengeDisposition disposition, NSURLCredential *credential))completionHandler {
    completionHandler(NSURLSessionAuthChallengeUseCredential, [NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust]);
}

বা আরও ভাল, এএফ নেটওয়ার্কিং ২.০+ ব্যবহার করুন। সাধারণত আমি এএফএইচটিটিপিএসসেশন ম্যানেজার সাবক্লাস করতাম, তবে একটি সংক্ষিপ্ত উদাহরণ দেওয়ার জন্য আমি এগুলি সমস্ত পদ্ধতিতে রাখছি।

- (void)post {
    AFHTTPSessionManager *manager = [[AFHTTPSessionManager alloc] initWithBaseURL:[NSURL URLWithString:@"https://example.com"]];
    // Many people will probably want [AFJSONRequestSerializer serializer];
    manager.requestSerializer = [AFHTTPRequestSerializer serializer];
    // Many people will probably want [AFJSONResponseSerializer serializer];
    manager.responseSerializer = [AFHTTPRequestSerializer serializer];
    manager.securityPolicy.allowInvalidCertificates = NO; // Some servers require this to be YES, but default is NO.
    [manager.requestSerializer setAuthorizationHeaderFieldWithUsername:@"username" password:@"password"];
    [[manager POST:@"dontposthere" parameters:nil success:^(NSURLSessionDataTask *task, id responseObject) {
        NSString *responseString = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding];
    } failure:^(NSURLSessionDataTask *task, NSError *error) {
        NSLog(@"darn it");
    }] resume];
}

আপনি যদি JSON প্রতিক্রিয়া সিরিয়ালাইজার ব্যবহার করছেন, প্রতিক্রিয়াবজেক্টটি JSON প্রতিক্রিয়া (প্রায়শই NSD অভিধান বা NSArray) থেকে অবজেক্ট হবে।


1

দ্রষ্টব্য: খাঁটি সুইফট 3 (এক্সকোড 8) উদাহরণ: দয়া করে নীচের নমুনা কোডটি ব্যবহার করে দেখুন। এটি এর dataTaskকার্যকারিতার সহজ উদাহরণ URLSession

func simpleDataRequest() {

        //Get the url from url string
        let url:URL = URL(string: "YOUR URL STRING")!

        //Get the session instance
        let session = URLSession.shared

        //Create Mutable url request
        var request = URLRequest(url: url as URL)

        //Set the http method type
        request.httpMethod = "POST"

        //Set the cache policy
        request.cachePolicy = URLRequest.CachePolicy.reloadIgnoringCacheData

        //Post parameter
        let paramString = "key=value"

        //Set the post param as the request body
        request.httpBody = paramString.data(using: String.Encoding.utf8)

        let task = session.dataTask(with: request as URLRequest) {
            (data, response, error) in

            guard let _:Data = data as Data?, let _:URLResponse = response  , error == nil else {

                //Oops! Error occured.
                print("error")
                return
            }

            //Get the raw response string
            let dataString = String(data: data!, encoding: String.Encoding(rawValue: String.Encoding.utf8.rawValue))

            //Print the response
            print(dataString!)

        }

        //resume the task
        task.resume()

    }

0

এক্সকোড 8 এবং সুইফট 3.0

ইউআরএলসেশন ব্যবহার:

 let url = URL(string:"Download URL")!
 let req = NSMutableURLRequest(url:url)
 let config = URLSessionConfiguration.default
 let session = URLSession(configuration: config, delegate: self, delegateQueue: OperationQueue.main)

 let task : URLSessionDownloadTask = session.downloadTask(with: req as URLRequest)
task.resume()

ইউআরএলসেশন ডেলিগেট কল:

func urlSession(_ session: URLSession, task: URLSessionTask, didCompleteWithError error: Error?) {

}


func urlSession(_ session: URLSession, downloadTask: URLSessionDownloadTask, 
didWriteData bytesWritten: Int64, totalBytesWritten writ: Int64, totalBytesExpectedToWrite exp: Int64) {
                   print("downloaded \(100*writ/exp)" as AnyObject)

}

func urlSession(_ session: URLSession, downloadTask: URLSessionDownloadTask, didFinishDownloadingTo location: URL){

}

ব্লক জিইটি / পোস্ট / পুট / ডিলিট ব্যবহার করুন:

 let request = NSMutableURLRequest(url: URL(string: "Your API URL here" ,param: param))!,
        cachePolicy: .useProtocolCachePolicy,
        timeoutInterval:"Your request timeout time in Seconds")
    request.httpMethod = "GET"
    request.allHTTPHeaderFields = headers as? [String : String] 

    let session = URLSession.shared

    let dataTask = session.dataTask(with: request as URLRequest) {data,response,error in
        let httpResponse = response as? HTTPURLResponse

        if (error != nil) {
         print(error)
         } else {
         print(httpResponse)
         }

        DispatchQueue.main.async {
           //Update your UI here
        }

    }
    dataTask.resume()

আমার জন্য ভাল কাজ .. এটি চেষ্টা 100% ফলাফল গ্যারান্টি


0

এখানে এনএসআরএলসেশন ব্যবহার করে আইওএস 8+ এর জন্য পোষ্ট এইচটিটিপি অনুরোধ কীভাবে কাজ করে:

- (void)call_PostNetworkingAPI:(NSURL *)url withCompletionBlock:(void(^)(id object,NSError *error,NSURLResponse *response))completion
{
    NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration];
    config.requestCachePolicy = NSURLRequestReloadIgnoringLocalCacheData;
    config.URLCache = nil;
    config.timeoutIntervalForRequest = 5.0f;
    config.timeoutIntervalForResource =10.0f;
    NSURLSession *session = [NSURLSession sessionWithConfiguration:config delegate:nil delegateQueue:nil];
    NSMutableURLRequest *Req=[NSMutableURLRequest requestWithURL:url];
    [Req setHTTPMethod:@"POST"];

    NSURLSessionDataTask *task = [session dataTaskWithRequest:Req completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
        if (error == nil) {

            NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:nil];
            if (dict != nil) {
                completion(dict,error,response);
            }
        }else
        {
            completion(nil,error,response);
        }
    }];
    [task resume];

}

আশা করি এটি আপনার নিম্নলিখিত প্রয়োজনীয়তা পূরণ করবে।

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