如何在PHP中使用CURL执行PUT操作?

时间:2013-08-30 04:04:30

标签: php web-services rest curl put

我想使用CURL在Web服务上执行PUT操作。我们假设:

webservice url:http://stageapi.myprepaid.co.za/api/ConsumerRegisterRequest/cac52674-1711-e311-b4a8-00155d4905d3

自治市= NMBM sgc = 12345

我编写了下面的代码,但它输出了以下错误消息:“ExceptionMessage”:“对象引用未设置为对象的实例。”。任何帮助都会非常感激。谢谢!

<?php
function sendJSONRequest($url, $data)
{             
    $data_string = json_encode($data);
    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "PUT");
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);               
    curl_setopt($ch, CURLOPT_POSTFIELDS, $data_string);  
    curl_setopt($ch, CURLOPT_HTTPHEADER, array(                       
        'Content-Type: application/json',
        'Accept: application/json',
        'X-MP-Version: 10072013')                      
    );
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    ob_start();
    $result = curl_exec($ch);
    $info = curl_getinfo($ch);
    if ($result === false || $info['http_code'] == 400) {
      return $result;
    } else {
      return $result;
    }
    ob_end_clean();
    curl_close($ch);
}

$mun = $_GET['municipality'];
$sgc = $_GET['sgc'];
$req = $_GET['req']; //cac52674-1711-e311-b4a8-00155d4905d3

//myPrepaid PUT URL
echo $mpurl = "http://stageapi.myprepaid.co.za/api/ConsumerRegisterRequest/$req";

// Set Variables
$data = array("Municipality" => "$mun", "SGC" => "$sgc");

//Get Response
echo $response = sendJSONRequest($mpurl, $data);

?>

2 个答案:

答案 0 :(得分:0)

尝试:

curl_setopt($ch, CURLOPT_PUT, true);

答案 1 :(得分:0)

我复制了你的代码,但更改了它,因此它指向了我的localhost上的一个非常基本的HTTP服务器。您的代码工作正常,并提出以下请求:

PUT /api/ConsumerRegisterRequest/cac52674-1711-e311-b4a8-00155d4905d3 HTTP/1.1
Host: localhost:9420
Content-Type: application/json
Accept: application/json
X-MP-Version: 10072013
Content-Length: 37

{"Municipality":"NMBM","SGC":"12345"}

您收到的错误消息来自stageapi.myprepaid.co.za服务器。当我将它指回给他们时,这是完整的回应:

HTTP/1.1 500 Internal Server Error
Cache-Control: no-cache
Pragma: no-cache
Content-Type: application/json; charset=utf-8
Expires: -1
Server: Microsoft-IIS/8.0
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET
Date: Fri, 30 Aug 2013 04:30:41 GMT
Connection: close
Content-Length: 867

{"Message":"An error has occurred.","ExceptionMessage":"Object reference not set to an instance of an object.","ExceptionType":"System.NullReferenceException","StackTrace":"   at MyPrepaidApi.Controllers.ConsumerRegisterRequestController.Put(CrmRegisterRequest value) in c:\\Workspace\\MyPrepaid\\Prepaid Vending System\\PrepaidCloud\\WebApi\\Controllers\\ConsumerRegisterRequestController.cs:line 190\r\n   at lambda_method(Closure , Object , Object[] )\r\n   at System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ActionExecutor.<>c__DisplayClass13.<GetExecutor>b__c(Object instance, Object[] methodParameters)\r\n   at System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ActionExecutor.Execute(Object instance, Object[] arguments)\r\n   at System.Threading.Tasks.TaskHelpers.RunSynchronously[TResult](Func`1 func, CancellationToken cancellationToken)"}

您可能需要查看API以确保向他们传递正确的信息。如果你是,问题可能就在他们的最后。

虽然我发现这不是你问题的一部分而且还在开发中,但请记住清理$_GET中的任何数据。 :)