2012-03-27 14 views
27

我正在嘗試將數據發佈到PHP Web服務。
我很熟悉在HTML中使用查詢$ .post這樣做,但我非常難以嘗試這在客觀C. 我嘗試了幾個博客&在stackoverflow上找到的問題。使用Json在Objective C中發佈數據

我終於想出了以下代碼:

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的頁頭] initWithRequest:請求委託:自我];

我的web服務在帖子上創建一個新用戶並返回用戶標識。 兩者都成功進行Web服務調用(創建一個新的用戶ID),但它們不會發布數據,即每次都會創建一個空白用戶。
請告訴我,如果我缺少任何東西。

謝謝。

我的其他嘗試:

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 PARAMS = 123

+0

是您的服務器正常工作? – 2012-03-27 03:49:16

+0

是的非常..正如我在我的問題中提到的,我非常成功地使用jquery。另外,在這種情況下,使用Objective C服務器響應一個用戶ID,只是不接受我發佈的數據。 – Praneeta 2012-03-27 03:50:56

+0

如果我創建一個字典,如 NSMutableDictionary * parms = [NSMutableDictionary dictionary];[parms setObject:[email text] forKey:@「Email」];[parms setObject:[firstname text] forKey:@「FirstName」];[parms setObject:[lastname text] forKey:@「LastName」]; 會有一種方法將其轉換爲NSData併發布它?這會更好,而不是發佈JSON字符串? – Praneeta 2012-03-27 04:23:33

回答

0

試試這個

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

對不起,但結果相同。 – Praneeta 2012-03-27 04:18:45

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 2012-03-27 04:29:38

+0

**如果JSON具有非ASCII字符,[jsonRequest長度]將是錯誤的。** - 是的,這是一個大問題!感謝您的信息 - 我剛剛花了2天調試一個不好的請求..所有看起來很好從ipad我原來的JSOn,然後張貼服務使用不同的客戶端,所有工作... JSOn看起來很棒,有使用wireshark來查看在WS上收到的實際數據正在被縮短 – 2015-01-23 09:51:22

+0

@looyao我試過了你給出的兩個選項,我仍然設置相同的錯誤。你能幫我一些想法嗎?數據我試圖發送是{ 「prefferedName」: 「eivFEGX5pXWBGoqNNtF3og ==」, 「nameOnCard」: 「eivFEGX5pXWBGoqNNtF3og ==」, 「MACID」: 「M2/ZIJ5pUB37EnF3tmvdtOnozUeOk + iAM82i2Z0nDEFVsc69vqUXNltN6R2dj7nz」, 「expiryDateMonth」: 「XAcdf3HTEn3pb2TlWQKHHA ==」 ,「appVersion」:「e6NpxcXU34gHeOyowJbWFQ ==」,「cardNumber」:「7qYGPbnqgAMwMJ2GoCEGF4neQanULztzvblT873xj4o =」} – 2016-12-15 19:58:27

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這比創造更容易像一個字符串。

祝你好運!

[SWIFT 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作爲我的網址。我沒有演出完整的網址(從來不需要其他語言)。但在這裏,我需要給予htt://mypath/index.php?params = 123 – Praneeta 2012-03-27 12:01:11

+0

Thanks.but有什麼方法可以簡單地在複雜的json對象中生成'tmp'字典。生成相應的字典是無聊的.ex:{「user」:{「id」:「18888888888」,「pass」:「12345678」,...},「animal」:{「code」:{「id」 :1,「code」:123456},「key」:true}}生成字典讓我感到無聊。 – frank 2014-03-29 04:29:12

+3

在添加標題之前,我一直沒有爲我工作: '[request setValue:@「application/json」forHTTPHeaderField:@「Content-Type」];' – danielrosero 2016-02-15 19:51:45

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請求相似的問題。我不知道爲什麼,但添加User-Agent:iOS解決了我的問題。 – 2013-09-11 14:50:43