通过参数将数据从iOS以Swift格式发送到rails应用程序
我正在尝试从iOS应用程序向rails API发送Post请求。我可以这样做,以便接收状态代码201(succes/created),但是,我实际上无法通过rails发送数据并在rails中创建对象 以下是我在rails API中的代码:通过参数将数据从iOS以Swift格式发送到rails应用程序,ios,ruby-on-rails,swift,Ios,Ruby On Rails,Swift,我正在尝试从iOS应用程序向rails API发送Post请求。我可以这样做,以便接收状态代码201(succes/created),但是,我实际上无法通过rails发送数据并在rails中创建对象 以下是我在rails API中的代码: def create puts params product = current_user.products.build(product_params) if product.save render json: prod
def create
puts params
product = current_user.products.build(product_params)
if product.save
render json: product, status: 201, location: [:api, product]
else
render json: {errors: product.errors}, status: 422
end
end
private
def product_params
params.require(:product).permit(:title)
end
根据上述代码,我收到的状态代码为400。但是,当我从创建操作中删除(products_params)时,我会收到一个201状态代码。所以它到达服务器并在我的数据库中创建一个新对象,但是它的标题是nil
问题是:当我打印参数时,它们会像这样通过:
{"{\"title\":\"First Title\"}"=>nil, "format"=>:json,
"controller"=>"api/v1/products", "action"=>"create", "user_id"=>"2"}
然而,他们需要这样度过:
{"title"=>"First Title", "format"=>:json,
"controller"=>"api/v1/products", "action"=>"create", "user_id"=>"2"}
目前,在iOS端,我通过以下参数发送:
let params = ["title": "First Title"]
如何从iOS端发送参数,使其以正确的格式传输到rails端
只是想了解更多信息,这是我在发送post请求时在终端中得到的响应:
request.addValue("application/json", forHTTPHeaderField: "Content-Type")
谢谢我知道了。问题是,在我的POST请求中,我没有将内容类型HTTP头设置为json。因此,我只是在我的post请求中添加了这一行:
request.addValue("application/json", forHTTPHeaderField: "Content-Type")
然后rails自动将我的参数转换为Swift字典到rails散列。我最后的代码是:
iOS端,POST请求:
func postRequest2(x: String) {
let string = "http://localhost:3000/api/users/2/products"
let url = NSURL(string: string)
let session = NSURLSession.sharedSession()
let request = NSMutableURLRequest(URL: url!)
let params = ["title": "Fifth Title"]
request.setValue("XXXXXXXXXX", forHTTPHeaderField: "Authorization")
request.addValue("application/json", forHTTPHeaderField: "Content-Type")
request.HTTPMethod = "POST"
do {
request.HTTPBody = try NSJSONSerialization.dataWithJSONObject(params, options: NSJSONWritingOptions.PrettyPrinted)
}
catch {
}
let tache = session.dataTaskWithRequest(request) { (data, response, error) -> Void in
if let antwort = response as? NSHTTPURLResponse {
let code = antwort.statusCode
print(code)
}
}
tache.resume()
}
和导轨侧,在我的ProductsController中:
def create
product = current_user.products.build(product_params)
if product.save
render json: product, status: 201, location: [:api, product]
else
render json: {errors: product.errors}, status: 422
end
end
演示如何将
params
发送到Rails。Rails显然是以错误的方式接收参数的。感谢您的回复,但我在下面找到了答案:)我没有将内容类型设置为json。我很高兴您找到了答案。快速提示:我(这是个人选择的问题,但在这里)更喜欢使用:created
和:unprocessable_entity
作为状态。它使代码更具可读性。您的意思是:render json:product,status::created,location:[:api,product]和render json:{errors:product.errors},status::unprocessable_entity?是的,您可以用符号化的名称替换数字。考虑到您的API看起来非常简单,我还建议您查找响应程序gem。它最近与Rails核心分离,但是它的响应与您想要的一样,在@product.save
之后使用@product
进行简单的响应,\u,没有条件。