将GET请求转换为POST请求

时间:2014-04-07 02:01:34

标签: ios objective-c web-services post

我正在构建一个与Web服务通信的应用程序。用户密码和敏感信息将传递给.php脚本。目前它刚刚通过GET请求发送,并且 - 我相信你们会同意 - 出于安全原因,这是非常糟糕的。

这是我的脚本,用于将信息发送到PHP脚本然后解析它。

  NSData * houseData = [NSData dataWithContentsOfURL:houseUrl];
NSString * password = _passwordText.text;
NSString * getDataURL = [NSString stringWithFormat:@"http://172.20.10.3:8888/finalproject/ios/login.php?username=%@&password=%@&token=%@", username, password,token];



NSURL * url = [NSURL URLWithString:getDataURL];

NSData * data = [NSData dataWithContentsOfURL:url];

_jsonArray = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:nil];
_citiesArray = [[NSMutableArray alloc] init];




for(int i = 0; i < _jsonArray.count; i++)
{
    code = [[_jsonArray objectAtIndex:i] objectForKey:@"code"];

}

是否有人能够指出我正确的方向将其转变为POST请求?

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

从GET更改为POST在安全方面不会是一个很大的胜利,但至少你的参数不会出现在代理日志中。此外,GET请求有时会有长度限制(在服务器,代理中)。

尝试此代码(我假设您将JSON数据作为响应):

static NSString* const kDataURL  = [NSString stringWithFormat:@"http://172.20.10.3:8888/finalproject/ios/login.php"];
static NSString* const kDataBody = @"?username=%@&password=%@&token=%@";

NSURL *url = [NSURL URLWithString:kDataUrl];
req = [NSMutableURLRequest requestWithURL:url];
[req setHTTPMethod:@"POST"];
NSString *body = [NSString stringWithFormat:kDataBody, username, password, token];
[req setHTTPBody:[body dataUsingEncoding:NSUTF8StringEncoding]];
NSOperationQueue *queue = [[NSOperationQueue alloc] init];

[NSURLConnection
 sendAsynchronousRequest:req
 queue:queue
 completionHandler:^(NSURLResponse *response,
                     NSData *data,
                     NSError *error) {

     if (error == nil && [data length] > 0) {
         id json = [NSJSONSerialization JSONObjectWithData:data
                                                   options:NSJSONReadingMutableContainers
                                                     error:nil];
         NSLog(@"JSON: %@", json);
     } else {
         NSLog(@"ERROR: %@", error);
     }
 }];

此外,您可能希望使用username或以下函数对passwordtoken[token stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]进行编码:

- (NSString*)urlencode:(NSString*)str
{
    return (NSString*)CFBridgingRelease(CFURLCreateStringByAddingPercentEscapes(
        NULL,
        (__bridge CFStringRef) str,
        NULL,
        CFSTR(":/?@!$&'()*+,;="),
        kCFStringEncodingUTF8));
}

在PHP脚本中,您不必进行太多更改 - 除了确保使用$_POST$_REQUEST而不是$_GET数组。