2016-01-28 83 views
1

我試圖從我的iOS應用程序向我的Rails API發送Post請求。我可以讓它接收到一個狀態代碼201(succes/created),但是,我實際上無法發送數據並在rails中創建對象。從Swift中的iOS發送數據到Params應用程序

這是我在軌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狀態碼。所以它到達服務器並在我的數據庫中創建一個新對象,但其標題僅爲零。

問題是這樣的:當我打印出來的參數,可以他們來通過像這樣:

{"{\"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發送參數這樣它們就能以正確的格式進入軌道側?

只是一點點更多的信息,這是我得到我的終端的響應,當我做POST請求:

enter image description here

感謝

+0

向我們展示瞭如何發送'params'到Rails的。 Rails顯然以錯誤的方式接受這些參數。 – Leito

+0

感謝您的回覆,但我想下面:)我沒有設置內容類型爲json。 – joey

回答

0

我想通了這一點。問題是,在我的POST請求中,我沒有將內容類型HTTP標頭設置爲json。所以,我只是簡單地添加此行我的POST請求:

request.addValue("application/json", forHTTPHeaderField: "Content-Type") 

然後導軌自動轉換參數,我作爲一個斯威夫特字典到軌哈希值。我最後的代碼是這樣的:

的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 
+1

我很高興你找到答案。一個快速提示:我(這是一個個人選擇的問題,但在這裏)更喜歡使用':created'和':unprocessable_entity'作爲狀態。它使代碼更具可讀性。 – Leito

+0

你的意思是:render json:product,status :: created,location:[:api,product]和render json:{errors:product.errors},status :: unprocessable_entity? – joey

+0

是的,你可以用符號名稱替換數字。鑑於你的API看起來很直截了當,我還建議你查看'responders' gem。它最近從Rails核心中分離出來了,但它只是像你想的那樣響應,在'@ product.save'後面有一個簡單的'responds_with @ product',沒有條件。 – Leito

相關問題