转载自:https://www.reddit.com/r/swift/comments/2w19kp/how_do_you_send_a_through_nsmutableurlrequest/

how do you send a ? through NSMutableURLRequest without encoding the ? as %3F (self.swift)

submitted 1 year ago by xStory_Timex

I have a enum Router.swift that helps me use alamofire to interact with my API.

recently i changed the API and now when i send a URL request my code changes the "?" to "%3F" which i believe is "?" in url encoding.

here is the code Look at .ReadBrandProducts /products?brand_id=(id) when the id is 1 the request comes back as /products%3Fbrand_id=1

var path: String {
switch self {
case .AddReview(let id, _):
return "/products/\(id)/reviews"
case .ReadBrands:
return "/brands"
case .ReadBrandProducts(let id):
return "/products?brand_id=\(id)"
case .ReadProductData(let id):
return "/products/\(id)"
case .ReadReviews(let id):
return "/products/\(id)/reviews"
case .Favorite(let id):
return "/products/\(id)/favorite"
case .readFeed:
return "/activity"
}
} // MARK: URLRequestConvertible var URLRequest: NSURLRequest {
let URL = NSURL(string: Router.baseURLString)!
let mutableURLRequest = NSMutableURLRequest(URL: URL.URLByAppendingPathComponent(path))
mutableURLRequest.HTTPMethod = method.rawValue if let token = KeychainService.loadToken() {
mutableURLRequest.setValue("Bearer \(token)", forHTTPHeaderField: "Authorization")
}
 
 
 
 
sorted by:

best
 
 

[–]lyinstevemod 2 points 1 year ago

If you're using Alamofire, you should really be submitting URL encoded parameters as a dictionary instead, because Alamofire handles serialization. You're doing more work than you should.

 

[–]xStory_Timex[S] 1 point 1 year ago

I don't understand, can you explain more

 

[–]lyinstevemod 1 point 1 year ago

So right now you're adding URL parameters, right? And you're serializing them into a string yourself.

You also said you're using Alamofire. Alamofire will actually take those arguments in a Dictionary as a parameter to the request() function. You don't need to -- and shouldn't -- manually create those strings.

Specifically just

?brand_id=\(id)

Instead, pass the parameters into the Alamofire request() function.

Alamofire.request(
.GET,
"/products",
parameters: ["brand_id": id]
)
 
 
 
 
 
 
 
 
 
 
 
 
 

QuestionQuestion mark is HTML escaped in NSMutableURLRequest self.iOSProgramming

Submitted 4 months ago by fourth_throwaway

ok, so I have an API that I built using ruby on rails. Pagination works completely in both the website and the API. Here is the api: https://sheltered-shelf-7331.herokuapp.com/api/yaks?page=1

just change out "page=1" at the end for "page=2" or "3", etc, and you'll see it works.

the problem though is that the "?" is read by the URL request as "%3F". Here is how the url request is printed in the console in Xcode:

  URL: https://sheltered-shelf-7331.herokuapp.com/api/yaks%3F

So of course it has a response of html status code 404. How can I make the question mark not be converted to %3F in the URL? I'm using URLRequest Convertible. Here is my code:

static let baseURL = "https://sheltered-shelf-7331.herokuapp.com"
let result: (path: String, parameters: [String: AnyObject]?) = { switch self {
case GetMainFeed:
return ("/api/yaks?", nil)
case PostLogin(let username, let password):
return ("/api/sessions", ["username": username, "password": password])
case PostCreateUser(let username, let password):
print(username, password)
return ("/api/users", ["username": username, "password": password])
case PostSendYak(let description, let image):
sending = true
return ("/api/yaks", ["description": description, "image": image])
case GetMyYaks:
sending = true
return ("/api/my-yaks", nil)
}
}() let url = NSURL(string: Router.baseURL)
let URLRequest = NSMutableURLRequest(URL: (url?.URLByAppendingPathComponent(result.path))!)
let encoding = Alamofire.ParameterEncoding.JSON
print(URLRequest)
if sending == true {
let defaults = NSUserDefaults.standardUserDefaults()
if let token = defaults.objectForKey("auth_token") as? String {
print(token)
URLRequest.setValue(token, forHTTPHeaderField: "Authorization")
} }
URLRequest.addValue("application/json", forHTTPHeaderField: "Content-Type")
let (encodedRequest, _) = encoding.encode(URLRequest, parameters: result.parameters)
encodedRequest.HTTPMethod = method.rawValue
return encodedRequest
 
 
 
all 3 comments
sorted by:

best
 
 

[–]Power781 2 points 4 months ago

It's not how URL parameters work.
the endpoint is /api/yaks
page=x is a parameter of your call.
you just have to set the encoding to let encoding = Alamofire.ParameterEncoding.URL depending on if you have URL parameters or body parameters.
Example on how I did it :

    public var parametersEncoding: Alamofire.ParameterEncoding {
switch self.method {
case .GET :
return .URL
case .POST, .PUT:
return .JSON
default:
return .JSON
}
}
 
 
 
 

