16

私はobjective-cにかなり慣れていないので、POSTを使用していくつかのキーと値のペアをPHPスクリプトに渡すことを検討しています。次のコードを使用していますが、データが投稿されていないようです。NSDataを使って送信しようとしましたが、どちらも機能していないようです。

 NSDictionary* data = [NSDictionary dictionaryWithObjectsAndKeys:
    @"bob", @"sender",
    @"aaron", @"rcpt",
    @"hi there", @"message",
    nil];

 NSURL *url = [NSURL URLWithString:@"http://myserver.com/script.php"];
 NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];

 [request setHTTPMethod:@"POST"];
 [request setHTTPBody:[NSData dataWithBytes:data length:[data count]]];

  NSURLResponse *response;
  NSError *err;
  NSData *responseData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&err];
  NSLog(@"responseData: %@", content);

これは、db挿入を実行するためにこの単純なスクリプトに送信されます。

<?php $sender = $_POST['sender'];
      $rcpt = $_POST['rcpt'];
      $message = $_POST['message'];

      //script variables
      include ("vars.php");

      $con = mysql_connect($host, $user, $pass);
      if (!$con)
      {
        die('Could not connect: ' . mysql_error());
      }

      mysql_select_db("mydb", $con);

      mysql_query("INSERT INTO php_test (SENDER, RCPT, MESSAGE) 
      VALUES ($sender, $rcpt, $message)");

      echo "complete"
?>

何か案は?

4

6 に答える 6

35

みんなの提案に感謝します。最後に、ここに記載されているものを使用して問題を解決できました。

コード:

NSString *myRequestString = @"sender=my%20sender&rcpt=my%20rcpt&message=hello";
NSData *myRequestData = [ NSData dataWithBytes: [ myRequestString UTF8String ] length: [ myRequestString length ] ];
NSMutableURLRequest *request = [ [ NSMutableURLRequest alloc ] initWithURL: [ NSURL URLWithString: @"http://people.bath.ac.uk/trs22/insert.php" ] ]; 
[ request setHTTPMethod: @"POST" ];
[ request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"content-type"];
[ request setHTTPBody: myRequestData ];
NSURLResponse *response;
NSError *err;
NSData *returnData = [ NSURLConnection sendSynchronousRequest: request returningResponse:&response error:&err];
NSString *content = [NSString stringWithUTF8String:[returnData bytes]];
NSLog(@"responseData: %@", content);
于 2010-03-31T10:24:55.207 に答える
4

これは間違っています:

[NSData dataWithBytes:[post UTF8String] length:[post length]]

長さは、UTF8 文字数ではなくバイト数で表す必要があります。この行の代わりに、次を使用する必要があります。

NSData *data = [post dataUsingEncoding: NSUTF8StringEncoding]; 
于 2010-10-22T13:27:56.307 に答える
2

この行[request setHTTPBody:[NSData dataWithBytes:data length:[data count]]];は私には間違っているように見えます。

私はあなたが欲しいと思います:[request setAllHTTPHeaderFields:data];

次に、Cocoa フレームワークがフィールド名を送信する前に最初の文字を大文字にしていることに気付くでしょう (厄介なことに)。それに対処するために、いくつかの変更を加える必要があるかもしれません。

于 2010-03-30T15:50:48.503 に答える
2

多くのフォーム投稿を行う場合は、NSURLRequest をスキップして、代わりにASIHTTPRequestを使用することをお勧めします。IMHO、それは十分に文書化されており、Web サービスと対話する簡単な方法を提供します。

于 2010-03-30T20:52:57.800 に答える
1

これは、フォームの投稿とデータの取得のために IOS 5.o で動作しています。

self.requestFor = serviceNameT;

responseData = [[NSMutableData data] retain];

SharedResponsedObject* sharedResponsedObject = [SharedResponsedObject returnSharedInstance];
LoginInfo* loginInfo = (LoginInfo*)sharedResponsedObject.loginInfo;

NSLog(@"DEVICE_TOKEN: %@, loginInfo.sessionId: %@, itemIdT: %@", DEVICE_TOKEN, loginInfo.sessionId, itemIdT);

NSString* requestStr = [NSString stringWithFormat:@"Token=%@&SessionId=%@&ItemId=%@", DEVICE_TOKEN, loginInfo.sessionId, itemIdT];


NSData *myRequestData = [ NSData dataWithBytes: [ requestStr UTF8String ] length: [ requestStr length ] ];

NSMutableURLRequest *request = [[ NSMutableURLRequest alloc ] initWithURL: [ NSURL URLWithString:@"http://menca.com:1500/DownloadContent.aspx"]]; 

[request setHTTPMethod: @"POST" ];
[request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"content-type"];
[ request setHTTPBody: myRequestData ];


NSURLResponse *response;
NSError *err;
NSData *returnData = [ NSURLConnection sendSynchronousRequest: request returningResponse:&response error:&err];
NSString *content = [NSString stringWithUTF8String:[returnData bytes]];
NSLog(@"ServerRequestResponse::responseData: %@", content);

よろしくお願いいたします。 アルン・ドゥワジ

于 2012-05-18T06:49:41.443 に答える
0

編集:OPで修正されました。


これはあなただけの問題ではないかもしれませんが (objective-c の回避方法がわかりません)、次のようになります。

mysql_query("INSERT INTO php_test (SENDER, RCPT, MESSAGE) 
VALUES ($sender, $rcpt, $message)");

文字列を引用符で囲んでいるわけではありません.

mysql_query("INSERT INTO php_test (SENDER, RCPT, MESSAGE) 
VALUES ('$sender', '$rcpt', '$message')");

それを超えて、一般的に、スクリプトが外部からアクセスできない場合でも、ユーザー入力を信頼せずmysql_real_escape_string()、値を SQL ステートメントに挿入して SQL インジェクションを防ぐために値をエスケープするか、準備済みステートメントを使用する(推奨)べきではありません。 - そうしないと、正当なデータに一重引用符が含まれていると、SQL ステートメントの構文が壊れます。

参考までに完全に見苦しい例:

mysql_query("INSERT INTO php_test (SENDER, RCPT, MESSAGE) 
VALUES ('" . mysql_real_escape_string($sender) ."',"
." '" . mysql_real_escape_string($rcpt) ."',"
." '" . mysql_real_escape_string($message) ."')");
于 2010-03-30T11:25:34.037 に答える