2012-03-27 19 views
27

データをPHP Webサービスに投稿しようとしています。
私はhtmlでクエリ$ .postを使ってこれをやっているのですが、目的Cでこれを試してみるのが大変です。 私はいくつかのブログを試しました&質問が見つかりました。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のalloc] initWithRequest:リクエストのデリゲート:自己]。

私のWebサービスは投稿時に新しいユーザーを作成し、ユーザーIDを返します。 両方とも正常にWebサービスコールを行います(新しいuserIDが作成されます)。ただし、データをポストしません。つまり、毎回ブランクユーザーが作成されます。
何かが不足している場合は教えてください。

ありがとうございました。

私の他の試み:

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を私のURLとして使用していました。私は完全なURLを演奏しなかった(他の言語では決してそれを必要としなかった)。しかし、ここで私がHTTを与えるために必要な:?//mypath/index.phpのparams = 123

+0

サーバーが正常に動作していますか? –

+0

はい、非常に..私の質問で述べたように、私はこれをjqueryを使ってうまく実行します。また、この場合Objective Cを使用すると、サーバーはuserIDで応答しますが、投稿したデータは受け入れられません。 – Praneeta

+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

答えて

0

この1

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 length]が間違っています** ** - それは大きな問題です!情報のおかげで - 私はちょうど2日間、悪い要求をデバッグしました..すべてが私が生のJSOnを入手していたipadからうまく見えました、そして、すべての仕事をした別のクライアントを使ってサービスを投稿してください... wiresharkを使用して、WSで受け取っている実際のデータが短くなっているのを確認しました –

+0

@looyao私は両方のオプションを試しましたが、私は同じエラーを設定しています。あなたは私にいくつかのアイデアを助けてくれますか?私が送信しようとしているデータは、{ "prefferedName" である: "eivFEGX5pXWBGoqNNtF3og =="、 "nameOnCard": "eivFEGX5pXWBGoqNNtF3og =="、 "MACID": "2/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 SWIFT](更新)

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

ありがとう、何が間違っていたかを理解しました。私はhttp:// mypath?params = 123を私のURLとして使っていました。私は完全なURLを演奏しなかった(他の言語では決してそれを必要としなかった)。しかしここで私はhtt://mypath/index.php?params = 123を与える必要がありました。 – Praneeta

+0

ありがとうございました。複雑なJSONオブジェクトの中に、単純に 'tmp'辞書を生成する方法はありますか?対応する辞書を生成します。.ex:{"user":{"id": "18888888888"、 "pass": "12345678"、...}、 "animal":{"code":{"id" :1、 "code":123456}、 "key":true}}私は退屈な辞書を生成します。 – frank

+3

ヘッダーを追加するまで私には役に立たなかった: '[setValue:@" application/json "forHTTPHeaderField:@" Content-Type "]; ' – 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リクエストに擬似的な問題がありました。なぜ私はUser-Agentを追加するのか分かりません.iOSは私の問題を解決しました。 –

関連する問題