[–]AyyBodyFrizzesAlone 1 point 4 months ago

?page=1 is not a path component. It's a URI parameter. Just append it with stringByAppendingString.

 

[–]tonygoold 1 point 4 months ago

It's actually the query, not the parameter (which isn't used by HTTP), an important distinction if you're trying to get the query string from an NSURL. You're right about why it's encoding the question mark though.

%3f URL --> '?'拼接引发的问题的更多相关文章

  1. php 对url 操作类:url拼接、get获取页面、post获取页面(带传参)

    /* * @brief url封装类,将常用的url请求操作封装在一起 * */ class URL{ private $error; public function __construct(){ $ ...

  2. url拼接

    在做网页抓取的时候经常会遇到一个问题就是页面中的链接是相对链接,这个时候就需要对链接进行url拼接,才能得到绝对链接. url严格按照一定的格式构成,一般为如下5个字段: 详细可参考RFC:http: ...

  3. Python相对完美的URL拼接函数

    首先说下什么叫URL拼接,我们有这么一个HTML片段:   <a href="../../a.html">click me</a> 做为一只辛苦的爬虫,我们 ...

  4. url拼接参数格式

    在一些情况下,需要直接往url上拼接请求参数. http://www.yanggb.com?flag=1&type=normal&role=customer 通过上面的例子就可以看出, ...

  5. Ajax获取接口数据,url拼接参数跳转页面,js获取上一级页面参数给本页面

    1.Ajax获取接口数据 function demo(){ //假设请求参数 var requestBody = [{ "name":"zhang", &quo ...

  6. 字符串拼接引发的BUG

    译者按: bug虽小,却是个磨人的小妖精! 原文: Fixing a bug: when concatenated strings turn into numbers in JavaScript 译者 ...

  7. 接口测试get请求url拼接函数(python)

    get请求地址一般是 协议+域名+端口+路径+参数,除了协议和域名其他均可为空.  http(s)://domain:port/path?key1=value1&key2=value2& ...

  8. 相对URL拼接为绝对URL的过程

    URL有两种方式:绝对的和相对的. 绝对URL中包含有访问资源的所需的全部信息 举一个例子: <HTML> <HEAD><TITLE>Joe's Tools< ...

  9. 关于url拼接传参数和利用view的字典传参数时,模板获取数据的方式问题

    url = "{% url 'dashboard:internship-theme-stat' %}?teacher_name="+teacher_name+"& ...

随机推荐

  1. Vultr VPS测试IP $5/月KVM-512MB/15G SSD/1T

    vultr主要卖点是:SSD硬盘.超低价格.全球13个机房.10Gb服务器带宽.3GHz CPU.性能优异.vultr vps详细评测可参考这篇文章. 以下是vutlr vps官方提供的测试IP地址: ...

  2. chapter 13_2 关系类、库定义的元方法

    元表还可以指定关系操作符的含义,元方法为__eq ,__lt(小于) ,__le(小于等于). 而其它3个关系操作符则没有单独的元方法,Lua会 把a ~= b 转化为not(a == b) 将a&g ...

  3. SharePoint2013基于Form(FBA)的AD认证登陆

    来源于:http://www.haogongju.net/art/1964313 1. 使用SharePoint2013实现基于AD的Form认证,首先创建一个Web Application,步骤如下 ...

  4. Spring的Resource

    通过Spring Resource接口获取资源(取自http://haohaoxuexi.iteye.com/blog/2016305)目录1 Resource简介2 通过ResourceLoader ...

  5. ural 1049. Brave Balloonists(标准分解式,数论)

    1049. Brave Balloonists Time limit: 2.0 secondMemory limit: 64 MB Ten mathematicians are flying on a ...

  6. 浅谈 zookeeper 原理,安装和配置

    当前云计算流行, 单一机器额的处理能力已经不能满足我们的需求,不得不采用大量的服务集群.服务集群对外提供服务的过程中,有很多的配置需要随时更新,服务间需要协调工作,那么这些信息如何推送到各个节点?并且 ...

  7. php中文乱码问题分析及解决办法

    中文乱码问题产生的原因,主要就是字符编码设置问题:             首先,mysql数据库安装的时候字符编码要选择正确,最好选择utf-8比较保险.如果安装时没有设置正确,找到mysql的安装 ...

  8. NGUI实现一个背包功能

    界面布局是这样的,一个400*400的背景,然后在其上是16张小图片,每个小图片格子可以用来放置拾取的物品.有两个预制体,一个是可放置的小格子,一个是拾取的物品(包含一个此物品有多少的Label). ...

  9. 图片特效-仿 iPhone 图片查看器效果

    —————————————————————— <script type="text/javascript">                    var arr = ...

  10. Centos sudo添加用户

    $ su - # vi /etc/sudoers 在root ALL=(ALL) ALL下 添加 username ALL=(ALL) ALL 输入wq!强制保存.