কোনও পোস্ট NSURL অনুসন্ধানে ডেটা যুক্ত করুন


83

আপনি কীভাবে কোনও বিদ্যমানটিতে ডেটা যুক্ত করবেন POST NSURLRequest? আমার একটি নতুন প্যারামিটার যুক্ত করা দরকার userId=2323


4
কিছু প্রশ্ন সহ আপনার প্রশ্ন বর্ণনা করুন।
তীর্থ

উত্তর:


192

আপনি যদি তৃতীয় পক্ষের ক্লাস ব্যবহার করতে না চান তবে নিম্নলিখিতটি আপনি কীভাবে পোস্ট বডি সেট করবেন ...

NSURL *aUrl = [NSURL URLWithString:@"http://www.apple.com/"];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:aUrl
                                         cachePolicy:NSURLRequestUseProtocolCachePolicy
                                     timeoutInterval:60.0];

[request setHTTPMethod:@"POST"];
NSString *postString = @"company=Locassa&quality=AWESOME!";
[request setHTTPBody:[postString dataUsingEncoding:NSUTF8StringEncoding]];

NSURLConnection *connection= [[NSURLConnection alloc] initWithRequest:request 
                                                             delegate:self];

কেবল আপনার কী / মান জুটি পোস্ট স্ট্রিংয়ে যুক্ত করুন


4
আমার একটি বিদ্যমান এনএসআরএল অনুরোধে নতুন প্যারামিটার যুক্ত করতে হবে, একটি নতুন অনুরোধ তৈরি করতে হবে না। আমি বিশ্বাস করি এটি প্রথমে একটি NSMutable URLRequest এ রূপান্তর করতে হবে। আমি যা জানি না তা হ'ল কীভাবে বিদ্যমান পোষ্ট ডেটা পাবেন।
টিম

4
অন্য শব্দগুলি কীভাবে আপনি কোনও বিদ্যমান অনুরোধটির পোস্টস্ট্রিং পাবেন?
টিম

4
আপনি - (এনএসডিটা *) এইচটিটিপিবিডি অ্যাক্সেস করতে পারেন যা আপনি এনএসএস স্ট্রিং, কী / মান জোড়াতে এনকোড করতে পারবেন
সাইমন লি

বিদ্যমান পোস্ট ডেটা আপনার উদাহরণ হিসাবে ইউটিএফ 8 এ এনকোড করা আছে। আমি কীভাবে এনকোডিংটি বিপরীত করতে পারি? তারপরে নতুন প্যারামিটারগুলি দিয়ে একটি নতুন স্ট্রিং তৈরি করবেন? তারপরে নতুন পোস্ট ডেটা এনকোড করুন
টিম

4
এটি কাজ করা উচিত তবে আমি এই মুহুর্তে এটি পরীক্ষা করতে পারছি না .... NSMutableString * موجودপোস্ট = [[NSMutableString বরাদ্দ] initWithData: [রেকর্ড HTTPBody] এনকোডিং: NSUTF8StringEncoding]; [বিদ্যমান পোষ্ট অ্যাপেন্ডফর্ম্যাট: @ "&% @ =% @", @ "নাম", @ "লোকাসা"];
সাইমন লি

16

NSMutableURLRequestকল করার আগে অবশ্যই সমস্ত পরিবর্তন করতে হবে NSURLConnection

উপরের কোডটি অনুলিপি করে আটকানোর সাথে সাথে আমি এই সমস্যাটি দেখতে পাচ্ছি এবং চালনা করে TCPMonদেখুন এবং অনুরোধটি GETপ্রত্যাশার পরিবর্তে হয়েছে POST

NSURL *aUrl = [NSURL URLWithString:@"http://www.apple.com/"];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:aUrl
                                     cachePolicy:NSURLRequestUseProtocolCachePolicy
                                 timeoutInterval:60.0];


[request setHTTPMethod:@"POST"];
NSString *postString = @"company=Locassa&quality=AWESOME!";
[request setHTTPBody:[postString dataUsingEncoding:NSUTF8StringEncoding]];

