1

如果我使用 Firefox 并访问http://svcs.ebay.com/services/search/FindingService/v1我会得到某种 XML 响应,当我通过 PHP 这样做时,我会得到内部服务器错误 500

$ php -r 'print_r(simplexml_load_file("http://svcs.ebay.com/services/search/FindingService/v1"));'
PHP 警告:simplexml_load_file(http://svcs.ebay.com/services/search/FindingService/v1):打开流失败:HTTP 请求失败!HTTP/1.1 500 内部服务器错误
 在第 1 行的命令行代码中
PHP堆栈跟踪:
PHP 1. {main}() 命令行代码:0
PHP 2. simplexml_load_file() 命令行代码:1
PHP 警告:simplexml_load_file():I/O 警告:未能在第 1 行的命令行代码中加载外部实体“http://svcs.ebay.com/services/search/FindingService/v1”
PHP堆栈跟踪:
PHP 1. {main}() 命令行代码:0
PHP 2. simplexml_load_file() 命令行代码:1
$
4

6 回答 6

3

当我在 firefox 中访问 http://svcs.ebay.com/services/search/FindingService/v1时,firebug 报告 HTTP 响应代码确实是 500。(即使它在请求正文中发送了一些 XML)

您以错误的方式调用 Web 服务。

是的,您返回了 XML,但响应代码是 500,这意味着您的 URL 错误。

通过 url 包装器调用 ximlexml_load_file 需要一个成功代码。

也就是说,无论如何您都可能获得数据。也许。

但是您应该弄清楚服务希望您如何查询。

于 2009-09-17T03:50:36.653 回答
1

如果您希望能够读取 500 个请求数据,请使用 curl

<?php
// create a new cURL resource
$ch = curl_init();

// set URL and other appropriate options
curl_setopt($ch, CURLOPT_URL, "http://svcs.ebay.com/services/search/FindingService/v1");
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

// grab URL and pass it to the browser
$xml = curl_exec($ch);
$simpleXml = simplexml_load_string($xml);
// close cURL resource, and free up system resources
curl_close($ch);
?>
于 2009-09-17T04:03:23.460 回答
1

当我去那个网站时,我得到:

<ms:errorMessage>
−
<error>
<errorId>2038</errorId>
<domain>SOA</domain>
<severity>Error</severity>
<category>System</category>
<message>Missing SOA operation name header</message>
</error>
</ms:errorMessage>

因此,该 URL 似乎指向 Web 服务,并且可能需要某种身份验证或至少在请求标头中输入数据。根据 Wikipedia 的说法,HTTP 响应 500 是一个通用错误,这意味着服务器无法指定问题但知道存在问题。这是那篇文章最好的部分:

以数字“5”开头的响应状态代码表示服务器知道它遇到错误或无法执行请求的情况。除了响应 HEAD 请求时,服务器应该包含一个实体,其中包含对错误情况的解释,并指出它是暂时的还是永久的。

所有这些结合起来,我不得不说你的问题是你试图从远程服务器获取文件,使用的方法假设你对该文件有一些目录级访问权限,并且服务器响应“嗯,什么?”

如果您想像在 Firefox 中一样获得实际的 XML 错误,请使用 cURL:

$ebay_url = "http://svcs.ebay.com/services/search/FindingService/v1";
$ebay_page = curl_init();

curl_setopt($ebay_page, CURLOPT_RETURNTRANSFER, true); //output to string.
curl_setopt($ebay_page, CURLOPT_URL, $ebay_url); //set the url for the request.

$ebay_response = curl_exec($ebay_page);

print_r(simplexml_load_string($ebay_response));

如果您想真正获得更有意义的东西,我会查看 PHP 的SoapClient 方法实际的 ebay Web 服务文档

于 2009-09-17T04:10:57.767 回答
0

需要设置 http 标头以指定要执行的操作。如果您阅读了如何使用查找 API 进行调用,文章中提到了需要设置的以下 http 标头:

X-EBAY-SOA-SERVICE-NAME: FindingService
X-EBAY-SOA-OPERATION-NAME: findItemsAdvanced <-- whatever call you are making
X-EBAY-SOA-SERVICE-VERSION: 1.0.0
X-EBAY-SOA-GLOBAL-ID: EBAY-US
X-EBAY-SOA-SECURITY-APPNAME: MyAppID
X-EBAY-SOA-REQUEST-DATA-FORMAT: XML
X-EBAY-SOA-MESSAGE-PROTOCOL: XML

设置好这些后,您的通话应该可以正常工作。

于 2009-09-19T21:50:16.487 回答
0

也许您想尝试以下 URL。当我这样做时,我会返回 XML 和 200 响应。

http://svcs.ebay.com/services/search/FindingService/v1?wsdl

于 2009-09-20T05:28:51.630 回答
0

您需要重新安装 php(假设您已经安装了 apache2)。使用这些命令:

1)sudo apt update && apt upgrade

2)sudo apt install php-pear php-fpm php-dev php-zip php-curl php-xmlrpc php-gd php-mysql php-mbstring php-xml libapache2-mod-php

3)sudo service apache2 restart

于 2019-07-16T06:03:30.887 回答