首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用NSURLConnection发送帖子的iPhone

使用NSURLConnection发送帖子的iPhone
EN

Stack Overflow用户
提问于 2010-01-15 21:27:44
回答 5查看 61.1K关注 0票数 21

我在使用NSURLConnection将POST数据发送到PHP脚本时遇到了一些问题。这是我的代码:

代码语言:javascript
运行
复制
    const char *bytes = [[NSString stringWithFormat:@"<?xml version=\"1.0\"?>\n<mydata>%@</mydata>", data] UTF8String];

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

    [request setHTTPMethod:@"POST"];
    [request setHTTPBody:[NSData dataWithBytes:bytes length:strlen(bytes)]];

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

我的script.php是这么简单的:

代码语言:javascript
运行
复制
<?php
    echo $_POST['mydata'];
?>

这在过去对我很有效,但由于某些原因,我现在从NSLog(@"responseData: %@", responseData);得到的输出只是"<>“而不是"theData”。

可能是什么地方弄错了,但我好像找不到?有什么想法吗?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2010-01-15 21:33:04

你的数据错了。如果您希望在PHP的$_POST数组中找到数据,它应该如下所示:

代码语言:javascript
运行
复制
const char *bytes = "mydata=Hello%20World";

如果要发送XML数据,则需要设置不同的HTTP内容类型。例如,你可以设置

代码语言:javascript
运行
复制
application/xml; charset=utf-8

如果未设置HTTP内容类型,则默认类型

代码语言:javascript
运行
复制
application/x-www-form-urlencoded

将会被使用。此类型期望POST数据具有与GET请求中相同的格式。

但是,如果您设置了一个不同的HTTP Content Type,比如application/xml,那么这个数据就不会被添加到PHP中的$_POST数组中。您将不得不从输入流中读取原始数据。

试试这个:

代码语言:javascript
运行
复制
NSString * str = [NSString stringWithFormat:@"<?xml version=\"1.0\"?>\n<mydata>%@</mydata>", data];
[request setHTTPMethod:@"POST"];
[request setValue:@"application/xml; charset=utf-8" forHTTPHeaderField:@"Content-Type"];
[request setHTTPBody:[str dataUsingEncoding:NSUTF8StringEncoding]];

并在服务器上尝试以下PHP:

代码语言:javascript
运行
复制
$handle = fopen("php://input", "rb");
$http_raw_post_data = '';
while (!feof($handle)) {
    $http_raw_post_data .= fread($handle, 8192);
}
fclose($handle);

请注意,只有当您的帖子的HTTP头不是application/x-www-form-urlencoded时,这才有效。如果它是应用程序/x-www-form-urlencoded,那么PHP自己读取所有post数据,对其进行解码(将其拆分为键/值对),最后将其添加到$_POST数组中。

票数 39
EN

Stack Overflow用户

发布于 2011-11-17 03:53:07

啊是的..。干杯。但是responseData的输出类似于"<48656c6c 6f326f72 6c64>",您不是打印带有%@的NSData吗?- per_pilot Jan 15 '10 at 13:57

这是因为您显示的是"bytes“值,您应该将其传递给NSString以查看真正的消息

代码语言:javascript
运行
复制
NSString *string = [[NSString alloc] initWithData:responseData encoding:NSASCIIStringEncoding];
NSLog(@"responseData: %@", string);
票数 7
EN

Stack Overflow用户

发布于 2012-12-13 20:01:35

代码语言:javascript
运行
复制
NSString *post =[NSString stringWithFormat:@"usertype(%@),loginname(%@),password(%@)",txtuser.text,txtusername.text,txtpassword.text];
NSData *postData = [post dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES];
NSString *postLength = [NSString stringWithFormat:@"%d", [postData length]];

NSMutableURLRequest *request = [[[NSMutableURLRequest alloc] init] autorelease];
[request setURL:[NSURL URLWithString:@"http://www.dacinci.com/app/tes2/login_verify.php"]];
[request setHTTPMethod:@"POST"];
[request setValue:postLength forHTTPHeaderField:@"Content-Length"];
[request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];
[request setHTTPBody:postData];

NSError *error;
NSURLResponse *response;
NSData *urlData=[NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
NSString *str=[[NSString alloc]initWithData:urlData encoding:NSUTF8StringEncoding];
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2071788

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档