转载自: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")
}
- 3 comments
- share
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
- 3 comments
- share
[–]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
}
}
- permalink
- embed
[–]AyyBodyFrizzesAlone 1 point 4 months ago
?page=1 is not a path component. It's a URI parameter. Just append it with stringByAppendingString.
- permalink
- embed
[–]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.
[–]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
Instead, pass the parameters into the Alamofire request() function.