ios - JSON POST 在 iO 中不起作用

标签 ios json web-services post

我正在尝试使用 JSON POST 方法将一些数据发布到 Web 服务,我尝试了很多方法来做到这一点,但没有一个有效。这是我的代码,请检查:

    NSArray *objects=[NSArray arrayWithObjects:@"value1", @"value2",@"value3", @"value4",@"value5", @"value6",@"value7", @"value8",@"value9", nil] ;
    NSArray *keys=[NSArray arrayWithObjects:@"FirstName", @"LastName",@"UserName", @"Password",@"Email", @"Gender",@"DeviceId", @"DeviceName",@"ProfileImage", nil];

    NSData *_jsonData=nil;
    NSString *_jsonString=nil;
    NSURL *url=[NSURL URLWithString:urlstring];

    NSDictionary *JsonDictionary=[NSDictionary dictionaryWithObjects:objects forKeys:keys];

    if([NSJSONSerialization isValidJSONObject:JsonDictionary]){
        _jsonData=[NSJSONSerialization dataWithJSONObject:JsonDictionary options:0 error:nil];
        _jsonString=[[NSString alloc]initWithData:_jsonData encoding:NSUTF8StringEncoding];
    }

    NSMutableURLRequest *request=[NSMutableURLRequest requestWithURL:url];
    [request setHTTPMethod:@"POST"];
//    [request setHTTPBody:_jsonData];
//    [request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
//    [request setValue:@"application/json" forHTTPHeaderField:@"Accept"];
//    [request setValue:[NSString stringWithFormat:@"%d", [_jsonData length]] forHTTPHeaderField:@"Content-Length"];

    [request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];

    NSString *finalString = [_jsonString stringByAddingPercentEscapesUsingEncoding:NSASCIIStringEncoding];

    [request setHTTPBody:[finalString dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:YES]];

    //    //return and test
    NSData *returnData = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];
    NSString *returnString = [[NSString alloc] initWithData:returnData encoding:NSUTF8StringEncoding];

请检查。

最佳答案

这是我尝试注册用户的示例代码。
在“注册”按钮点击,编写以下代码:

  - (IBAction)registerButtonPressed:(id)sender
{
  BOOL valid = FALSE;
  valid=[self validateEntry];
  if(valid)
  {
    NSString *bytes = [NSString stringWithFormat:@"{\"UserName\":\"%@ %@\",\"Email\":\"%@\",\"UserType\":\"normaluser\",\"Password\":\"%@\"}",firstName,lastName,email,password];
    NSURL *url=[NSURL URLWithString:urlstring];
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
    [request setHTTPMethod:@"POST"];
    [request setValue:@"application/json; charset=utf-8" forHTTPHeaderField:@"Content-Type"];
    [request setHTTPBody:[bytes dataUsingEncoding:NSUTF8StringEncoding]];        
    [self setUrlConnection:[NSURLConnection connectionWithRequest:request delegate:self]];
    [self setResponseData:[NSMutableData data]];
    [self.urlConnection start];
  }
}

然后添加以下内容作为连接委托(delegate)方法:
   - (void) connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse   *)response
{
  [self.responseData setLength:0];
}

- (void) connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{    
  [self.responseData appendData:data];
}
- (void) connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
{
[UIApplication sharedApplication].networkActivityIndicatorVisible = NO;
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Network Status"
                                                message:@"Sorry,Network is not  available. Please try again later."
                                               delegate:self cancelButtonTitle:nil otherButtonTitles:@"OK", nil];
   [alert show];

}
- (void) connectionDidFinishLoading:(NSURLConnection *)connection
{
  if (connection == self.urlConnection) 
  {
    [UIApplication sharedApplication].networkActivityIndicatorVisible = NO;        
    NSError *error;        
    NSDictionary *jsonString=[NSJSONSerialization JSONObjectWithData:self.responseData options:kNilOptions error:&error];        
    if(jsonString != nil)
    {          
        if ([[[jsonString objectForKey:@"data"] objectForKey:@"id"] length])
        {
            [[NSUserDefaults standardUserDefaults] setValue:[[jsonString objectForKey:@"data"] objectForKey:@"id"] forKey:@"user_id"];
            [[NSUserDefaults standardUserDefaults] setValue:[[jsonString objectForKey:@"data"] objectForKey:@"UserName"] forKey:@"user_name"];                
            [[NSUserDefaults standardUserDefaults] synchronize];
            [delegate userRegistrationViewControllerResponse:self];
        }
        else
        {
            UIAlertView *alertView=[[UIAlertView alloc] initWithTitle:@"Info" message:[jsonString objectForKey:@"statusText"] delegate:nil cancelButtonTitle:@"Ok" otherButtonTitles:nil, nil];
            [alertView show];
        }
    }
    else
    {
        UIAlertView *alertView=[[UIAlertView alloc] initWithTitle:@"Server Busy" message:@"Register after sometime" delegate:nil cancelButtonTitle:@"Ok" otherButtonTitles:nil, nil];
        [alertView show];
    }
  }
}
  • 这会将用户信息发布为 JSON。
  • 关于ios - JSON POST 在 iO 中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13359314/

    相关文章:

    ios - 如何打开 Google map 点击 Xcode 中的嵌入 map

    ios - XCode:找不到用于-lAFNetworking的库

    ios - 为什么 Cocoapods 在推送到 Git 时会被忽略?

    javascript - HTML 5 历史 - window.pushState 不工作

    javascript - 将数据转换为 JSON 格式,其中字段为空格(单个或多个)和换行符分隔值

    java - 将 Java Web 项目部署到物理服务器

    java - SSL/双向 SSL 通信问题

    android - iOS 版 Chrome 和 Android 版 Chrome 之间的区别

    php - jQuery UI 自动完成不会显示返回的 json (PHP)

    asp.net - 如何使用 web 服务返回接口(interface)或 "complex"值?