आप किसी मौजूदा डेटा को कैसे जोड़ते हैं POST
NSURLRequest
? मुझे एक नया पैरामीटर जोड़ने की जरूरत है userId=2323
।
जवाबों:
यदि आप तृतीय पक्ष कक्षाओं का उपयोग नहीं करना चाहते हैं तो निम्नलिखित है कि आप पोस्ट बॉडी कैसे सेट करते हैं ...
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];
बस अपनी कुंजी / मूल्य जोड़ी को पोस्ट स्ट्रिंग में संलग्न करें
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];
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]];
stringByAddingPercentEncodingWithAllowedCharacters
, लेकिन आप इसका उपयोग नहीं कर सकते URLQueryAllowedCharacterSet
, जैसे कि इसमें शामिल हैं +
और &
(जो कि व्यापक क्वेरी के भीतर वर्ण की अनुमति है, लेकिन यदि वे वर्ण किसी क्वेरी के भीतर एक मान में प्रकट होते हैं, तो उन्हें बच जाना चाहिए, जो कि वर्ण सेट नहीं करेगा )। तो, आप या तो URLQueryAllowedCharacterSet
एक उत्परिवर्तित वर्ण सेट बनाने के लिए उपयोग कर सकते हैं और कुछ वर्णों को हटा सकते हैं, जिन्हें उन्होंने वहां शामिल किया है, या खरोंच से अपना स्वयं का वर्ण सेट करें। या उपयोग करें CFURLCreateStringByAddingPercentEscapes
।
CFURLCreateStringByAddingPercentEscapes
अब पदावनत कर दिया गया है, आपको वास्तव में स्वयं को निर्धारित उचित चरित्र का निर्माण करना चाहिए। Stackoverflow.com/a/54742187/1271826 देखें ।
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]];
ऊपर दिया गया उदाहरण कोड वास्तव में मेरे लिए उपयोगी था, हालाँकि (जैसा कि ऊपर संकेत दिया गया है), मुझे लगता है कि आपको NSMutableURLRequest
इसके बजाय उपयोग करने की आवश्यकता है NSURLRequest
। अपने वर्तमान रूप में, मैं इसे setHTTPMethod
कॉल का जवाब देने के लिए नहीं मिला । प्रकार निश्चित चीजों को बदलना।
कोई भी एक तेजी से समाधान की तलाश में
let url = NSURL(string: "http://www.apple.com/")
let request = NSMutableURLRequest(URL: url!)
request.HTTPBody = "company=Locassa&quality=AWESOME!".dataUsingEncoding(NSUTF8StringEncoding)