%3f URL --> '?'拼接引发的问题
转载自: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")
    }
[–]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
[–]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.
%3f URL --> '?'拼接引发的问题的更多相关文章
- php 对url 操作类:url拼接、get获取页面、post获取页面(带传参)
		/* * @brief url封装类,将常用的url请求操作封装在一起 * */ class URL{ private $error; public function __construct(){ $ ... 
- url拼接
		在做网页抓取的时候经常会遇到一个问题就是页面中的链接是相对链接,这个时候就需要对链接进行url拼接,才能得到绝对链接. url严格按照一定的格式构成,一般为如下5个字段: 详细可参考RFC:http: ... 
- Python相对完美的URL拼接函数
		首先说下什么叫URL拼接,我们有这么一个HTML片段: <a href="../../a.html">click me</a> 做为一只辛苦的爬虫,我们 ... 
- url拼接参数格式
		在一些情况下,需要直接往url上拼接请求参数. http://www.yanggb.com?flag=1&type=normal&role=customer 通过上面的例子就可以看出, ... 
- Ajax获取接口数据,url拼接参数跳转页面,js获取上一级页面参数给本页面
		1.Ajax获取接口数据 function demo(){ //假设请求参数 var requestBody = [{ "name":"zhang", &quo ... 
- 字符串拼接引发的BUG
		译者按: bug虽小,却是个磨人的小妖精! 原文: Fixing a bug: when concatenated strings turn into numbers in JavaScript 译者 ... 
- 接口测试get请求url拼接函数(python)
		get请求地址一般是 协议+域名+端口+路径+参数,除了协议和域名其他均可为空. http(s)://domain:port/path?key1=value1&key2=value2& ... 
- 相对URL拼接为绝对URL的过程
		URL有两种方式:绝对的和相对的. 绝对URL中包含有访问资源的所需的全部信息 举一个例子: <HTML> <HEAD><TITLE>Joe's Tools< ... 
- 关于url拼接传参数和利用view的字典传参数时,模板获取数据的方式问题
		url = "{% url 'dashboard:internship-theme-stat' %}?teacher_name="+teacher_name+"& ... 
随机推荐
- Spring入门学习(一)
			Spring的主要功能是控制反转和面向切面编程,下面我们就来编写第一个spring的程序来体验一下控制反转 首先是加载配置文件 <?xml version="1.0" enc ... 
- JavaScript加减计算方法和显示千分位
			Math.formatFloat = function (f, digit) { var m = Math.pow(10, digit); return parseInt(f * m, 10) / m ... 
- From windows live writer
			天线数据长度: 4*14*9664*4 = 2164736 信道估计长度: 614400 均衡: 12*1200*4 = 57600 
- 监控mysql主从
			这里记录了,每次都百度查询多次. zabbix默认包含mysql监控 其中包含 mysql的基本状态监控 MySQL主从监控需要结合自定义 1)目前项目需求 只对 Slave_IO_Running . ... 
- ECOS CMD更新
			update update --force-update-db 
- 启动tomcat时报错:java.lang.OutOfMemoryError: PermGen space
			1.修改myeclipse.ini 在Myeclipse安装目录下G:\MyEclipse8.5\Genuitec\MyEclipse 8.5有一个myeclipse.ini配置文件,设置如下: -v ... 
- k个区间相交的段落数  Educational Codeforces Round 4 D
			http://codeforces.com/contest/612/problem/D 题目大意:给你n个区间,这n个区间会有相交的部分,如果一个区间相交的部分>=k,那么就把这个区间记录下来. ... 
- Find and run the whalesay image
			Find and run the whalesay image People all over the world create Docker images. You can find these i ... 
- CDOJ 1324 卿学姐与公主 分块
			题目地址 分块模板 #include<cstdio> #include<algorithm> #include<math.h> using namespace st ... 
- GITLAB管理自己的私有源码
			github是很好的公开源码管理器,但是,私有项目,需要付费才行,比较郁闷,特别是个人工作者 gitlab(英文我不咋滴),上貌似允许1000个私有项目,其他的权限,还没怎么看,估计简单的项目 ... 
