2015-05-09 188 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