Как вернуть значение из сценария сервера pHp в NSMutableData (Objective C, iOS) - PullRequest
1 голос
/ 22 марта 2011

Хорошо, у меня проблемы с поиском ответа на этот вопрос, который заключается не только в использовании JSON или ASIHTTPRequest. Но мой вопрос немного более конкретен, я думаю. Я программирую только как хобби, поэтому я не эксперт. С учетом сказанного моё абстрактное понимание этого может быть совершенно неосновательным, поэтому вопрос может не отвечать.

По сути, я хотел бы отправить HTTP-запрос к сценарию pHp на веб-сервере, чтобы веб-сервер возвращал значение, скажем, простое целочисленное значение или значение bool (представьте себе сценарий входа, который возвращает да нет). На данный момент меня не беспокоит безопасность, так как я пытаюсь облегчить себе понимание этого.

Из того, что я понял, я бы использовал что-то с эффектом

// 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 и т. Д., Я мог бы использовать что-то вроде переменной сеанса, чтобы другие страницы могли получить доступ к переменной.

Или есть какая-то другая функция pHp, которая возвращает данные в NSMutabalData, о которых я не знаю? По сути, это связь между двумя, с которыми у меня возникают проблемы, - возвращением данных из сценария pHp - я не совсем понимаю, почему NSMutableData «получает».

Я старался быть как можно более подробным, извините за длинный вопрос. Пожалуйста, просто предположите, что это все, что я пытаюсь сделать, вернуть значение. Безопасность не важна (я пытаюсь сделать это на самом простом уровне, чтобы понять это, а затем опираться на нее). Я стараюсь избегать каких-либо расплывчатых ответов, таких как «написать веб-сервис» или «использовать _ », и я уверен, что есть много лучших способов сделать это, но я » я не тороплю программу - я просто пытаюсь изучить это для лучшего понимания NSURLConnection, pHp, NSMUtableData и того, как все винтики сочетаются друг с другом. Если то, что я спрашиваю, технически невозможно и не имеет смысла, я тоже ценю этот ответ. Я попытался найти и не нашел удовлетворительного ответа на этот кусочек головоломки.

Заранее спасибо.

EDIT:

Я пробовал

...
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? (Просто дополнительная информация, чтобы уточнить мой вопрос).

РЕДАКТИРОВАТЬ II:

Кажется, я не могу ответить напрямую, возможно потому, что раньше я когда-либо пользовался сайтом только анонимно, и у меня есть совершенно новый аккаунт :) Спасибо за ваш ответ, Чарльз, я пытался использовать echo и var_dump, ни кажется, отправляет данные обратно (мой объект NSMutableData при преобразовании в строку NSString кажется пустым - если моя цель C не так, но я проанализировал ее почти до минимума, поэтому я не верю, что это так) .

Ответы [ 2 ]

7 голосов
/ 22 марта 2011

Хорошо, я думаю, что я заставил его работать, и поэтому я собираюсь опубликовать ответ, если кто-то еще ищет то же самое.

Файл 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 помещает в файл m при создании его в SDK

-(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 выглядит следующим образом:

This1: '<>'

This2:

This3: '<>'

This4: Работает

This5: '<24726573 756c74>'

Чтобы ответить на мой оригинальный вопрос, echo 'Works'; - это код PHP, который возвращает слово Works объекту NSMutableData. После настройки соединения мне нужно было вызвать метод didRecieveData:, чтобы фактически поместить отраженную информацию в файл данных.

1 голос
/ 22 марта 2011

По сути, это связь между двумя, с которыми у меня возникают проблемы, с возвратом данных из сценария pHp - я не совсем понимаю, что такое NSMutableData «получает».

Если он работает как любая другая вещь, которая выглядит так, как будто он просто делает HTTP-запрос, вы либо получите строку, содержащую выходные данные запрошенного URL-адреса, либо получите объект, из которого вы можете получить этот вывод(включая заголовки и т. д.).Я ничего не знаю об Objective C или iOS, но я готов поспорить, что вы просто получите выходные данные сценария.

Другими словами,

каквернуть значение из pHp обратно в переменную iOS «NSMutableData».Я повторяю это?

Возможно!

Почему бы вам не попробовать код и не увидеть, что вы получите?Если это работает, то поздравляю: вы создали свой первый веб-сервис.

...