【问题标题】:How to return a value from pHp server script to NSMutableData (Objective C, iOS)如何从 pHp 服务器脚本返回值到 NSMutableData(目标 C,iOS)
【发布时间】:2011-03-22 15:53:00
【问题描述】:

好的,我很难找到不仅仅是使用 JSON 或 ASIHTTPRequest 的答案。但我想我的问题更具体一点。我只是将编程作为一种爱好,所以我不是专家。话虽如此,我对此的抽象理解可能完全不符合实际,所以这个问题可能无法回答。

基本上,我想做的是向 Web 服务器上的 pHp 脚本发送 HTTP 请求,然后让 Web 服务器返回一个值,比如说一个简单的整数值或布尔值(想想一个返回的登录脚本是/否)。在这一点上,我并不担心安全问题,因为我正在努力理解这一点。

从我收集到的东西,我会用一些东西来达到

的效果
// Create the request.
NSURLRequest *theRequest=[NSURLRequest requestWithURL:[NSURL URLWithString:@"http://www.apple.com/"]
                    cachePolicy:NSURLRequestUseProtocolCachePolicy
                timeoutInterval:60.0];
// create the connection with the request
// and start loading the data
NSURLConnection *theConnection=[[NSURLConnection alloc] initWithRequest:theRequest delegate:self];
if (theConnection) {
   // Create the NSMutableData to hold the received data.
   // receivedData is an instance variable declared elsewhere.
receivedData = [[NSMutableData data] retain];
} else {
// Inform the user that the connection failed.
}  

这是来自 Apple 文档,我大体上理解这一点。所以假设它通过 URL 将信息发送到一个 pHp 文件,然后:

//pHp file gets information
//pHp file uses that information to check against a mySQL database
//pHp now has the variable $result with a value of 1 in it

另外,假设我可以做到这一切。我的问题变成了,如何将 pHp 中的值返回给 iOS 'NSMutableData' 变量。我会“回应”它吗?例如:

echo "$result";

然后这就是放入 NSMutableData 的信息(变量 $result)?我知道如果我是通过 pHp/HTML 等严格执行的,我可能会使用会话变量之类的东西来允许更多页面访问该变量。

或者是否有其他一些我不知道的将数据返回到 NSMutabalData 的 pHp 函数?基本上这是我遇到问题的两者之间的联系,从 pHp 脚本返回数据 - 我真的不明白 NSMutableData 正在“获取”什么。

我已经尽量详细了,很抱歉这个问题太长了。请假设这就是我想要做的,返回一个值。安全性并不重要(我试图在最简单的层面上做到这一点以理解它然后在其上构建)。我试图避免任何模糊的答案,例如“编写 Web 服务”或“使用 _”来做到这一点,我确信有很多更好的方法可以做到这一点,但我我不是急于推出一个程序——我只是想学习这个,以便更好地理解 NSURLConnection、pHp、NSMUtableData 以及所有齿轮如何组合在一起。如果我的要求在技术上是不可能的并且没有意义,我也很欣赏这个答案。我已经尝试过搜索,但没有为这块拼图找到满意的答案。

提前致谢。

编辑:

我试过了

...
NSMutableData *receivedData = [[NSMutableData alloc] init];
receivedData = [[NSMutableData data] retain];
NSString *receivedDataString = [[NSString alloc] initWithData:receivedData encoding:NSUTF8StringEncoding];
label.text = receivedDataString; 
...

在服务器上调用一个pHp文件基本上是:

<?pHp
$result = "TRUE";
var_dump($result);
?>

这不起作用。我认为我的问题出在 pHp 方面,是否有一些特殊的命令可以将值返回给 NSMutableData 对象? (只是一些额外的信息可能会进一步澄清我的问题)。

编辑二:

我似乎无法直接回复,可能是因为我以前只匿名使用过该网站,而且我有一个全新的帐户 :) 感谢您的回答 Charles,我尝试使用 echo 和 var_dump,两者都没有似乎将数据发回(我的 NSMutableData 对象在转换为 NSString 时似乎是空的 - 除非我的目标 C 是错误的,但我已经将它解析到几乎最低限度,所以我不相信是这种情况) .

