【问题标题】:Using NSURLRequest to pass key-value pairs to PHP script with POST使用 NSURLRequest 通过 POST 将键值对传递给 PHP 脚本
【发布时间】:2010-03-30 11:15:56
【问题描述】:

我对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);

这将被发送到这个简单的脚本以执行数据库插入:

<?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"
?>

有什么想法吗?

【问题讨论】:

  • 感谢 pinkgothic,我现在引用了我的插入语句,但它只是向数据库添加了空白值。我想这意味着这些值仍未正确发布?

标签: php iphone objective-c cocoa-touch nsurlrequest


【解决方案1】:

感谢大家的建议。最后我设法通过使用here 给出的东西解决了这个问题。

代码:

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);

【讨论】:

    【解决方案2】:

    这是错误的:

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

    长度应以字节表示,而不是 UTF8 字符数。 而不是这一行,你应该使用:

    NSData *data = [post dataUsingEncoding: NSUTF8StringEncoding]; 
    

    【讨论】:

    • 几乎所有东西都试过了,整个东西都在这个字符串中。谢谢!
    【解决方案3】:

    这行[request setHTTPBody:[NSData dataWithBytes:data length:[data count]]]; 对我来说看起来很不对。

    我想你想要:[request setAllHTTPHeaderFields:data];

    其次,您会发现 Cocoa 框架在发送字段名称之前将其首字母大写(令人讨厌)。您可能需要做出一些改变来应对这种情况。

    【讨论】:

    • 害怕 - 现在我得到:400 Bad Request

      400 Bad Request

      您的客户发出了格式错误或非法的请求。 从 sendSynchronousRequest: 方法返回。我还需要发送其他标头字段以符合 HTTP 吗?
    【解决方案4】:

    如果您要进行大量表单发布,我建议您跳过 NSURLRequest 并改用 ASIHTTPRequest。恕我直言,它有据可查,并提供了一种与 Web 服务交互的直接方式。

    【讨论】:

    • 谢谢,但真的不想在整个项目中使用它超过一次。虽然我确实喜欢发布内容如此简单的外观。
    【解决方案5】:

    这是在 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);
    

    感谢和问候, 阿伦·德瓦杰

    【讨论】:

      【解决方案6】:

      编辑:已在 OP 中修复。


      这可能不是您唯一的问题(我不知道如何绕过 Objective-c),但这里是:

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

      你没有用引号括起你的字符串 - MySQL 肯定会对此感到厌烦。

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

      除此之外,通常,即使您的脚本无法从外部访问,您也不应该信任用户输入,并且在将值插入 SQL 语句之前使用 mysql_real_escape_string() 转义您的值以防止 SQL 注入,或者使用prepared statements(首选)- 否则合法数据中的单引号会破坏 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) ."')");
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-10-03
        • 1970-01-01
        • 2012-08-19
        • 1970-01-01
        • 2013-06-18
        • 2013-07-25
        • 2013-01-10
        • 2014-04-30
        相关资源
        最近更新 更多