2015-05-09 208 views
-1

我嘗試通過API調用更新數據庫中的對象。我用PUT請求做這個動作。郵寄請求已經完成,工作正常。我以爲它只是複製粘貼...Put請求IOS

的API部分工作得很好,因爲如果我執行下面的curl命令比它更新我的數據庫

$ curl -H 'Accept: application/json' -i -X PUT -d 'UserLogin=Ub0D&EndDate=2014-01-17 00:00:00.0000000&Sport=Fietsen&Distance=1000&Duration=10&Achieved=true&DateCreated=2015-05-09 12:01:00.000000' http://localhost:8089/api/goal/ub0d -k -u ub0d:test123 

想要的行,但現在迅速的部分給了我一個壞請求錯誤(400)... 這是我的代碼

var url : NSURL 
    url = NSURL(string: _apiUrl + connectToApi(apiCall) + String("\(AccountRepository.Instance.getCurrentUserName())"))! 

    let request = NSMutableURLRequest(URL: url) 

    if postString != nil { 

     let postData : NSData = ("UserLogin=Ub0D&EndDate=2014-01-1700:00:00.0000000&Sport=Fietsen&Distance=1000&Duration=10&Achieved=true&DateCreated=2014-01-1700:00:00.0000000").dataUsingEncoding(NSUTF8StringEncoding)! 
     // create the request 
     request.HTTPMethod = "PUT" 
     request.setValue("application/x-www-form-urlencoded", forHTTPHeaderField: "content-type") 
     request.setValue("application/json", forHTTPHeaderField: "Content-type") 
     request.setValue("application/json", forHTTPHeaderField: "Accept") 
     request.HTTPBody = postData 
    } 
    var connection: NSURLConnection = NSURLConnection(request: request, delegate: self, startImmediately: true)! 

我真的停留在它:(

+0

您已將空格帶出時間戳。你也應該百分之幾的逃脫身體。正如Sulthan所說,你只需要'application/x-www-form-urlencoded'的'Content-Type'並移除'application/json'的'Content-Type'。 – Rob

+0

另外,你的'curl'命令指定'-u';你是否在委託中實現了認證委託方法?服務器實際執行哪種認證? – Rob

回答

0

你要求不能有兩個不同內容類型在同一時間:

request.setValue("application/x-www-form-urlencoded", forHTTPHeaderField: "content-type") 
request.setValue("application/json", forHTTPHeaderField: "Content-type") 

要發送的數據顯然不是JSON,所以我想你想只

request.setValue("application/x-www-form-urlencoded", forHTTPHeaderField: "content-type") 

並刪除"application/json"線。

也有您的日期格式之間的差別:

捲曲

EndDate=2014-01-17 00:00:00.0000000 

斯威夫特

EndDate=2014-01-1700:00:00.0000000 

注日期和時間之間缺失的空間,大概應該是URL編碼(+):

EndDate=2014-01-17+00:00:00.0000000 

通常,大多數REST API在響應主體中發送錯誤消息,因此記錄失敗請求的響應總是很好。

+0

感謝您的回答!我刪除了兩個「setvalues」,但這沒有什麼區別。我也嘗試刪除日期時間後的0.00000。 我不明白它是因爲它通過命令行工作 – troncki

+0

@troncki檢查您使用400代碼獲得的消息。如果API是好的,它應該告訴你你的請求有什麼問題。 – Sulthan

+0

這是響應打印的內容。 '{status code:400,headers {「access-control-allow-origin」=「*」; 「Cache-Control」=「no-cache」; 「Content-Length」= 212; 「Content-Type」=「application/json; charset = utf-8」; 日期=「星期六,2015年5月9日17:45:36 GMT」; Expires =「-1」; Pragma =「no-cache」; Server =「Microsoft-IIS/7.5」; 「X-AspNet-Version」=「4.0.30319」; 「X-Powered-By」=「ASP。NET「; }' 唯一不同的是內容長度,訪問控制和內容類型 – troncki