【问题标题】:Can iOS devices send PUT requests to Rails apps?iOS 设备可以向 Rails 应用程序发送 PUT 请求吗?
【发布时间】: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


【解决方案1】:

其实@akshay1188 有一个可行的解决方案,但我认为更优雅的方法是在请求中添加“application/x-www-form-urlencoded”内容类型:

[request setHTTPMethod:@"PUT"];
[request setValue:@"application/json" forHTTPHeaderField:@"Accept"];
[request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];

【讨论】:

    【解决方案2】:

    设置HTTP方法类型为@"POST"

    并在请求正文中添加一个参数: @"PUT" 为键 @"_method"

    它应该可以工作。

    【讨论】:

    • 你能这么客气并提供完整的工作示例吗?
    【解决方案3】:

    您可以发出 NSMutableURLRequest 并设置 HTTP 方法:

    - (void)setHTTPMethod:(NSString *)method
    

    给它字符串@"PUT"

    以下是如何从此类请求中创建 NSURLConnection。

    NSMutableURLRequest *myMutableRequest[[NSMutableURLRequest alloc] initWithURL:myURL];
    [myMutableRequest setHTTPMethod:@"PUT"];
    [NSURLConnection connectionWithRequest:myMutableRequest delegate:myDelegate];
    

    【讨论】:

    • 试过了,但没用。 POST 和 GET 请求确实有效。
    • 您的 URL、参数或标头可能有问题。您是否调试了请求以验证其格式是否正确?您可以尝试在请求中输入您提供给 cURL 的确切字符串,看看是否有帮助。
    • 嗯,这很有趣。当我尝试通过 [request setHTTPBody:@"user[first_name]=brian"] 将正文数据添加到 PUT 请求时,它会以 200 响应进行响应,但不会更新数据库记录。但是,当我将数据附加到 URL 时,它会发生变化。例如:test.com/users/1.json?user[first_name]=joe
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-21
    • 1970-01-01
    • 2015-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多