如何从需要身份验证的php向RESTFul webservice发出请求

时间:2014-03-26 11:38:13

标签: php json http rest curl

请帮我解决这个问题。 我正在使用web服务,我希望将json数据作为响应。

我的php文件中有以下代码:

$cURL = curl_init();
$url='http://localhost:8080/axelor-app/ws/rest/resourcepath/2';
$data=array('data'=>'{
    "offset": 0,
    "limit": 20,
    "data": {
        "_domain": "self.product LIKE :product",
        "_domainContext": { "product": 1}
    }
}');

curl_setopt($cURL, CURLOPT_URL, $url);
curl_setopt($cURL, CURLOPT_POST, 1);
curl_setopt($cURL,CURLOPT_POSTFIELDS ,$data);
curl_setopt($cURL,CURLOPT_RETURNTRANSFER, TRUE);

curl_setopt($cURL, CURLOPT_HTTPHEADER, array(
    'Content-type: application/json',
    'Accept: application/json'
));

$result1 = curl_exec($cURL);

print_r($result1);
print_r(curl_getinfo($cURL));

curl_close($cURL);

我输出为:

Array
(
    [url] => `http://localhost:8080/axelor-app/ws/rest/resourcepath/2`
    [content_type] => 
    [http_code] => 302
    [header_size] => 270
    [request_size] => 257
    [filetime] => -1
    [ssl_verify_result] => 0
    [redirect_count] => 0
    [total_time] => 0.001812
    [namelookup_time] => 7.0E-5
    [connect_time] => 0.000118
    [pretransfer_time] => 0.00012
    [size_upload] => 287
    [size_download] => 0
    [speed_download] => 0
    [speed_upload] => 158388
    [download_content_length] => 0
    [upload_content_length] => 287
    [starttransfer_time] => 0.000916
    [redirect_time] => 0
    [redirect_url] => `http://localhost:8080/axelor-app/login.jsp`
    [primary_ip] => 127.0.0.1
    [certinfo] => Array
        (
        )

    [primary_port] => 8080
    [local_ip] => 127.0.0.1
    [local_port] => 57616

我收到302代码并重定向到登录页面。 如何从这个请求中获取我的json数据?

过去4天我被困住了。请帮我。 有没有办法使用相同的上下文发出多个请求? 是否有像PHP的HttpContext(在java中)类似的东西?

3 个答案:

答案 0 :(得分:1)

根据服务器的身份验证策略,您必须有一种方法可以在请求中传递用户名和密码或临时身份验证令牌。

这样服务器就会根据您的意愿登录并处理您的请求。

检查服务器文档,了解如何获取安全令牌或如何传递您的用户名并传递请求

答案 1 :(得分:1)

curl_setopt($cURL, CURLOPT_HTTPHEADER选项中添加以下内容:

'Authorization: Basic '. base64_encode("user:password")

此处userpassword是您需要进行身份验证的凭据。

您也可以交替使用CURLOPT_USERPWD选项。

curl_setopt($cURL, CURLOPT_USERPWD, "user:password");

答案 2 :(得分:0)

如果你正在使用Json ......那就不应该如何构建你的数组......

你可以这样做:

$data = json_decode('
    data: {
      "offset": 0,
      "limit": 20,
      "data": {
        "_domain": "self.product LIKE :product",
        "_domainContext": { "product": 1}
      }
    }');

然后您将$ data作为array类型。

或者你可以拥有类似的东西:

$data = [
  "data" => [
    "offset" => 0,
    "limit" => 20,
    "data" => [
      "_domain" => "self.product LIKE :product",
      "_domainContext": [
        "product": 1
      ]
    ]
  ]
];

然后使用json_encode()

将数组编码为json