你确定是走multimpart formdata协议吗?用最普通的post试试:
构建post参数:NSString *post = [NSString stringWithFormat:@"Username=%@&Password=%@",@"username",@"password"]; 创建post body:NSData *postData = [post dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:YES];post body的长度NSString *postLength = [NSString stringWithFormat:@"%d",[postData length]]; 创建一个request对象:NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init]; 设置请求地址:[request setURL:[NSURL URLWithString:[NSString stringWithFormat:@"http://tqa.bnuz.edu.cn:8088/index.aspx"]]];设置请求方法:[request setHTTPMethod:@"POST"]; 设置请求头:[request setValue:postLength forHTTPHeaderField:@"Content-Length"]; 
[request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];设置请求体:[request setHTTPBody:postData];最后就请求吧:NSURLResponse * response = nil;
NSError * error = nil;
NSData * data = [NSURLConnection sendSynchronousRequest: request
                                          returningResponse:&response
                                                      error:&error];

解决方案 »

  1.   

    @zhangao0086 但是那个网页是以表单来传输参数的,普通的post也是可以的吗?
      

  2.   


    但是那个网页是以表单来传输参数的,普通的post也是可以的吗?
      

  3.   

    这个content type就代表表单:application/x-www-form-urlencoded
      

  4.   

    post和get都是一种请求方式,表单(或其他东西)是它们传输的内容,也就是说get也能传输表单,他们在传输时有些不同:get是把参数加到所指的URL中,值和表单内各个字段一一对应,也就是完全暴露出来的;post也会先将值和字段一一对应,但是是放到传输的body中,用户看不到这个过程,但是你可以通过打印post的body看到值和字段的对应与get是一样的。
    而mutlpart formdata则是针对body的一个协议,它通过boundary把各个字段及其对应的值与其他内容分隔开,与普通post相比只是构造的body不一样,也能以表单的方式传输。
    其实主要看服务器是以什么样的方式去解析,像你提到的那两个简单参数,是不会用到mutlpart formdata的。
      

  5.   


    那我打算传输1202020004到http://tqa.bnuz.edu.cn:8088/index.aspx也是直接用post?
      

  6.   


    那我打算传输1202020004到http://tqa.bnuz.edu.cn:8088/index.aspx也是直接用post?

    是post请求,不过他在请求参数里还加上了一些其他参数:你通过浏览器抓到包后,把它传的参数也模拟一份。
      

  7.   


    那我打算传输1202020004到http://tqa.bnuz.edu.cn:8088/index.aspx也是直接用post?

    是post请求,不过他在请求参数里还加上了一些其他参数:你通过浏览器抓到包后,把它传的参数也模拟一份。师傅,可以具体说说怎样捉包吗
      

  8.   


    那我打算传输1202020004到http://tqa.bnuz.edu.cn:8088/index.aspx也是直接用post?

    是post请求,不过他在请求参数里还加上了一些其他参数:你通过浏览器抓到包后,把它传的参数也模拟一份。师傅,可以具体说说怎样捉包吗

    利用Safari抓包的话,要先在Safari的设置->高级里把开发者菜单打开,然后到你想抓的页面上,从Develop菜单中选择Start Timeline Recording,下边会出一个窗口,左边有一个红色的记录按钮,此时你从页面上发的请求就会被抓到,通过右边的详情面板可以请求的详细信息。
    Chrome也一样,按Command+Option+I打开开发者窗口,选择Timeline就行了。应用程序的包可以通过Wireshark来抓,包括客户端的App(用代理或者开个WiFi让手机来连)。
      

  9.   

    这是我以前根据网上的搜的代码,封的一个POST函数,没用第三方库。你可以拿去直接用。
    参数:AUrl:提交的地址
    ANameList:参数名列表
    AValuesList:参数值列表。要和参数名一一对应//post提交
    -(NSString *)HttpPostSubmit:(NSString *)AUrl namelist:(NSMutableArray *)ANameList valueList:(NSMutableArray *)AValuesList{
        NSString *url = AUrl;
        //分界线的标识符
        NSString *TWITTERFON_FORM_BOUNDARY = @"AaB03x";
        //根据url初始化request
        NSMutableURLRequest* request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:url]
                                                               cachePolicy:NSURLRequestReloadIgnoringLocalCacheData
                                                           timeoutInterval:10];
        //分界线 --AaB03x
        NSString *MPboundary=[[NSString alloc]initWithFormat:@"--%@",TWITTERFON_FORM_BOUNDARY];
        //结束符 AaB03x--
        NSString *endMPboundary=[[NSString alloc]initWithFormat:@"%@--",MPboundary];
        //http body的字符串
        NSMutableString *body=[[NSMutableString alloc]init];
        
        for (int i=0; i<ANameList.count; i++) {
            NSString *name = [ANameList objectAtIndex:i];
            NSString *value = [AValuesList objectAtIndex:i];
            //添加分界线,换行
            [body appendFormat:@"%@\r\n",MPboundary];
            //添加字段名称,换2行
            [body appendFormat:@"Content-Disposition: form-data; name=\"%@\"\r\n\r\n",name];
            //添加字段的值
            if (i == ANameList.count-1)
                [body appendFormat:@"%@",value];
            else
                [body appendFormat:@"%@\r\n",value];
        }
        
        //声明结束符:--AaB03x--
        NSString *end=[[NSString alloc]initWithFormat:@"\r\n%@",endMPboundary];
        //声明myRequestData,用来放入http body
        NSMutableData *myRequestData=[NSMutableData data];
        //将body字符串转化为UTF8格式的二进制
        [myRequestData appendData:[body dataUsingEncoding:NSUTF8StringEncoding]];
        //加入结束符--AaB03x--
        [myRequestData appendData:[end dataUsingEncoding:NSUTF8StringEncoding]];
        
        //设置HTTPHeader中Content-Type的值
        NSString *content=[[NSString alloc]initWithFormat:@"multipart/form-data; boundary=%@",TWITTERFON_FORM_BOUNDARY];
        //设置HTTPHeader
        [request setValue:content forHTTPHeaderField:@"Content-Type"];
        //设置Content-Length
        [request setValue:[NSString stringWithFormat:@"%d", (int)[myRequestData length]] forHTTPHeaderField:@"Content-Length"];
        //设置http body
        [request setHTTPBody:myRequestData];
        //http method
        [request setHTTPMethod:@"POST"];
        
        NSData *returnData = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];
        NSString *dataInfo = [[NSString alloc] initWithData:returnData encoding:NSUTF8StringEncoding];
        return dataInfo;
    }
      

  10.   


    那我打算传输1202020004到http://tqa.bnuz.edu.cn:8088/index.aspx也是直接用post?

    是post请求,不过他在请求参数里还加上了一些其他参数:你通过浏览器抓到包后,把它传的参数也模拟一份。师傅,可以具体说说怎样捉包吗

    利用Safari抓包的话,要先在Safari的设置->高级里把开发者菜单打开,然后到你想抓的页面上,从Develop菜单中选择Start Timeline Recording,下边会出一个窗口,左边有一个红色的记录按钮,此时你从页面上发的请求就会被抓到,通过右边的详情面板可以请求的详细信息。
    Chrome也一样,按Command+Option+I打开开发者窗口,选择Timeline就行了。应用程序的包可以通过Wireshark来抓,包括客户端的App(用代理或者开个WiFi让手机来连)。怎样通过代码获取那些参数的初始值?
      

  11.   


    我明白这个道理,但是一定要手动吗?不可以用过代码获取他的初始值吗?如果它每一次都改变,手动的话就很麻烦,,,如何通过代码获取它的html源码?
      

  12.   

    看来你得先了解什么叫POST了。
    简单的说POST和GET只是提交数据方式不同,返回都一样。
    你打开百度实际上就是get   http://www.baidu.com返回的是百度页面的源文件。
    同理,这个函数返回的也就是你POST的页面返回的源文件
      

  13.   


    我明白这个道理,但是一定要手动吗?不可以用过代码获取他的初始值吗?如果它每一次都改变,手动的话就很麻烦,,,如何通过代码获取它的html源码?
    获取它的值就是通过代码访问那个URL地址,然后你就拿到源码了。