PHP cURL请求返回401,但与Postman一起使用

时间:2017-02-25 19:43:44

标签: php web-services curl postman

如果我使用Postman执行带有以下参数的Webservice调用:

Content-Type: application/json
Cookie: xxxx
Body: json

Webservice成功返回JSON。

所以,我用Postman生成代码并将其粘贴到PHP上:

<?php

$curl = curl_init();

curl_setopt_array($curl, array(
  CURLOPT_URL => "url",
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_ENCODING => "",
  CURLOPT_MAXREDIRS => 10,
  CURLOPT_TIMEOUT => 30,
  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  CURLOPT_CUSTOMREQUEST => "POST",
  CURLOPT_POSTFIELDS => "json",
  CURLOPT_HTTPHEADER => array(
    "cache-control: no-cache",
    "content-type: application/json",
    "cookie: xxxx",
    "postman-token: 7c771f8e-5c87-1d27-64f3-bdb92bba6a19"
  ),
));

$response = curl_exec($curl);
$err = curl_error($curl);

curl_close($curl);

if ($err) {
  echo "cURL Error #:" . $err;
} else {
  echo $response;
}

Webservice返回错误401.但是当我在Postman上执行它时,它正在工作。 我与Postman的不同之处是什么?

3 个答案:

答案 0 :(得分:1)

401错误代码通常是因为某些授权问题: -

  

401 Unauthorized

     

请求需要用户身份验证。响应必须包括一个   包含挑战的WWW-Authenticate头字段(第14.47节)   适用于所请求的资源。客户可以重复   请求具有合适的授权标头字段(第14.8节)。如果   请求已包含授权凭据,然后是401   回复表明授权已被拒绝   证书。如果401响应包含与之相同的挑战   先前的响应,用户代理已经尝试过   验证至少一次,然后用户应该出现   响应中给出的实体,因为该实体可能包含   相关诊断信息。 HTTP访问身份验证是   在&#34; HTTP身份验证:基本和摘要访问中进行了解释   认证&#34;

这意味着您在验证请求时遇到问题

通常会通过模拟网络请求

来解决

例如: -

假设您有一些页面需要登录才能访问它,

然后你将有两个你应该做的请求

1-发布一些登录验证数据 2-将第一个请求返回的cookie发送到第二个请求标题

您需要在php手册页

中的cURL中阅读有关cookie的更多信息

特别CURLOPT_COOKIEJAR , CURLOPT_COOKIEJAR and CURLOPT_COOKIE选项

答案 1 :(得分:0)

我有一个类似的问题。在邮递员中,它正在工作,但是通过卷曲它给出了 401 错误。

现在,它对我有用,下面的代码。我已经使用 base64_encode 作为用户名和密码。

手册参考:https://www.php.net/manual/en/function.curl-setopt.php

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,$url);
curl_setopt($ch, CURLOPT_TIMEOUT, 30); //timeout after 30 seconds
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_ANY);
curl_setopt($ch, CURLOPT_HTTPHEADER, [ "Authorization: Basic ".base64_encode($username.":".$password), ]);  
$result=curl_exec ($ch);
$status_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);   //get status code
echo "<br/>http status code is ".$status_code;

输出:

http status code is 200

答案 2 :(得分:0)

从您的 .htaccess 中删除以下行:

SetEnvIf Authorization .+ HTTP_AUTHORIZATION=$0

它对我有用!

相关问题