【问题讨论】:

  • 顺便说一下,它是“PHP”,而不是“pHp”。
  • 我合并了您的帐户,因此您现在应该可以对您的问题的答案发表评论了。

标签: php objective-c ios nsurlconnection nsmutabledata


【解决方案1】:

好的,我相信我已经成功了,所以如果其他人也在寻找相同的答案,我会发布答案。

服务器上的PHP文件如下:

<?php
echo 'Works';
?>

我的 h 文件包含

#import <UIKit/UIKit.h>

@interface SampleViewController : UIViewController {
IBOutlet UIButton *theButton;
NSMutableData *receivedData;}
@property (nonatomic, retain) IBOutlet UIButton *theButton;
-(IBAction) clickTheButton:(id)sender;
@end

我的 m 文件包含相关部分(其他所有内容只是 Apple 在 SDK 中创建 m 文件时放入的标准内容

-(IBAction) clickTheButton:(id)sender {
NSURLRequest *theRequest=[NSURLRequest requestWithURL:[NSURL URLWithString:@"<path to my php file>try.php"]
                                          cachePolicy:NSURLRequestUseProtocolCachePolicy
                                      timeoutInterval:60.0];
NSURLConnection *theConnection=[[NSURLConnection alloc] initWithRequest:theRequest delegate:self];
if (theConnection) {
    receivedData = [[NSMutableData data] retain];
    NSString *receivedDataString = [[NSString alloc] initWithData:receivedData encoding:NSUTF8StringEncoding];
    NSLog(@"This1: %@", receivedData);
    NSLog(@"This2: %@", receivedDataString);
} else {
    // Inform the user that the connection failed.
}
}

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response { 
[receivedData setLength:0];
NSLog(@"This3: %@", receivedData);
}

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
// Append the new data to receivedData.
// receivedData is an instance variable declared elsewhere.
[receivedData appendData:data];
NSString *receivedDataString = [[NSString alloc] initWithData:receivedData encoding:NSUTF8StringEncoding];
NSLog(@"This4: %@", receivedDataString);
NSLog(@"This5: %@", receivedData);
}

NSLogs 输出如下:

这1:''

这2:

这3:''

这4:作品

这5:''

为了回答我最初的问题,echo 'Works'; 是将单词 Works 返回到 NSMutableData 对象的 PHP 代码。建立连接后,我需要调用didRecieveData: 方法将回显的信息实际放入数据文件中。

【讨论】:

    【解决方案2】:

    基本上这是我遇到问题的两者之间的联系,即从 pHp 脚本返回数据 - 我真的不明白 NSMutableData 正在“获取”什么。

    如果它像其他看起来只是发出 HTTP 请求的东西一样工作,您将获得一个包含来自所请求 URL 的输出的字符串,或者您将获得一个可以从中获取该输出的对象(包括标头, ETC)。我对 Objective C 或 iOS 一无所知,但我敢打赌你只会得到脚本的输出。

    换句话说,

    如何将 pHp 中的值返回给 iOS 'NSMutableData' 变量。我会“回应”它吗?

    大概吧!

    你为什么不试试代码看看你得到了什么?如果它成功了,那么恭喜你:你已经创建了你的第一个 Web 服务。

    【讨论】:

    • 使用 echo 或 var_dump 都不走运——至少我认为数据会转储到的对象是空的。如果您调用 PHP 文件,我基本上需要知道从上面进入“receivedData”对象的内容。
    • @Fate,如果你调用一个普通的旧 HTML 页面,会填充什么?
    • 看起来你的回声是对的,问题显然出在我的 obj c 部分 :)
    • 很高兴听到您成功了。请记住,前面显然对您说的话仍然是正确的——您希望以已知、可靠、可解析的格式传输数据,以便您可以检测到何时出现问题。 JSON在这里是个好东西。
    • 默认。研究 JSON 和 ASIHTTPRequest,只是想确保我至少对引擎盖下的工作原理有所了解。我只是一个爱好程序员,所以很容易突然变得超乎我的想象。 :D.
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-14
    • 1970-01-01
    • 2013-12-18
    • 1970-01-01
    • 2015-05-08
    相关资源
    最近更新 更多