分解url转为post请求

本文介绍了一种将HTTP GET请求转换为POST请求的方法,通过分解URL获取基础地址和参数,并使用Objective-C实现。

一些情况下,为了安全起见,我们需要把get方式的http请求处理成post方式。

比如,我们从后台拿到一个访问链接,如:http://www.test.qq.com/api/do?type=1&reason=test&flag=2

希望按如下方式发送请求:

post url:http://www.test.qq.com/api/do

post 参数:type 1

                     reason test

                     flag 2


怎么做呢,贴个比较简单的方式,直接做url分解就可以了。

-(void)approval:(NSString *)approvalUrl
{
    NSRange curRange = [approvalUrl rangeOfString:@"?"];
    NSString *baseUrl = [approvalUrl mutableCopy];
    NSString *paramStr = @"";
    if (curRange.location != NSNotFound) {
        baseUrl = [approvalUrl substringToIndex:curRange.location];
        paramStr = [approvalUrl substringFromIndex:curRange.location+1];
    }
    
    NSURL *url = [NSURL URLWithString:[baseUrl stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
    NSLog(@"url is:%@", url);
    
    NSDictionary *paramDic = [Utils parametersWithSeparator:@"=" delimiter:@"&" url:paramStr];
   
    ASIFormDataRequest *request=[ASIFormDataRequest requestWithURL:url];
    NSEnumerator *enumerator = [paramDic keyEnumerator];
    id object;
    while (object = [enumerator nextObject]) {
        NSString *key = [NSString stringWithFormat:@"%@", object];
        NSString *value = [NSString stringWithFormat:@"%@", [paramDic valueForKey:key]];
        [request setPostValue:value forKey:key];
    }
    
    [request setTimeOutSeconds:5];
    [request setCachePolicy:NSURLRequestReloadIgnoringCacheData];
    [request setDelegate:self];
    [request setDidFinishSelector:@selector(requestSuccess:)];
    [request setDidFailSelector:@selector(requestError:)];
    [request setValidatesSecureCertificate:NO];
    [request startAsynchronous];
}

当然,如果需要做更复杂的url分解,可以考虑下正则表达式,后面再研究。
课后习题 第一章 一、填空题 1、ES 的全称是 ECMAScript,它是由 ECMA 国际标准化组织制定的一项脚本语言的标准化规范。 解析:ECMAScript(简称 ES)是 JavaScript 的标准化规范,由 ECMA 国际组织制定,用于定义脚本语言的语法和功能。 2、使用 let 关键字声明的变量具有 块级 作用域。 解析:ES6 中 let 和 const 声明的变量具有块级作用域(如 {} 大括号内),而 var 声明的变量只有函数作用域或全局作用域。 3、在 ES6 中可以使用 const 关键字声明一个常量。 解析:const 用于声明常量,声明时必须赋值,且值不可修改。 4、箭头函数中的 this 关键字指向的是函数定义位置的上下文 this。 解析:箭头函数没有自己的 this,其 this 指向定义时所在的上下文(如外层函数或全局对象),而非调用时的上下文。 5、数组中的 find() 方法用于找出第一个符合条件的数组成员,如果没有找到返回 undefined。 解析:find () 方法接收一个回调函数,遍历数组并返回第一个满足条件的元素,若没有符合条件的元素则返回 undefined。 二、判断题 1、利用 var 声明的变量会绑定在块级作用域,不会受外界的影响。(×) 解析:var 声明的变量属于函数作用域或全局作用域,不存在块级作用域。例如,在 if 语句的 {} 中用 var 声明变量,变量仍可在块外访问。 2、使用 const 关键字声明常量的时候必须要给定值。(√) 解析:const 声明常量时必须初始化(赋值),否则会报错。 3、解构赋值是把数据结构分解,然后对变量赋值。(√) 解析:解构赋值允许从数组或对象中提取值,并赋给对应的变量,例如 let [a, b] = [1, 2] 或 let { name } = { name: "张三" }。 4、数组实例中的 includes () 方法可以判断某个数组是否包含给定的值,返回布尔值。(√) 解析:includes () 方法用于检查数组是否包含指定元素,返回 true 或 false,例如 [1, 2].includes(2) 返回 true。 5、字符串实例 endsWith () 方法表示参数字符串是否在原字符串的头部,返回布尔值。(×) 解析:endsWith () 用于判断字符串是否以指定字符串结尾,而判断头部的方法是 startsWith ()。 三、选择题 1、下列选项中,不属于 let 关键字特点的是(C)。 A. let 关键字声明的变量只在所处的块级作用域有效 B. let 关键字声明的变量不存在变量提升 C. let 关键字声明的变量具有局部作用域 D. let 关键字声明的变量具有暂时性死区特性 解析: A 正确:let 声明的变量属于块级作用域。 B 正确:let 不存在变量提升,需先声明再使用。 C 错误:“局部作用域” 通常指函数作用域,而 let 是块级作用域,两者概念不同。 D 正确:在 let 声明前使用变量会触发 “暂时性死区” 错误。 2、下列选项中,说法错误的是(D)。 A. 使用 var 关键字声明的变量存在变量提升现象 B. 使用 let 关键字声明的变量不存在变量提升现象 C. 使用 const 关键字声明的常量不存在变量提升现象 D. 使用 var 关键字声明的变量只能先声明后使用 解析: A 正确:var 声明的变量会提升到作用域顶部,但值为 undefined。 B、C 正确:let 和 const 无变量提升。 D 错误:var 存在变量提升,因此可以先使用后声明(但值为 undefined),例如 console.log(a); var a = 1; 会输出 undefined。 3、下列选项中,关于箭头函数的说法错误的是(C)。 A. 如果函数体中只有一句代码,且代码的执行结果就是返回值,可以省略大括号 B. 如果形参只有一个,可以省略小括号 C. 箭头函数绑定 this 关键字 D. 箭头函数中的 this 关键字指向的是函数定义位置的上下文 this 解析: A、B 正确:箭头函数的语法简化规则,例如 (x) => x + 1 可简写为 x => x + 1。 C 错误:箭头函数不绑定自己的 this,而是继承定义时的上下文 this。 D 正确:箭头函数的 this 指向定义时的外层作用域,而非调用时的对象。 4、下列选项中,关于扩展运算符说法错误的是(A)。 A. 扩展运算符可以将数组或者对象转为用冒号分隔的参数序列 B. 扩展运算符可以将可遍历对象换为真正的数组 C. 扩展运算符可以应用于合并数组 D. 扩展运算符可以将伪数组换为真正的数组 解析: A 错误:扩展运算符(...)将数组或可遍历对象转为逗号分隔的参数序列,而非冒号。例如 console.log(...[1, 2]) 输出 1 2。 B 正确:可通过 Array.from() 或 [...iterable] 将可遍历对象(如 Set、Map)转为数组。 C 正确:合并数组示例:[1, 2, ...[3, 4]] 结果为 [1, 2, 3, 4]。 D 正确:伪数组(如函数的 arguments 对象)可通过 [...arguments] 转为真数组。 五、简答题 1、请简述 let 关键字声明变量的特点。 let 关键字声明的变量只在所处的块级有效 let 关键字声明的变量不存在变量提升 let 关键字声明的变量具有暂时性死区特性 2、请简述 const 关键字声明常量的特点。 const 关键字声明的常量具有块级作用域 const 关键字声明常量时必须赋值 const 关键字声明常量并赋值后,值不能修改 3、请简述暂时性死区的概念。 因为 let 关键字声明的变量不存在变量提升,其作用域都是块级作用域,在块级作用域内使用 let 关键字声明的变量会被整体绑定在这个块级作用域中形成封闭区域,不再受外部代码影响。所以在块级作用域内,使用 let 关键字声明变量之前,该变量都是不可用的。这在语法上,称为“暂时性死区”。 4、请简述箭头函数的特点。 箭头函数是 ES6 中新增的函数,它用于简化函数的定义语法,有自己的特殊语法,接收一定数量的参数,并在其封闭的作用域的上下文中操作。在箭头函数中,如果函数体中只有一句代码,且代码的执行结果就是函数的返回值,此时可以省略函数体大括号。在箭头函数中,如果参数只有一个,可以省略参数外部的小括号。 第四章 一、填空题 1、app.get() 中间件方法会拦截 GET 请求。 解析:Express 中 app.get(path, callback) 用于处理 HTTP GET 请求。 2、中间件主要由 中间方法 和 回调函数 两部分构成。 解析:中间件函数接收 req、res 和 next 三个参数,通过 next() 传递控制权。 3、app.post() 中间件方法会拦截 POST 请求。 解析:Express 中 app.post(path, callback) 用于处理 HTTP POST 请求。 4、app.use() 中间件能够处理 GET 请求POST请求。 解析:app.use() 是通用中间件,不限制请求方法,可处理所有类型的 HTTP 请求。 5、Express 框架提供的 express.static 内置中间件可以托管静态资源文件。 解析:express.static() 用于静态文件服务,如 HTML、CSS、JS 等。 二、判断题 1、Express 是一个基于 Node 平台的 Web 应用开发框架。(√) 解析:Express 是 Node.js 最流行的 Web 应用框架之一,用于快速构建服务器和 API。 2、Express 框架支持 express-art-template 模板引擎。(√) 解析:express-art-template 是 Express 的模板引擎插件,可通过 app.engine() 配置使用。 3、Express 框架提供了方便简洁的路由定义方式,用于执行不同的 HTTP 请求动作。(√) 解析:Express 通过 app.get()、app.post() 等方法定义路由,处理不同 HTTP 方法的请求。 4、Express 框架提供了中间件机制,设置中间件来响应 HTTP 请求。(√) 解析:中间件是 Express 的核心特性,可用于处理请求、响应或传递控制权。 5、Express 框架中的 req.params 属性用于获取路由参数。(√) 解析:例如路由 /user/:id 的参数可通过 req.params.id 获取。 三、选择题 1、下列选项中,用于获取 GET 请求参数的是(D)。 A. res.body B. res.query C. req.body D. req.query 解析:GET 请求的参数通过 URL 查询字符串传递,可通过 req.query 获取。 2、下列选项中,用于获取 POST 请求参数的是(C)。 A. res.body B. res.query C. req.body D. req.query 解析:POST 请求的参数通常在请求体中,需通过中间件(如 express.json())解析后由 req.body 获取。 3、下列选项中,用于配置模板引擎的方法是(D)。 A. app.get() B. app.post() C. app.use() D. app.engine() 解析:app.engine(ext, callback) 用于注册模板引擎,例如配置 EJS、Pug 等。 4、下列选项中,用于在请求路径后面连接 GET 请求参数的符号是(B)。 A. @ B. ? C. & D. $ 解析:URL 中使用 ? 分隔路径和查询参数,例如 /search?keyword=test。 5、下列选项中,<form> 标签的 method 属性的默认值为(C)。 A. home B. route C. get D. post 解析:HTML 中 <form> 的 method 默认值为 get,即表单数据会通过 URL 参数提交。 四、简答题 1、请简述什么是中间件。 我们可以把中间件理解为处理客户端请求的一系列方法,如果把请求比作是一道水流,那么中间件就是水流中的阀门,阀门可以控制水流是否继续向下流动,也可以在当前阀门处对水流进行排污处理,处理完成后再继续向下流动。 第五章 一、填空题 1、Ajax (Asynchronous JavaScript and XML,异步 JavaScript 和 XML) 是浏览器提供的一套方法,可以实现页面无刷新更新数据,提高用户浏览网页的体验。 解析:Ajax 通过异步 HTTP 请求与服务器交换数据,无需刷新整个页面。 2、在请求头中指定 Content-Type 属性的值是 application/json,表示服务器端当前请求参数的格式是 JSON。 解析:该值告诉服务器请求体使用 JSON 格式,常见于 POST 或 PUT 请求。 3、在请求头中指定 Content-Type 属性的值是 application/x-www-form-urlencoded,表示服务器端当前请求参数的格式是用 “&” 符号连接多个 “参数名称等于参数值” 形式的数据。 解析:这是表单数据的默认编码格式,如 name=value&age=20。 4、在请求地址中,“?” 符号后面的部分表示 请求参数。 解析:在网络请求中,请求地址的结构通常为:协议://域名:端口/路径?参数1=值1&参数2=值2。其中,?符号是请求参数的起始标识,其后面的部分即为请求参数。这些参数以键值对形式存在(如参数名=参数值),多个键值对之间用&符号连接(如参数1=值1&参数2=值2)。 5、通常使用 JSON.stringify() 方法将 JSON 对象换为 JSON 字符串。 解析:该方法用于序列化对象,例如 JSON.stringify({ name: "张三" }) 返回 "{"name":"张三"}"。 二、判断题 1、在传统网站中,用户是通过页面长时间的加载来更新数据的。在网速慢的情况下,用户体验非常不好。(√) 解析:传统网站每次数据更新需刷新整个页面,加载时间长,体验差。 2、随着技术不断发展,为了提高用户的体验,Ajax 解决了传统网站中存在的问题。(√) 解析:Ajax 通过异步请求局部更新页面,避免了全页面刷新的问题。 3、POST 请求参数的传递会将请求参数放在 send () 方法中。(√) 解析:POST 请求的参数通常通过 send() 方法传递,如 xhr.send(JSON.stringify(data))。 4、网络中断时,请求无法发送到服务器端,会触发 Ajax 对象的 onerror 事件。(√) 解析:onerror 事件在请求因网络错误(如断网、服务器不可达)失败时触发。 5、Ajax 技术需要运行在网站环境中才能生效。(√) 解析:Ajax 基于 HTTP 请求,需通过服务器或本地开发环境(如 localhost)运行,直接打开 HTML 文件会因同源策略受限。 三、选择题 1、下列选项中,设置 Ajax 对象请求方式和请求地址的方法是(A)。 A. open () 方法 B. send () 方法 C. onload () 方法 D. onreadystatechange () 方法 解析:open(method, url) 用于配置请求的方法(如 GET、POST)和 URL。 2、下列选项中,open () 方法的第 1 个参数表示的是(A)。 A. 请求方式 B. 请求地址 C. 请求参数 D. 请求参数类型 解析:open() 的第一个参数是 HTTP 方法(如 "GET"、"POST")。 3、下列选项中,open () 方法的第 2 个参数表示的是(D)。 A. 请求参数类型 B. 请求参数 C. 请求方式 D. 请求地址 解析:open() 的第二个参数是请求URL。 4、下列选项中,实现向服务器端发送请求的方法是(D)。 A. open () 方法 B. onload () 方法 C. ajax () 方法 D. send () 方法 解析:send() 方法实际触发 HTTP 请求,将数据发送到服务器。 5、下列选项中,实现监听服务器端响应数据的事件是(AB)。 A. onload 事件 B. onreadystatechange 事件 C. click 事件 D. onerror 事件 解析:A. onload 事件:请求完成且响应接收后触发,适合简洁处理数据B. onreadystatechange 事件:监听请求状态变化(如加载中、完成),可细粒度控制逻辑。 C/D 错误:click 为用户交互事件,onerror 仅在请求失败时触发,均与响应监听无关。 四、简答题 1、请简述Ajax状态码主要有哪些及含义是什么。 0:请求未初始化(还没有调用 open()方法); 1:请求已经建立,但是还没有发送(还没有调用 send()方法); 2:请求已经发送; 3:请求正在处理中,通常响应中已经有部分数据可以用了; 4:响应已经完成,可以获取并使用服务器的响应了。 第六章 一、填空题 1、使用 new 实例化 FormData () 构造函数来创建 FormData 对象。 解析:JavaScript 中通过 new FormData() 创建实例。 2、FormData 对象中,set() 方法用于设置表单对象属性的值。 解析:set(key, value) 会覆盖已有键值对,或添加新值。 3、FormData 对象中,append() 方法用于添加表单对象属性的值。 解析:append(key, value) 允许重复添加相同键,生成多个同名参数。 4、FormData 对象中,get() 方法用于获取表单对象属性的值。 解析:get(key) 返回首个匹配键的值,无匹配时返回 null。 5、FormData 对象中,delete() 方法用于删除表单对象属性中的值。 解析:delete(key) 移除所有匹配键的键值对。 二、判断题 1、FormData 对象提供了处理表单数据的方法,使用起来非常方便。(√) 解析:FormData 简化了表单数据的收集和发送,支持文件上传。 2、FormData 对象可以作为 POST 请求参数直接传递给服务器。(√) 解析:可直接作为 XMLHttpRequest 或 fetch 的 body,自动设置正确的 Content-Type。 3、formidable 是一个第三方模块,用于解析表单数据 FormData 对象。(√) 解析:formidable 是 Node.js 模块,专门处理 multipart/form-data 格式的表单数据。 4、使用 new 实例化 formidable.IncomingForm () 构造函数来创建 formidable 表单解析对象。(√) 解析:通过 new formidable.IncomingForm() 创建解析器实例。 5、formidable 表单解析对象提供了 parse () 方法,parse () 方法会请求中所包含的表单数据。(√) 解析:form.parse(req, callback) 解析请求体并回调处理结果。 三、选择题 1、下列选项中,用于定义文件域表单元素的是(A)。 A. <input type="file" /> B. <input type="text" /> C. <input type="button" /> D. <input type="submit" /> 解析:type="file" 创建文件上传控件。 2、下列选项中,用于设置上传的文件保持原来的文件扩展名的是(A)。 A. keepExtensions = true B. keepExtensions = false C. keepExtensions = boolean D. keepExtensions = undefined 解析:formidable 中 keepExtensions: true 保留原始文件扩展名。 3、下列选项中,用于设置上传文件存放目录的属性的是(C)。 A. loadDir B. downloadDir C. uploadDir D. loadDir 解析:formidable 通过 uploadDir 指定文件存储路径。 4、下列选项中,用于循环遍历目标对象的模板语法是(A)。 A. {{ each }} B. {{ for }} C. {{ if }} D. {{ while }} 解析:art-template 等模板引擎使用 {{ each }} 遍历数组或对象。 5、下列选项中,同源策略满足的条件不包括(D)。 A. 协议相同 B. 域名相同 C. 端口号相同 D. 具体请求地址相同 解析:同源策略要求协议、域名、端口相同,不限制具体路径。 学习,记住
06-10
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值