2012-03-27 11 views
27

का उपयोग कर उद्देश्य सी में पोस्ट डेटा मैं एक PHP वेब सेवा में डेटा पोस्ट करने की कोशिश कर रहा हूं।
मैं क्वेरी $ .post का उपयोग कर एचटीएमएल में ऐसा करने में परिचित हूं, लेकिन मैं इसे उद्देश्य सी में कोशिश कर रहा हूं। मैंने कई ब्लॉग & स्टैक ओवरफ्लो पर पाए गए प्रश्नों की कोशिश की।जेसन

NSString *jsonRequest = [NSString stringWithFormat:@"{\"Email\":\"%@\",\"FirstName\":\"%@\"}",user,fname]; 
NSLog(@"Request: %@", jsonRequest); 

NSURL *url = [NSURL URLWithString:@"http:myurl..."]; 

NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:url]; 
NSData *requestData = [NSData dataWithBytes:[jsonRequest UTF8String] length:[jsonRequest length]]; 

[request setHTTPMethod:@"POST"]; 
[request setValue:@"application/json" forHTTPHeaderField:@"Accept"]; 
[request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"]; 
[request setValue:[NSString stringWithFormat:@"%d", [requestData length]] forHTTPHeaderField:@"Content-Length"]; 
[request setHTTPBody: requestData]; 

NSURLConnection *connection = [NSURLConnection connectionWithRequest:request delegate:self]; 

मैं यह भी कोशिश की:

मैं आखिर में निम्न कोड के साथ आया था
NSURLConnection * कनेक्शन = [[NSURLConnection alloc] initWithRequest: अनुरोध प्रतिनिधि: स्वयं];

मेरी वेब सेवा पोस्ट पर एक नया उपयोगकर्ता बनाता है और उपयोगकर्ता आईडी देता है। दोनों सफलतापूर्वक वेब सेवा कॉल (एक नया उपयोगकर्ता आईडी बनाया गया है) बनाते हैं, हालांकि वे डेटा पोस्ट नहीं करते हैं, यानी हर बार एक खाली उपयोगकर्ता बनाया जाता है।
कृपया मुझे बताएं कि मुझे कुछ याद आ रहा है या नहीं।

धन्यवाद।

मेरे अन्य प्रयास:

NSMutableURLRequest *request = 
[[NSMutableURLRequest alloc] initWithURL: 
[NSURL URLWithString:@"myUrl.. "]]; 

[request setHTTPMethod:@"POST"]; 

NSString *postString = @"[email protected]&FirstName=Test"; 

[request setValue:[NSString 
        stringWithFormat:@"%d", [postString length]] 
forHTTPHeaderField:@"Content-length"]; 

[request setHTTPBody:[postString 
         dataUsingEncoding:NSUTF8StringEncoding]]; 

[[NSURLConnection alloc] 
initWithRequest:request delegate:self]; 

मैं अंत में समस्या हल हो जाती: अंत में, पता लगा कि क्या गलत था। मैं अपने यूआरएल के रूप में http://mypath?params=123 का उपयोग कर रहा था। मैंने पूरा यूआरएल नहीं बनाया (इसे अन्य भाषाओं में कभी भी जरूरी नहीं)। लेकिन यहाँ मैं HTT देने की जरूरत: //mypath/index.php पैरामीटर = 123

+0

आपका सर्वर ठीक काम कर रहा है? –

+0

हां बहुत .. जैसा कि मैंने अपने प्रश्न में उल्लेख किया है, मैं इसे jquery का उपयोग करके बहुत सफलतापूर्वक करता हूं। इसके अलावा, इस मामले में उद्देश्य सी का उपयोग कर सर्वर उपयोगकर्ता आईडी के साथ प्रतिक्रिया करता है, जो मैंने पोस्ट किए गए डेटा को स्वीकार नहीं किया है। – Praneeta

+0

यदि मैं एनएसएमयूटेबल डिक्शनरी * पैराम्स = [एनएसएमयूटेबल डिक्शनरी] जैसे शब्दकोश बनाता हूं; [पैरा सेटऑब्जेक्ट: [ईमेल टेक्स्ट] के लिए: @ "ईमेल"]; [पैरा सेटऑब्जेक्ट: [फर्स्टनाम टेक्स्ट] के लिए: @ "फर्स्टनाम"]; [पैरा सेटऑब्जेक्ट: [अंतिम नाम टेक्स्ट] के लिए: @ "लास्टनाम"]; क्या इसे एनएसडीटा में बदलने और इसे पोस्ट करने का कोई तरीका होगा? क्या JSON स्ट्रिंग पोस्ट करने के बजाय यह बेहतर काम करेगा? – Praneeta

उत्तर

0

प्रयास करें यह एक

NSData *requestData = [jsonRequest dataUsingEncoding:NSUTF8StringEncoding]; 
+0

क्षमा करें, लेकिन एक ही परिणाम। – Praneeta

3

मैं अपने कोड चलाने की है, और सर्वर साइड सभी संदेश प्राप्त होता है।

POST/HTTP/1.1 
Host: linux-test 
User-Agent: demoTest/1.0 CFNetwork/548.1.4 Darwin/11.3.0 
Content-Length: 44 
Accept: application/json 
Content-Type: application/json 
Accept-Language: en 
Accept-Encoding: gzip, deflate 
Connection: keep-alive 

{"Email":"[email protected]","FirstName":"test"} 

और पालन कोड, अगर jsonRequest गैर- ASCII वर्ण है, [jsonRequest length] गलत हो जाएगा।

NSData *requestData = [NSData dataWithBytes:[jsonRequest UTF8String] length:[jsonRequest length]]; 

आप इसके बजाय strlen का उपयोग कर सकते हैं।

NSData *requestData = [NSData dataWithBytes:[jsonRequest UTF8String] length:strlen([jsonRequest UTF8String])]; 

या

[jsonRequest dataUsingEncoding:NSUTF8StringEncoding]; 
+0

किसी कारण से मेरा सर्वर साइड कोड मेरे पोस्ट किए गए डेटा को पसंद नहीं करता है, मैं कल इसे देख लूंगा। यह पुष्टि करने के लिए धन्यवाद कि मेरा कोड डेटा पोस्ट करता है। – Praneeta

+0

** यदि JSON में गैर-ASCII वर्ण है [jsonRequest लंबाई] गलत होगा। ** - हाँ, यह एक बड़ा गचाचा है! जानकारी के लिए धन्यवाद - मैंने बस एक बुरे अनुरोध को डिबग करने में 2 दिन बिताए हैं .. सभी आईपैड से ठीक लग रहे थे जहां मुझे कच्चे JSOn मिल रहा था, फिर एक अलग क्लाइंट का उपयोग करके सेवा पोस्ट कर रहा था ... JSOn बहुत अच्छा लग रहा था, था डब्ल्यूएस में प्राप्त वास्तविक डेटा को देखने के लिए वायरशर्क का उपयोग करने के लिए –

+0

@looyao मैंने कटौती की दोनों विकल्पों को आजमाया है, मैं अभी भी एक ही त्रुटि सेट कर रहा हूं। क्या आप कृपया मुझे कुछ विचार मदद कर सकते हैं। डाटा मैं भेजने के लिए कोशिश कर रहा हूँ { "prefferedName" है: "eivFEGX5pXWBGoqNNtF3og ==" "nameOnCard": "eivFEGX5pXWBGoqNNtF3og ==" "macID": "m2/ZIJ5pUB37EnF3tmvdtOnozUeOk + iAM82i2Z0nDEFVsc69vqUXNltN6R2dj7nz", "expiryDateMonth": "XAcdf3HTEn3pb2TlWQKHHA ==" , "appVersion": "e6NpxcXU34gHeOyowJbWFQ ==", "cardNumber": "7qYGPbnqgAMwMJ2GoCEGF4neQanULztzvblT873xj4o ="} –

38

मुझे लगता है कि आप बेहतर होगा इस तरह NSJSONSerialization वर्ग का उपयोग कर होगा:

NSDictionary *tmp = [[NSDictionary alloc] initWithObjectsAndKeys: 
        email, @"Email", 
        fname, @"FirstName", 
        nil]; 
NSError *error; 
NSData *postdata = [NSJSONSerialization dataWithJSONObject:tmp options:0 error:&error]; 
[request setHTTPBody:postData]; 

एक शब्दकोश का उपयोग करना है और फिर इसे इसे बनाने की तुलना में आसान है JSON में परिवर्तित एक स्ट्रिंग की तरह।

शुभकामनाएं!

[स्विफ्ट 3.0] (अद्यतन)

let tmp = ["email": email, 
      "FirstName": fname] 
let postData = try? JSONSerialization.data(withJSONObject: tmp, options: .prettyPrinted) 
request.httpBody = postData 
+0

धन्यवाद, यह पता लगाया गया कि क्या गलत था। मैं http: // mypath? Params = 123 का उपयोग अपने यूआरएल के रूप में कर रहा था। मैंने पूरा यूआरएल नहीं बनाया (इसे अन्य भाषाओं में कभी भी जरूरी नहीं)। लेकिन यहां मुझे प्रस्तुति देने की ज़रूरत है: //mypath/index.php? Params = 123 – Praneeta

+0

धन्यवाद। लेकिन क्या कोई तरीका है कि हम एक जटिल जेसन ऑब्जेक्ट में बस 'tmp' शब्दकोश उत्पन्न कर सकते हैं। संवाद निर्देश उत्पन्न करें ..ex: {"user": {"id": "18888888888", "पास": "12345678", ...}, "पशु": {"कोड": {"id" : 1, "कोड": 123456}, "कुंजी": सच}} मुझे ऊब बनाने के लिए निर्देश उत्पन्न करने के लिए। – frank

+3

अतिरिक्त हेडर तक मेरे लिए काम नहीं कर रहा था: '[अनुरोध सेट वैल्यू: @" एप्लिकेशन/जेसन "एचटीटीपी हैडर फ़ील्ड के लिए: @" सामग्री-प्रकार "];' – danielrosero

0
NSURL *url=[NSURL URLWithString:[NSString stringWithFormat:@"%@posts", SeverURL]]; 
ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url]; 
[request setRequestMethod:@"POST"]; 
[request addRequestHeader:@"content-type" value:@"application/json"]; 
[request addRequestHeader:@"User-Agent" value:@"iOS"]; 

request.allowCompressedResponse = NO; 
request.useCookiePersistence = NO; 
request.shouldCompressRequestBody = NO; 
request.delegate=self; 
NSString *json=[[self prepareData] JSONRepresentation];//SBJSON lib, convert a dict to json string 
[request appendPostData:[NSMutableData dataWithData:[json dataUsingEncoding:NSUTF8StringEncoding]]]; 

[request startSynchronous]; 
+0

मुझे JSON अनुरोध के साथ एक अनुकरणीय समस्या थी। मुझे नहीं पता कि क्यों उपयोगकर्ता-एजेंट जोड़ना: आईओएस ने मेरी समस्या तय की। –