2012-12-05 56 views
1

POST請求一切正常,但找不到使用PUT或DELETE的方法?REST NSMutableURLRequest with httpmethod 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)如何處理的API調用,使用PUT,GET,POST和DELETE。任何幫助,將不勝感激,謝謝

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; 
    } 

回答

1

不知道明確的錯誤很難說。

PUT或DELETE的使用通常由稱爲_method的「隱藏參數」實現。 它不僅僅是特定於Spring MVC的標籤庫,還被其他一些客戶端框架使用。春天只是遵循這個慣例,就像那樣。

爲了正確使用它,你必須知道你的後端是如何處理PUT或DELETE請求的。

例如在spring中,您需要定義一個過濾器(HiddenHttpMethodFilter,參見javadoc),它將_method參數變成HttpServletRequest中的「真實」HTTP方法表示形式。這是作爲一個過濾器來強調事實,缺乏PUT和DELETE是一個瀏覽器問題 - servlet API支持它就好了。

+0

我收到的迴應是這樣的:data =「」; errors =「」; message =「」; status = FAILURE; – tugce

+0

你能看看編輯嗎? – tugce

0

在第5行,則嘗試使用:

[mutableRequest setHTTPMethod:@ 「POST」];

由於您使用「x-http-method-override」HTTP標頭,我認爲實際的HTTP請求應該是POST。但正如前面的回答中所指出的那樣,它確實取決於API服務器中使用的後端框架。 「x-http-method-override」在PHP/Symfony中正常工作。