【发布时间】:2012-06-11 21:41:25
【问题描述】:
我们已经多次尝试向 Rails 服务器发送更新 PUT 请求,但一直收到 404“您要查找的页面不存在”
我们的更新方法非常简单(实际上是通用的 rails)。
def update
@user = User.find(params[:id])
respond_to do |format|
if @user.update_attributes(params[:user])
format.html { redirect_to @user, notice: 'User was successfully updated.' }
format.json { head :no_content }
else
format.html { render action: "edit" }
format.json { render json: @user.errors, status: :unprocessable_entity }
end
end
结束
当我从命令行运行 CURL 来测试更新方法时,它工作正常。但是,当我在 Objective-c 中尝试相同的方法时,总是会导致 404 错误。
所以我的问题是:iOS 设备是否可以使用 NSURLConnection 向服务器发送 PUT 请求,或者这没有实现?
更新::
这不会更新数据库
NSString *dataString = @"user[first_name]=bob";
NSData *postBodyData = [NSData dataWithBytes: [dataString UTF8String] length:[dataString length]];
NSString *urlString = [NSString stringWithFormat:@"example.com/users/1.json"];
NSURL *fullURL = [NSURL URLWithString:urlString];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:fullURL cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:20];
[request setHTTPMethod: @"PUT"];
[request setHTTPBody:postBodyData];
self.todoConnection = [[NSURLConnection alloc] initWithRequest:request delegate:self];
receivedData = [NSMutableData data];
这会更新数据库
NSString *urlString = [NSString stringWithFormat:@"example.com/users/1.json?user[first_name]=bob"];
NSURL *fullURL = [NSURL URLWithString:urlString];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:fullURL cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:20];
[request setHTTPMethod: @"PUT"];
self.todoConnection = [[NSURLConnection alloc] initWithRequest:request delegate:self];
receivedData = [NSMutableData data];
【问题讨论】:
-
当您的问题是关于 iOS 支持时发布 Ruby 代码可能对您没有任何好处。如果您改为发布您的 Objective-C 代码,我们可以查看您是否正确设置了 HTTP 方法(如下面的 David V 所示)。
-
是的,很抱歉。我正在编写rails end,而另一个开发人员正在编写objective-c,我无法访问他的代码。现在已经结束了。
-
我想知道这是否与您没有转义 '[' 和 ']' 字符这一事实有关。尝试使用从字符串 @"user%5Bfirst_name%5D=brian" 派生的数据设置 HTTP 正文。
-
我花了将近一天的时间才弄清楚这一点。
-
这听起来像是一个安全漏洞。您将如何验证 PUT 请求?
标签: objective-c ruby-on-rails ios nsurlconnection put