1

POST 请求一切正常,但找不到使用 PUT 或 DELETE 的方法?

 NSMutableURLRequest *mutableRequest = [[NSMutableURLRequest alloc] init];        
[mutableRequest setURL:[NSURL URLWithString:[NSString 

    stringWithFormat:@"http://abc.com/update/27"]]];
            [mutableRequest setHTTPMethod:@"PUT"];
            [mutableRequest addValue:@"application/json" forHTTPHeaderField:@"Accept"];
            [mutableRequest addValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];
            [mutableRequest addValue:@"PUT" forHTTPHeaderField:@"X-HTTP-Method-Override"];
            [mutableRequest addValue:sessionId forHTTPHeaderField:@"ZURMO_SESSION_ID"];
            [mutableRequest addValue:token forHTTPHeaderField:@"ZURMO_TOKEN"];
            [mutableRequest addValue:@"REST" forHTTPHeaderField:@"ZURMO_API_REQUEST_TYPE"];
            NSString *postLength = [NSString stringWithFormat:@"%d",[postdata3 length]];
            [mutableRequest addValue:postLength forHTTPHeaderField:@"Content-Length"];
            [mutableRequest setHTTPBody:postdata3]

这就是服务器端 (PHP) 使用 PUT、GET、POST 和 DELETE 处理 api 调用的方式。任何帮助将不胜感激谢谢

public static function createApiCall($url, $method, $headers, $data = array())
    {
        if ($method == 'PUT')
        {
            $headers[] = 'X-HTTP-Method-Override: PUT'; //also tried this one to add header
        }

        $handle = curl_init();
        curl_setopt($handle, CURLOPT_URL, $url);
        curl_setopt($handle, CURLOPT_HTTPHEADER, $headers);
        curl_setopt($handle, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($handle, CURLOPT_SSL_VERIFYHOST, false);
        curl_setopt($handle, CURLOPT_SSL_VERIFYPEER, false);

        switch($method)
        {
            case 'GET':
                break;
            case 'POST':
                curl_setopt($handle, CURLOPT_POST, true);
                curl_setopt($handle, CURLOPT_POSTFIELDS, http_build_query($data));
                break;
            case 'PUT':
                curl_setopt($handle, CURLOPT_CUSTOMREQUEST, 'PUT');
                curl_setopt($handle, CURLOPT_POSTFIELDS, http_build_query($data));
                break;
            case 'DELETE':
                curl_setopt($handle, CURLOPT_CUSTOMREQUEST, 'DELETE');
                break;
        }
        $response = curl_exec($handle);
        return $response;
    }
4

2 回答 2

1

不知道明确的错误很难说。

PUT 或DELETE 的使用通常由称为_method 的“隐藏参数”实现。它不仅特定于例如 Spring MVC 的标签库,而且还被其他一些客户端框架使用。Spring 只是遵循惯例,就像它一样。

为了正确使用它,您必须知道后端如何处理 PUT 或 DELETE 请求。

例如,在 spring 中,您需要定义一个过滤器(HiddenHttpMethodFilter,参见 javadoc),它将 _method 参数转换为 HttpServletRequest 中的“真实”HTTP 方法表示。这是作为过滤器完成的,以强调缺少 PUT 和 DELETE 是浏览器问题的事实 - servlet API 很好地支持它。

于 2012-12-05T20:35:42.280 回答
0

在第 5 行,尝试使用:

[mutableRequest setHTTPMethod:@"POST"];

由于您使用“x-http-method-override”HTTP 标头,我认为实际的 HTTP 请求应该是 POST。但正如上一个答案中所述,它实际上取决于 API 服务器中使用的后端框架。“x-http-method-override”在 PHP/Symfony 上运行良好。

于 2013-02-07T17:00:13.033 回答