转载自: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.