HTTP_POST из iPhone SDK с использованием JSON - PullRequest
1 голос
/ 11 марта 2011

Я хочу вызвать HTTP_POST из iPhone SDK в файл php на моем сервере.Если я назову это ниже:

NSMutableDictionary *requestDictionary = [NSMutableDictionary dictionary];
[requestDictionary setObject:@"testvalue" forKey:@"test"];
[requestDictionary setObject:@"test2value" forKey:@"test2"];
[requestDictionary setObject:@"test3value" forKey:@"test3"];

NSString *jsonString = [requestDictionary JSONRepresentation];
NSString *urlString = @"http://www.example.org";

NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:urlString]
                                                               cachePolicy:NSURLRequestUseProtocolCachePolicy
                                                           timeoutInterval:CONNECTION_TIMEOUT];

NSData *requestData = [NSData dataWithBytes:[jsonString UTF8String] length:[jsonString length]];
[request setHTTPMethod:@"POST"];
[request setValue:[NSString stringWithFormat:@"%d", [requestData length]] forHTTPHeaderField:@"Content-Length"];
[request setValue:@"application/json" forHTTPHeaderField:@"Accept"];
[request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
[request setHTTPBody: requestData];

NSURLConnection *urlConnection = [[NSURLConnection alloc] initWithRequest:request delegate:self];

Должен ли я иметь возможность получать данные этого сообщения следующим образом (в php):

echo "Hello";

if(isset($_POST['test']))
{
    echo $_POST['test'];
}

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

Для проверкиВ моем connectionDidFinishLoading я просто записываю весь ответ

- (void)connectionDidFinishLoading:(NSURLConnection *)conn
{
    NSString *responseString = [[NSString alloc] initWithData:dataRecieved encoding:NSASCIIStringEncoding];
    [dataRecieved release];
    NSLog(@"Response: %@", responseString);
}

Я получаю привет, который я повторил, прежде чем искать сообщение, но больше ничего.Кто-нибудь знает, где я иду не так?

Ответы [ 3 ]

2 голосов
/ 11 марта 2011

Ваше тело запроса является значением JSON, но ваш сервер ожидает application/x-www-form-urlencoded кодированные поля.

Вы можете преобразовать словарь в закодированные поля со следующей категорией.

@interface NSDictionary (FormData)

- (NSString*) formUrlEncodedData;

@end
@implementation NSDictionary (FormData)

- (NSString*) formUrlEncodedData
{
    NSString *result = nil;

    for( NSString *k in [self keyEnumerator]) {
        if (![result isEqual:@""]) {
            result = [result stringByAppendingString:@"&"];
        }

        result = [result stringByAppendingString:[k stringByUrlEncoding]];
        result = [result stringByAppendingString:@"="];
        NSString *v = [self objectForKey:k];
        result = [result stringByAppendingString:[v stringByUrlEncoding]];
    }
    return result;
}

@end

Где stringByUrlEncoding предоставляется категорией на NSString, которую я получил из Кокоанетика .

@interface NSString (Helpers)

- (NSString*) stringByUrlEncoding;

@end
@implementation NSString (UrlEncoding)

- (NSString*) stringByUrlEncoding
{
    return (NSString*)CFURLCreateStringByAddingPercentEscapes(NULL,
                            (CFStringRef)self,
                            NULL,
                            (CFStringRef)@"!*'();:@&=+$,/?%#[]",
                            kCFStringEncodingUTF8);
}

@end
0 голосов
/ 11 марта 2011

Если можно, дайте совет. Проверяет исходный код Facebook IOS SDK . Это хороший способ освоить новую технологию.

0 голосов
/ 11 марта 2011

Вы получите ответ в NSURLConnection методах делегата.И как только вы получите ответ, вы можете использовать NSXMLParser, чтобы проанализировать его и получить нужные поля.Дайте мне знать, если вам нужна дополнительная информация о том же.Постараюсь опубликовать соответствующий код.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...