0

私は問題があります:

json を使用して php に投稿する必要がありますが、データ型 x-www-form-urlencoded でのみ応答します。Google chrome の郵便配達員を使用しましたが、フォームデータは作成されませんでした。この方法を使用しましたが、教えてくれましたパラメータが間違っているので、助けが必要です:

NSString *jsonRequest = [NSString stringWithFormat:@"j_username=%@&j_password=%@",nombre,pass];
NSURL *url = [NSURL URLWithString:urlhttp];
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:[NSString stringWithFormat:@"%d", [requestData length]] forHTTPHeaderField:@"Content-Length"];
[request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];

[request setHTTPBody: requestData];
[NSURLConnection connectionWithRequest:request delegate:self];
4

2 に答える 2

1

手始めに:

  1. あなたの文字列は JSON とは何の関係もありません。ただの文字列です
  2. ユーザー名とパスワードは URL エンコードする必要があります
  3. [NSData dataWithBytes:[jsonRequest UTF8String] length:[jsonRequest length]]間違っている。使用する必要があります[NSData dataWithBytes:[jsonRequest UTF8String] length:[[jsonRequest UTF8String] length]]
于 2013-08-28T12:45:24.973 に答える
0

あなたの例では JSON はどこにありますか? この例のように見えるものは何もありません。リクエストの設定でいくつか間違ったことをしています。Sulthan answer を確認してください。

私のアドバイスは、エンコーディングやヘッダーなどの細かい正式な詳細を処理するライブラリを使用することです。

のようなものを書くことAFNetworkingができます。

AFHTTPClient *httpClient = [[AFHTTPClient alloc] initWithBaseURL:[NSURL URLWithString:@"http://whatever.com/"]];
[httpClient registerHTTPOperationClass:[AFHTTPRequestOperation class]];
[httpClient setParameterEncoding:AFFormURLParameterEncoding]

NSDictionary * params = @{
                           @"j_username": nombre,
                           @"j_password": pass
                         };
NSMutableURLRequest *request = [httpClient requestWithMethod:@"POST"
                                                        path:@"relative/path/to/resource"
                                                  parameters:params];
AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request];
[operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
    NSLog(@"Response: %@", [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding]);
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
    NSLog(@"Error: %@", error);
}];
[httpClient enqueueHTTPRequestOperation:operation];

( http://samwize.com/2012/10/25/simple-get-post-afnetworking/に基づく例)

LOC に関しては、あまり良くないように見えるかもしれませんが、次のことを考慮してください。

  • httpClient一度だけ初期化され、その後のリクエストで再利用できるため、構成を一元化できます
  • パラメータは目的の形式で自動的にエンコードされ、将来エンコードを変更する必要がある場合は、別のAFFormURLParameterEncodingものに変更するだけで済みます。
  • NSURLConnectionDelegate面倒なメソッドに頼る代わりに、優れたブロックベースの API を取得できます
于 2013-08-28T13:03:44.623 に答える