पोस्ट NSURLRequest में डेटा जोड़ें


83

आप किसी मौजूदा डेटा को कैसे जोड़ते हैं POST NSURLRequest? मुझे एक नया पैरामीटर जोड़ने की जरूरत है userId=2323


3
कृपया कुछ कोड के साथ अपने प्रश्न का वर्णन करें।
तीथ

जवाबों:


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];

बस अपनी कुंजी / मूल्य जोड़ी को पोस्ट स्ट्रिंग में संलग्न करें


2
मुझे मौजूदा NSURLRequest में नया पैरामीटर जोड़ने की जरूरत है, न कि नया अनुरोध बनाने की। मेरा मानना ​​है कि इसे पहले NSMutableURLRequest में बदलना होगा। मुझे नहीं पता कि मौजूदा POST डेटा कैसे मिलता है।
टिम

1
क्या अन्य शब्द मौजूदा अनुरोध के पोस्टस्ट्रिंग को कैसे प्राप्त करते हैं?
टिम

1
आप - (NSData *) HTTPBody पर पहुँच सकते हैं जिसे आप एनएसएसट्रिंग, की / वैल्यू पेयर में एनकोड कर सकते हैं
साइमन ली

मौजूदा पोस्ट डेटा आपके उदाहरण के रूप में UTF8 में एन्कोडेड है। मैं एन्कोडिंग को कैसे उल्टा कर सकता हूं? फिर नए मापदंडों के साथ एक नया स्ट्रिंग बनाएं? फिर नए पोस्ट डेटा को सांकेतिक शब्दों में बदलना
टिम

1
यह काम करना चाहिए, लेकिन मैं इसे इस समय परीक्षण नहीं कर सकता .... NSMutableString * मौजूदाPost = [[NSMutableString आवंटित] initWithData: [req HTTPBody] एन्कोडिंग: NSUTF8StringEccoding]; [मौजूदापोस्ट appendFormat: @ "&% @ =% @", @ "नाम", @ "लोकासा"];
साइमन ली

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, क्योंकि यह भी अनुमति देता है +और &unescaped पास। उन दो पात्रों को व्यापक "क्वेरी" के भीतर अनुमति दी जाती है, लेकिन यदि वे वर्ण किसी क्वेरी के भीतर एक मूल्य के भीतर दिखाई देते हैं, तो उन्हें बच जाना चाहिए। तकनीकी रूप से, आप या तो URLQueryAllowedCharacterSetएक उत्परिवर्तित वर्ण सेट बनाने के लिए उपयोग कर सकते हैं और कुछ वर्णों को हटा सकते हैं जिन्हें उन्होंने वहाँ शामिल किया है, या खरोंच से अपना स्वयं का वर्ण सेट बनाएँ।

उदाहरण के लिए, यदि आप Alamofire के देखो पैरामीटर एन्कोडिंग , वे ले URLQueryAllowedCharacterSetऔर फिर हटाने generalDelimitersToEncode(जो भी शामिल है वर्ण #, [, ], और @, लेकिन कुछ पुराने वेब सर्वर में एक ऐतिहासिक बग की वजह से, न तो ?है और न ही /) और subDelimitersToEncode(यानी !, $, &, ', (, ), *, +, ,, ;, और =)। यह सही कार्यान्वयन है (हालांकि आप हटाने के बारे में बहस कर सकते हैं ?और /), हालांकि बहुत जटिल हैं। शायद CFURLCreateStringByAddingPercentEscapesअधिक प्रत्यक्ष / कुशल है।


के बारे में सच है stringByAddingPercentEscapesUsingEncoding:, लेकिन stringByAddingPercentEncodingWithAllowedCharacters:हर चरित्र के साथ ठीक काम करता है। उदाहरण:URLString = [URLString stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]];
अलेजांद्रो कोटिला

@AlejandroDavidCotillaRojas - आप उपयोग कर सकते हैं stringByAddingPercentEncodingWithAllowedCharacters, लेकिन आप इसका उपयोग नहीं कर सकते URLQueryAllowedCharacterSet, जैसे कि इसमें शामिल हैं +और &(जो कि व्यापक क्वेरी के भीतर वर्ण की अनुमति है, लेकिन यदि वे वर्ण किसी क्वेरी के भीतर एक मान में प्रकट होते हैं, तो उन्हें बच जाना चाहिए, जो कि वर्ण सेट नहीं करेगा )। तो, आप या तो URLQueryAllowedCharacterSetएक उत्परिवर्तित वर्ण सेट बनाने के लिए उपयोग कर सकते हैं और कुछ वर्णों को हटा सकते हैं, जिन्हें उन्होंने वहां शामिल किया है, या खरोंच से अपना स्वयं का वर्ण सेट करें। या उपयोग करें CFURLCreateStringByAddingPercentEscapes
रोब

महान जवाब, वास्तव में यह सब गहराई से बचने के लिए अल्मोफायर का उपयोग करने के लिए मामला बनाता है!
बजे डैन रोसेनस्टार्क

यह देखते हुए कि CFURLCreateStringByAddingPercentEscapesअब पदावनत कर दिया गया है, आपको वास्तव में स्वयं को निर्धारित उचित चरित्र का निर्माण करना चाहिए। Stackoverflow.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)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.