NSURLConnection *connection= [[NSURLConnection alloc] initWithRequest:request 
                                                         delegate:self];

12

POSTঅনুরোধ গঠনের বিষয়ে পূর্ববর্তী পোস্টগুলি মূলত সঠিক (শরীরের প্যারামিটারগুলি যুক্ত করুন, URL নয়)। তবে যদি কোনও সংরক্ষিত অক্ষর (উদাহরণস্বরূপ স্পেস, অ্যাম্পারস্যান্ড, প্লাস চিহ্ন) ধারণকারী ইনপুট ডেটার কোনও সম্ভাবনা থাকে তবে আপনি এই সংরক্ষিত অক্ষরগুলি পরিচালনা করতে চাইবেন। যথা, আপনার ইনপুটটি শতাংশে পালাতে হবে।

//create body of the request

NSString *userid = ...
NSString *encodedUserid = [self percentEscapeString:userid];
NSString *postString    = [NSString stringWithFormat:@"userid=%@", encodedUserid];
NSData   *postBody      = [postString dataUsingEncoding:NSUTF8StringEncoding];

//initialize a request from url

NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
[request setHTTPBody:postBody];
[request setHTTPMethod:@"POST"];
[request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];

//initialize a connection from request, any way you want to, e.g.

NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request delegate:self];

precentEscapeStringপদ্ধতিটি যেখানে নিম্নলিখিত হিসাবে সংজ্ঞায়িত করা হয়েছে:

- (NSString *)percentEscapeString:(NSString *)string
{
    NSString *result = CFBridgingRelease(CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault,
                                                                                 (CFStringRef)string,
                                                                                 (CFStringRef)@" ",
                                                                                 (CFStringRef)@":/?@!$&'()*+,;=",
                                                                                 kCFStringEncodingUTF8));
    return [result stringByReplacingOccurrencesOfString:@" " withString:@"+"];
}

দ্রষ্টব্য, এখানে একটি প্রতিশ্রুতিবদ্ধ NSStringপদ্ধতি ছিল stringByAddingPercentEscapesUsingEncoding(এখন অবহেলিত) এটি খুব অনুরূপ কিছু করে তবে এটি ব্যবহার করার প্রলোভনকে প্রতিহত করে। এটি কিছু অক্ষর পরিচালনা করে (উদাহরণস্বরূপ স্পেস ক্যারেক্টার) তবে অন্য কয়েকটি নয় (যেমন: +বা &অক্ষরগুলি)।

সমসাময়িক সমতুল্য হ'ল stringByAddingPercentEncodingWithAllowedCharacters, তবে, আবার ব্যবহার করার প্রলোভিত হবেন না URLQueryAllowedCharacterSet, কারণ এটি অনস্কেপডকেও অনুমতি দেয় +এবং &পাস করে। এই দুটি অক্ষরকে বিস্তৃত "ক্যোয়ারী" এর মধ্যে অনুমতি দেওয়া হয়েছে, তবে যদি এই চরিত্রগুলি কোনও প্রশ্নের মধ্যে কোনও মানের মধ্যে উপস্থিত হয় তবে তাদের অবশ্যই পালাতে হবে। প্রযুক্তিগতভাবে, আপনি হয় URLQueryAllowedCharacterSetকোনও পরিবর্তনীয় চরিত্র সেট তৈরি করতে এবং সেগুলিতে অন্তর্ভুক্ত কয়েকটি অক্ষর মুছে ফেলতে বা স্ক্র্যাচ থেকে আপনার নিজস্ব চরিত্র সেট তৈরি করতে ব্যবহার করতে পারেন।

