API调用在浏览器中工作,但报告(不正确?)通过PHP curl调用时重定向


API call works in browser, but reports (incorrect?) redirect when called via PHP curl

我必须构建一个脚本,将我们从合作伙伴公司的API获得的JSON转换为当前软件可以读取的Xml文件,而无需进行太多更改。听起来很简单,API也相对简单——只是当我调用它时,我似乎无法得到结果,即使完全相同的调用在浏览器中工作。

当我在浏览器中调用API函数时,我得到一个漂亮的小JSON对象作为返回,但是当我尝试在PHP脚本中通过curl调用完全相同的URL时,我只得到一个302 -移动响应。奇怪的是,据我所知,重定向并不发生在浏览器中,如果我跟随它,它也不包含任何内容(但它确实属于另一家公司)。

我开始怀疑这和授权有关。虽然我已经检查和反复检查了用户名和密码大约一百万次,但我注意到,如果我故意使用错误的用户名/密码组合,我会得到相同的结果。我注意到的另一些事情:

  • IE 9可以正常接受登录
  • Firefox在接受密码并显示JSON结果之前通常会询问两到三次密码
  • Opera以及Chrome根本不接受登录。这绝对不是打字错误-我正在复制和粘贴工作密码。

现在,我正试图与另一家公司的技术人员联系,讨论这个问题,但我开始认为这可能是一个更普遍的问题,其他人可能也会遇到,所以我决定把这个问题贴在这里。下面是我的脚本节选。我现在几乎可以肯定,我正在做一些愚蠢的事情(或者愚蠢地没有做我应该做的事情),如果我能在互联网上匿名地让自己难堪,而不是在现实生活中的技术人员面前让自己难堪,那就太好了。

编辑:在我的脚本中更改主机。

<>之前函数curl_download($url, $username, $password){$http_headers = array(主持人:www.myapidomain.com,用户代理:Mozilla/5.0 (Windows NT 6.1;WOW64;rv:6.0.2)壁虎/20100101 Firefox/6.0.2',"接受:*/*",接收语言:en - us, en; q = 0.5","Accept-Charset: iso - 8859 - 1, utf - 8; q = 0.7 *; q = 0.7","连接:维生");$ch = curl_init();curl_setopt($ch, CURLOPT_HTTPHEADER, $http_headers);curl_setopt($ch, CURLOPT_URL, $url);curl_setopt($ch, CURLOPT_HEADER, 0);curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);//curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);有和没有那个都试过了curl_setopt($ch, CURLOPT_TIMEOUT, 10);curl_setopt($ch, CURLOPT_USERPWD, "$username:$password");curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);$output = curl_exec($ch);curl_close (ch);返回输出美元;}$username = '#username';$password = '#password';$url = $api_details.$myID;//类似example.com/api/?id=1234//使用上下文和file_get_contents尝试了一次,但也没有成功//$context = stream_context_create(array)//'http' => array(//'header' => "Authorization: Basic "。base64_encode("用户名:密码美元")//)//));//$result = file_get_contents($url, false, $context);$result = curl_download($url, $username, $password);echo 'JSON: '.$result;//结果是"302找到-文档已移动到这里"。

编辑:好的,这是请求头:

(Request-Zeile) GET/api/?id = 100100 HTTP/1.1主机www.myapidomain.com用户代理Mozilla/5.0 (Windows NT 6.0;rv:21.0)壁虎/20100101 Firefox/21.0接受text/html, application/xhtml + xml, application/xml; q = 0.9 */*; q = 0.8接收语言de-de de; q = 0.8, en - us; q = 0.5, en; q = 0.3接受编码gzip, deflateDNT 1饼干MaD-Stats = 42 d1e7eb3c1dbcc59dd28e986ba9ceb3;5991 e5c00fce8acb72465bbca79260ecb = bc800030fa14aff2c5f726f1cfe3ffe7授权基本fzBob66lajgybiRqYTglbGE5p2FtdTqmQmCmYZk=连接维生cache - control信息= 0 之前

这里是响应头:

(Status-Zeile) HTTP/1.1 200 OK日期2013年6月13日星期四10:01:13 GMT服务器Apache/2.2.23 (FreeBSD) PHP/5.2.17 mod_ssl/2.2.23 OpenSSL/1.0.1cX-Powered-By PHP/5.2.17set - cookie MaD-Stats = 76 d1a7eb2c1dbacfcdd2e5986b39ceb3;expires=星期一,2013年12月16日10:01:14 GMT;路径=/内容长度602Keep-Alive timeout=5, max=100连接维生内容类型text/html 之前

Edit2:因此,为了回答Eugene的问题,我在curl请求中设置了正确的主机。现在我得到401响应,这就更合理了。我设置登录信息的方式有问题吗?

我现在觉得自己很蠢,原因有二:

  1. Eugene指出的错误,即我在header中使用了错误的主机。
  2. 然后我花了半天的时间弄清楚授权失败的原因,阅读了关于curl函数和其他东西的文档。现在我发现了错误:我的密码包含一个§符号,只是因为编码的原因才发送了错误的密码。我在我的密码周围加了一个utf8_decode,现在它就像魔法一样有效了。又一个谜团解开了。