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 のタグ ライブラリに固有であるだけでなく、他のいくつかのクライアント フレームワークでも使用されます。春はそのまま慣例に従っているだけです。

これを適切に使用するには、バックエンドが PUT または DELETE リクエストをどのように処理しているかを知る必要があります。

たとえば春には、_method パラメータを HttpServletRequest の「実際の」HTTP メソッド表現に変換するフィルタ (HiddenHttpMethodFilter、javadoc を参照) を定義する必要があります。これは、PUT と DELETE の欠如がブラウザーの問題であるという事実を強調するためのフィルターとして行われます。サーブレット 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 に答える