উদাহরণস্বরূপ, যদি আপনি Alamofire এর তাকান প্যারামিটার এনকোডিং , তারা নিতে URLQueryAllowedCharacterSetপরে অপসারণ generalDelimitersToEncode(যার মধ্যে অক্ষর #, [, ], এবং @, কিন্তু কিছু পুরানো ওয়েব সার্ভার একটি ঐতিহাসিক বাগ কারণ, তন্ন তন্ন ?না /) এবং subDelimitersToEncode(অর্থাত !, $, &, ', (, ), *, +, ,, ;, এবং =)। এটি সঠিক বাস্তবায়ন (যদিও আপনি অপসারণের বিষয়ে বিতর্ক করতে পারেন ?এবং /), যদিও বেশ দোষযুক্ত। সম্ভবত CFURLCreateStringByAddingPercentEscapesআরও সরাসরি / দক্ষ।


সম্পর্কে সত্য stringByAddingPercentEscapesUsingEncoding:, তবে stringByAddingPercentEncodingWithAllowedCharacters:প্রতিটি চরিত্রের সাথে সূক্ষ্মভাবে কাজ করে। উদাহরণ: URLString = [URLString stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]];
আলেজান্দ্রো কোটিলা

@ আলেজান্দ্রো ডেভিডকোটিলোরোজাস - আপনি ব্যবহার stringByAddingPercentEncodingWithAllowedCharactersকরতে পারবেন তবে আপনি ব্যবহার করতে পারবেন না URLQueryAllowedCharacterSet, যেমন এতে অন্তর্ভুক্ত রয়েছে +এবং &(যেগুলি বিস্তৃত ক্যোয়ারির মধ্যে অনুমোদিত চরিত্রের মধ্যে রয়েছে, তবে যদি এই চরিত্রগুলি কোনও প্রশ্নের মধ্যে কোনও মানের মধ্যে উপস্থিত হয় তবে অবশ্যই তাদের পালাতে হবে, যা চরিত্রের সেটটি করবে না )। সুতরাং, আপনি হয় URLQueryAllowedCharacterSetএকটি পরিবর্তনীয় চরিত্র সেট তৈরি করতে এবং সেগুলিতে অন্তর্ভুক্ত কয়েকটি অক্ষর মুছে ফেলতে বা স্ক্র্যাচ থেকে আপনার নিজস্ব চরিত্র সেট তৈরি করতে ব্যবহার করতে পারেন। বা ব্যবহার CFURLCreateStringByAddingPercentEscapes
রব

দুর্দান্ত উত্তর, সত্যিই এই সমস্ত গভীরতা এড়াতে অ্যালামোফায়ার ব্যবহারের ক্ষেত্রে কেস তৈরি করে!
ড্যান রোজনস্টার্ক

CFURLCreateStringByAddingPercentEscapesএখন যেটি অবহেলিত তা দেওয়া হল, আপনার যথাযথ চরিত্রটি নিজেকে সেট করা উচিত। স্ট্যাকওভারফ্লো . com/a/54742187/1271826 দেখুন ।
রব

8
 NSURL *url= [NSURL URLWithString:@"https://www.paypal.com/cgi-bin/webscr"];
 NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:aUrl
                                                        cachePolicy:NSURLRequestUseProtocolCachePolicy
                                                    timeoutInterval:10.0];
[request setHTTPMethod:@"POST"];
 NSString *postString = @"userId=2323";
[request setHTTPBody:[postString dataUsingEncoding:NSUTF8StringEncoding]];

8

উপরের উদাহরণ কোডটি আমার পক্ষে সত্যিই সহায়ক ছিল, তবে (যেমন উপরে বর্ণিত হয়েছে), আমি মনে করি আপনার NSMutableURLRequestপরিবর্তে ব্যবহার করা দরকার NSURLRequest। এটির বর্তমান ফর্মে, আমি setHTTPMethodকলটির প্রতিক্রিয়া জানাতে পারি না । টাইপ স্থির জিনিসগুলি ঠিক আপ পরিবর্তন করা।


1

যে কোনও একটি দ্রুত সমাধানের সন্ধান করছে

let url = NSURL(string: "http://www.apple.com/")
let request = NSMutableURLRequest(URL: url!)
request.HTTPBody = "company=Locassa&quality=AWESOME!".dataUsingEncoding(NSUTF8StringEncoding)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.