data form ios_ios form data - CSDN
精华内容
参与话题
  • IOS Post form data and pic

    2019-02-02 09:37:59
    IOS Post form data and pic
                   

    http://hi.baidu.com/yesterdayfei/item/d7fd77713a410222d7a89c21

    首先我们得知道,ios是可以将数据传送给其它网页的,不管是什么开发的网站,如PHPJSP ASP ASP.net

    原理都是一样的。那么现在我们就来讲讲如何将数据通过post方法传送给网站。相信稍微了解网站开发的朋友都对post不陌生

    在ios中给网站送数据一般分为以下几个步骤

    1.创建一个指向你需要传数据的网站的NSURL

    2.将你要传送的数据设好编码格式

    3.创建一个URL请求,如NSMutableURLRequest

    4.定义你要提交的内容的类型

    5.设定你的提交方法,我们这里用post

    6.将你的数据加载到请求中

    7.用你的请求建立URL连接

     

    下面我有两个实例,分别为传送普通表单以及上传图片

        NSURL *muUrl=[NSURL URLWithString:@"http://192.168.1.101/Test/web/index.php"];//建立URL
        NSMutableURLRequest *myRequest=[NSMutableURLRequest requestWithURL:muUrl];//创建一个指向目的网站的请求
        NSString *myBoundary=@"0xKhTmLbOuNdArY";//这个很重要,用于区别输入的域
        NSString *myContent=[NSString stringWithFormat:@"multipart/form-data;boundary=%@",myBoundary];//意思是要提交的是表单数据
        
        [myRequest setValue:myContent forHTTPHeaderField:@"Content-type"];//定义内容类型
        
        NSMutableData * body=[NSMutableData data];//这个用于暂存你要提交的数据
        //下面开始增加你的数据了

       //我这里假设表单中,有两个字段,一个叫user,一个叫password

    //字段与字段之间要用到boundary分开

        [body appendData:[[NSString stringWithFormat:@"\n--%@\n",myBoundary] dataUsingEncoding:NSUTF8StringEncoding]];//表示开始
        [body appendData:[[NSString stringWithString:@"Content-Disposition:form-data;name='user'\n\n"] dataUsingEncoding:NSUTF8StringEncoding]];//第一个字段开始,类型于<input type="text" name="user">
        [body appendData:[[NSString stringWithString:@"leve"] dataUsingEncoding:NSUTF8StringEncoding]]; //第一个字段的内容,即leve
        
        [body appendData:[[NSString stringWithFormat:@"\n--%@\n",myBoundary]dataUsingEncoding:NSUTF8StringEncoding]];//字段间区分开,也意味着第一个字段结束
        
        [body appendData:[[NSString stringWithString:@"Content-Disposition:form-data;name='password'\n\n"]dataUsingEncoding:NSUTF8StringEncoding]];//第二个字段开始,<input type="text" name="password">
        [body appendData:[[NSString stringWithString:@"tan"]dataUsingEncoding:NSUTF8StringEncoding]];//第二个字段的内容
        [body appendData:[[NSString stringWithFormat:@"\n--%@--\n",myBoundary]dataUsingEncoding:NSUTF8StringEncoding]];//结束
        
        [myRequest setHTTPMethod:@"POST"];//定义方法为post.所以如果在PHP端接收的话,以$_POST["user"],$_POST["password"]结收数据
        [myRequest setHTTPBody:body];//将内容加载到请求中
        
        NSData *respondse=[NSURLConnection sendSynchronousRequest:myRequest returningResponse:nil error:nil];//创建连接
        
        NSString * myGet=[[NSString alloc] initWithData:respondse encoding:NSUTF8StringEncoding];//接收数据

     

    注意事项:上面有两个字段,第一个[body appendData:[[NSString stringWithString:@"Content-Disposition:form-data;name='user'\n\n"] dataUsingEncoding:NSUTF8StringEncoding]]是这样的。要注意的是,在name='user'\n\n这里,这里一定是两个或以上“\n”.否则将出现接收不到数据


               

    再分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow

    展开全文
  • iOS put form-data请求

    2019-07-04 19:29:46
    ios 使用AFNetWorking 但是将form-data加入头之后,服务器看到传入的参数是空,结果网上翻了半天资料,说是ASI可以的,但是无奈,这个库太老了,并且也尝试了并没有成功,下面载自大神的博客了,将post改为put使用...

    https://www.cnblogs.com/louzhuhaha/p/3633402.html

    ios 使用AFNetWorking 但是将form-data加入头之后,服务器看到传入的参数是空,结果网上翻了半天资料,说是ASI可以的,但是无奈,这个库太老了,并且也尝试了并没有成功,下面载自大神的博客了,将post改为put使用底层的 实现的。

    iOS网络请求之multipart/form-data提交数据

    multipart/form-data表单数据
    在http网络请求中,post没有请求长度的限制,因为post把数据放在了body中,而不是像Get一样放在了浏览器的地址栏中(可以这么理解),
    所以相对安全
    POST有两种方式
    第一种直接把数据放在body中,用contentType来区分类型是text还是json或者是别的什么数据。这个最简单,不做赘述。
    第二种是表单的形式,通过boundaries来区分放置的是那些数据,很像一个字典,用K,V放置对象。
    参考POST表单数据,这是摘自网上的一段Http请求代码

    POST /upload_file/UploadFile HTTP/1.1 
    Accept: text/plain, */* 
    Accept-Language: zh-cn 
    Host: 192.168.29.65:80 
    Content-Type:multipart/form-data;boundary=---------------------------7d33a816d302b6
    User-Agent: Mozilla/4.0 (compatible; OpenOffice.org) 
    Content-Length: 424 
    Connection: Keep-Alive -----------------------------7d33a816d302b6 
    Content-Disposition:form-data; 
    name="userfile1"; 
    filename="E:\s"Content-Type: 
    application/octet-stream abbXXXccc 
    -----------------------------7d33a816d302b6 

    Content-Disposition: form-data; 

    name="text1" foo 

    -----------------------------7d33a816d302b6 <这里分割线多了两个->

    Content-Disposition: form-data; 

    name="password1" bar 

    -----------------------------7d33a816d302b6--  <这里分割线的前端和末尾多了两个-,表明数据的结束>

    大概架构就是这样,下面直接上一个测试代码:

    POST_BOUNDS 是我顶一个一个字符串 可以定义你喜欢的任意值

    复制代码

     1 -(void)multiPartPost:(NSDictionary *)dicData{
     2     
     3 
     4     NSURL *url = [NSURL URLWithString:@"http://192.168.1.112:8080/TestSerlvet/interfaces"];
     5     NSMutableString *bodyContent = [NSMutableString string];
     6     for(NSString *key in dicData.allKeys){
     7         id value = [dicData objectForKey:key];
     8         [bodyContent appendFormat:@"--%@\r\n",POST_BOUNDS];
     9         [bodyContent appendFormat:@"Content-Disposition: form-data; name=\"%@\"\r\n\r\n",key];
    10         [bodyContent appendFormat:@"%@\r\n",value];
    11     }
    12     [bodyContent appendFormat:@"--%@--\r\n",POST_BOUNDS];
    13     NSData *bodyData=[bodyContent dataUsingEncoding:NSUTF8StringEncoding];
    14     NSMutableURLRequest *request  = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:10];
    15     [request addValue:[NSString stringWithFormat:@"multipart/form-data;boundary=%@",POST_BOUNDS] forHTTPHeaderField:@"Content-Type"];
    16     [request addValue: [NSString stringWithFormat:@"%zd",bodyData.length] forHTTPHeaderField:@"Content-Length"];
    17     [request setHTTPMethod:@"POST"];
    18     [request setHTTPBody:bodyData];
    19     NSLog(@"请求的长度%@",[NSString stringWithFormat:@"%zd",bodyData.length]);
    20     __autoreleasing NSError *error=nil;
    21     __autoreleasing NSURLResponse *response=nil;
    22     NSLog(@"输出Bdoy中的内容>>\n%@",[[NSString alloc]initWithData:bodyData encoding:NSUTF8StringEncoding]);
    23     NSData *reciveData= [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
    24     if(error){
    25         NSLog(@"出现异常%@",error);
    26     }else{
    27         NSHTTPURLResponse *httpResponse=(NSHTTPURLResponse *)response;
    28         if(httpResponse.statusCode==200){
    29             NSLog(@"服务器成功响应!>>%@",[[NSString alloc]initWithData:reciveData encoding:NSUTF8StringEncoding]);
    30             
    31         }else{
    32             NSLog(@"服务器返回失败>>%@",[[NSString alloc]initWithData:reciveData encoding:NSUTF8StringEncoding]);
    33             
    34         }
    35         
    36     }
    37 }

     

    展开全文
  • 1.使用微博开发的一个“发送带图片微博”的接口来测试,这是接口地址,这里面明确说明需要使用multipart/form-data格式提交图片。关于使用微博开放平台api、授权之类的就不说了。 2.multipart/from-data是一种进行...

    1.使用微博开发的一个“发送带图片微博”的接口来测试,这是接口地址,这里面明确说明需要使用multipart/form-data格式提交图片。关于使用微博开放平台api、授权之类的就不说了。

    2.multipart/from-data是一种进行表单提交时的消息格式。表单提交数据的时候,默认类型是application/x-www-form-urlencoded,也就是key=value的键值对格式,提交文件的时候使用multipart/from-data。因为是表单提交,所以http请求方式是POST。然后在请求头里设置Content-Type为multipart/from-data指定请求的格式。

      NSURL *URL = [[NSURL alloc]initWithString:urlString];
          request = [[NSMutableURLRequest alloc]initWithURL:URL cachePolicy:(NSURLRequestUseProtocolCachePolicy) timeoutInterval:30];
      request.HTTPMethod = @"POST";
    
        NSString *boundary = @"wfWiEWrgEFA9A78512weF7106A";
        request.allHTTPHeaderFields = @{
                                        @"Content-Type":[NSString stringWithFormat:@"multipart/form-data; boundary=%@",boundary]
                                        };
    复制代码

    注意到在Content-Type里还有个boundary,顾名思义,这个东西是用来做分隔的字符串。boundary本身没有特殊要求,只要不会和其他内容混淆就好,所以尽量复杂些。

    3.POST请求,参数都放在请求体里面,而请求体是这里的关键,multipart/form-data就是一种格式,约定请求体的数据如何存放。放个例子先:

    --wfWiEWrgEFA9A78512weF7106A                    //部分1
    Content-Disposition: form-data; name="status"   //部分2
    
    哈哈哈                                           //部分3
    --wfWiEWrgEFA9A78512weF7106A
    Content-Disposition: form-data; name="source"
    
    2582981980
    --wfWiEWrgEFA9A78512weF7106A
    Content-Disposition: form-data; name="access_token"
    
    2.00nVEJoBgbvnoCc54e19c4c4NksmWC
    --wfWiEWrgEFA9A78512weF7106A
    Content-Disposition: form-data; name="pic"; filename="卡车.png"
    Content-Type=image/png
    
    ...这里是文件的二进制数据...                      //部分4
    --wfWiEWrgEFA9A78512weF7106A--                //部分5
    复制代码

    上面的“//部分X”是注释哈。 (1)部分1是“--”+boundary,即双减号加分隔符,然后换行,注意换行是使用“\r\n”,因为这些标准开始都是在html中使用的。测试了微博接口,换行也不能出错。 (2)部分2的格式是:Content-Disposition: form-data; name="xxx",这里的xxx是接口的参数,比如微博测试接口有一个参数是“status”,那status写在这里。然后是两个换行,即“\r\n\r\n”。 (3)有key就有value,上面说了key的位置,这里就是value的位置。“status”字段代表的是微博的正文内容,所以就把微博正文内容放在部分3位置,即“哈哈哈”。然后换行。 (4)然后就是部分1、2、3这个结构重复,每一个重复结构对应着接口里的一个字段的数据。直到你要上传的文件,部分4。部分4这一节多出了“ilename="卡车.png";Content-Type=image/png”这些内容,其实这里可以还有其他的内容可以设置,charset和content-transfer-encoding,都是用于描述这一部分数据。具体参考rfc标准。需要注意的是,name\filename是带引号的,而Content-Type是没有的,就这一个细节,废掉了我一下午啊! 这里的Content-Type值是这里要上传文件的格式,也不能错。 (5)部分4这里是需要上传的文件的二进制数据,当然其他部分也是同样是要转成NSData的。 (6)最后部分5是结束标识,--wfWiEWrgEFA9A78512weF7106A这部分是和前面的分割符一样,但接下来不是换行,而是继续“--”,整个请求体结束。这也是个坑啊,之前以为没有“--”!

    具体代码如下:

    NSMutableData *postData = [[NSMutableData alloc]init];//请求体数据
        for (NSString *key in params) {
            //循环参数按照部分1、2、3那样循环构建每部分数据
            NSString *pair = [NSString stringWithFormat:@"--%@\r\nContent-Disposition: form-data; name=\"%@\"\r\n\r\n",boundary,key];
            [postData appendData:[pair dataUsingEncoding:NSUTF8StringEncoding]];
            
            id value = [params objectForKey:key];
            if ([value isKindOfClass:[NSString class]]) {
                [postData appendData:[value dataUsingEncoding:NSUTF8StringEncoding]];
            }else if ([value isKindOfClass:[NSData class]]){
                [postData appendData:value];
            }
            [postData appendData:[@"\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
        }
        
        //文件部分
        NSString *filename = [filePath lastPathComponent];
        NSString *contentType = AFContentTypeForPathExtension([filePath pathExtension]);
        
        NSString *filePair = [NSString stringWithFormat:@"--%@\r\nContent-Disposition: form-data; name=\"%@\"; filename=\"%@\"
    Content-Type=%@\r\n\r\n",boundary,fileKey,filename,contentType];
        [postData appendData:[filePair dataUsingEncoding:NSUTF8StringEncoding]];
        [postData appendData:fileData]; //加入文件的数据
    [postData appendData:[@"\r\n" dataUsingEncoding:NSUTF8StringEncoding]]; 
    
    如果有多个文件,就重复设置文件部分,使用不同的`name`标识。
        
        //设置结尾
        [postData appendData:[[NSString stringWithFormat:@"--%@--\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]];
            request.HTTPBody = postData;
        //设置请求头总数据长度
        [request setValue:[NSString stringWithFormat:@"%lu",(unsigned long)postData.length] forHTTPHeaderField:@"Content-Length"];
    复制代码

    然后根据文件后缀名可以获取对应的Content-Type,来源AFNetWorking:

    static inline NSString * AFContentTypeForPathExtension(NSString *extension) {
    #ifdef __UTTYPE__
        NSString *UTI = (__bridge_transfer NSString *)UTTypeCreatePreferredIdentifierForTag(kUTTagClassFilenameExtension, (__bridge CFStringRef)extension, NULL);
        NSString *contentType = (__bridge_transfer NSString *)UTTypeCopyPreferredTagWithClass((__bridge CFStringRef)UTI, kUTTagClassMIMEType);
        if (!contentType) {
            return @"application/octet-stream";
        } else {
            return contentType;
        }
    #else
    #pragma unused (extension)
        return @"application/octet-stream";
    #endif
    }
    复制代码

    需要注意的: 1、每个该换行的地方都不能少,也不能多,且换行为“\r\n” 2、Content-Type的值没有引号 3、整个请求体是以“--”结束的。

    然后因为postData里面混进了图片的二进制数据,没法从NSData转成字符串,在调试的时候没法直观的查看哪里出了问题。我的做法是把添加文件数据,改成一个字符串的数据,比如:

    [postData appendData:[@"测试文件数据" dataUsingEncoding:NSUTF8StringEncoding]];
    //[postData appendData:fileData]; //加入文件的数据
    复制代码

    最后是项目代码:github地址。微博授权功能已经在里面了,先授权,在测试提交图片。上传后看控制台输入,成功后可以在授权的微博账号里看见刚发的这条微博。


    这个很久没更新了,相关知识可以直接参考AFNetWorking的封装,上传文件部分就是这个原理。

    展开全文
  • 做内购支付时,后端需要验证订单支付状态,因为这个校验字符串非常长,所以使用form-data的方式提交表单。 #pragma mark - 内购支付成功后确认 - (void)netApplePayWithTran:(SKPaymentTransaction *)...

     做内购支付时,后端需要验证订单支付状态,因为这个校验字符串非常长,所以使用form-data的方式提交表单。

    #pragma mark - 内购支付成功后确认
    
    - (void)netApplePayWithTran:(SKPaymentTransaction *)transaction OrderId:(NSString *)orderId {
        NSString *tranID = transaction.transactionIdentifier;
        [[XYStore defaultStore] base64Receipt:^(NSString *base64Data) {
            // base64Data = [GAPublicClass URLEncodedString:base64Data];
            NSMutableDictionary *parms = [NSMutableDictionary dictionary];
            [parms setObject:tranID forKey:@"transactionId"]; // 苹果内购交易ID
            [parms setObject:base64Data forKey:@"payload"]; // 校验体(base64字符串
            [parms setObject:orderId forKey:@"orderId"]; // 订单id
            [self validationPartPost:parms];
        } failure:^(NSError *error) {
            
        }];
    }
    
    - (void)validationPartPost:(NSDictionary *)dicData {
        NSString *POST_BOUNDS = @"yxqipayanzheng";
        NSString *tokenStr = [AccountTool sqLoginModel].token;
    
        NSURL *url = [NSURL URLWithString:[API_DOMAIN_COMMUNITY stringByAppendingString:url_apple_pay]];
        NSMutableString *bodyContent = [NSMutableString string];
        for(NSString *key in dicData.allKeys){
            id value = [dicData objectForKey:key];
            [bodyContent appendFormat:@"--%@\r\n",POST_BOUNDS];
            [bodyContent appendFormat:@"Content-Disposition: form-data; name=\"%@\"\r\n\r\n",key];
            [bodyContent appendFormat:@"%@\r\n",value];
        }
        [bodyContent appendFormat:@"--%@--\r\n",POST_BOUNDS];
        NSData *bodyData=[bodyContent dataUsingEncoding:NSUTF8StringEncoding];
        
        NSMutableURLRequest *request  = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:30];
        [request addValue:[NSString stringWithFormat:@"multipart/form-data;boundary=%@",POST_BOUNDS] forHTTPHeaderField:@"Content-Type"];
        [request setValue:tokenStr forHTTPHeaderField:@"token"];
        [request setHTTPMethod:@"POST"];
        [request setHTTPBody:bodyData];
        
        NSURLSession *session = [NSURLSession sharedSession];
        NSURLSessionDataTask *task = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
            dispatch_async(dispatch_get_main_queue(), ^{
                [MBProgressHUD hideHUDForView:KWindow animated:YES];
            });
            NSDictionary *responseJSON = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves error:nil];
            NSInteger status = [responseJSON[@"status"] integerValue];
            if (status == 200) {
    
            }
        }];
        [task resume];
    }

    TO

    iOS里实现multipart/form-data格式上传文件
    iOS 上传multipart/form-data格式文件
    iOS之网络请求之AFN表单上传之form-data

    展开全文
  • 现在是学习笔记,后续会对内容做梳理 Http 请求(后面统一称为报文),...Content-Type:application/x-www-form-urlencoded Accept-Encoding: gzip, deflate Host: w.sohu.com Content-Length: 21 Connection: Keep-
  • 背景: 在一次开发中,有一个接口,发生了一下问题,我们按照以往的经验,使用AFN 的post请求来请求接口,把参数设置到字典中,然后传递给post接口...于是,我又查阅资料基于AFN重新封装了一个form-data格式的接口,代
  • 表单上传呢一般是当要上传图片的时候用的网络请求方式。上传http post请求的表单格式是这样的Content-type: multipart/form-data, ...content-disposition: form-data; name="field1" i will upload head! --qwerdf
  • multipart/form-data表单数据 在http网络请求中,post没有请求长度的限制,因为post把数据放在了body中,而不是像Get一样放在了浏览器的地址栏中(可以这么理解), 所以相对安全。 POST有两种方式 第一种直接把数据...
  • 上传用户头像,multipart/form-data图片上传 修改用户个人详情,与服务器交互 三、实验结果 1. 用户登陆后拉取用户信息 用户登陆成功后,后台仅会返回成功的提示,需要客户端再次进行网络请求来获取这个用户的信息...
  • ios form表单上传图片

    千次阅读 2018-09-29 12:14:10
    1.使用微博开发的一个“发送带图片微博”的接口来测试,这是接口地址,这里面明确说明需要使用multipart/form-data格式提交图片。关于使用微博开放平台api、授权之类的就不说了。 2.multipart/from-data是一种进行...
  • AFNetworking 发送 GET、POST 等请求时可以直接将参数按照字典结构传入,最终编码到 url 中或者是 body 实体中,同时也支持按照 multipart/form-data 格式,将多种不同的数据合入到 body 中进行发送,而这些就涉及到...
  • Form works on desktop PC/Mac but doesn't work on iOS devices. On submit event I make call like this: <pre><code>var form_data = new FormData(this); $.ajax({ url: "api/register", method: "POST", ...
  • POST发送form-data的一些总结

    万次阅读 2016-05-06 17:59:33
    1.POST发送数据的不同方式和相互区别; 2.form-data发送的真实面目; 3.网络模块移植
  • 最近在工作上遇到一个奇葩问题,在Android和Windows平台上做请求时参数都可以正常传递和接收,但在IOS设备上后台死活接收不到值。 原因是:可能是由于 IOS 用的请求序列与java所有的序列不同,所以通过以POST提交...
  • multipart form-data boundary 说明

    万次阅读 2018-10-22 16:10:28
    multipart/form-data" 说明:  通过 http 协议上传文件 rfc1867协议概述,jsp 应用举例,客户端发送内容构造  1、概述在最初的 http 协议中,没有上传文件方面的功能。 rfc1867 ...
  • iOS--表单formdata上传文件

    千次阅读 2019-02-26 20:40:24
    背景:使用multipart/form-data格式提交图片或者文件到服务器。 方法:使用http请求POST方式,然后在请求头里设置Content-Type为multipart/from-data指定请求的格式。 参数格式: 普通参数: --boundry\r\n ...
  • FORM元素的enctype属性指定了表单数据向服务器提交时所采用的编码类型, 默认的缺省值是“application/x-... 在文件上载时,所使用的编码类型应当是“multipart/form-data”,它既可以发送文本数据
  • 我这里写的是纯粹的前端解决方案 按照一般的写法 const req = (method, url, params) => { return axios({ method: "POST", ... 'Content-Type': 'multipart/form-data', Token: localStorage.logintoken },
  • multipart/form-data: 1、既可以提交普通键值对,也可以提交文件键值对,也就是说可以混合提交,而且提交文件可以提交多个。 2、HTTP规范中的Content-Type不包含此类型,只能用在POST提交方式下,属于http客户端...
1 2 3 4 5 ... 20
收藏数 14,778
精华内容 5,911
关键字:

data form ios