通过参数将数据从iOS以Swift格式发送到rails应用程序

通过参数将数据从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

我正在尝试从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: 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,没有条件。