【问题标题】:Posting a file to a web service with Guzzle使用 Guzzle 将文件发布到 Web 服务
【发布时间】:2013-09-17 09:32:04
【问题描述】:

我已经尝试了几个小时来发出发送文件的 POST 请求。

首先尝试了一个带有流上下文的简单file_get_contents(),似乎不起作用。当不同 URL 上的 GET 有效时,我永远不会收到回复。

我在网上搜索了一个 HTTP 客户端,发现 Guzzle 在 Packagist 上下载了 40 万次;我决定尝试这项技术。有据可查,但可惜的是,在发布那个该死的文件时也会出错。

$request = $client
    ->post('/files/')
    ->addPostFields(array('comments' => 'no value'))
    ->addPostFile('file', 'test.doc')
    ->setAuth($this->username, $this->password);

我花了几个小时阅读和搜索网络才发现我遇到了“417 预期失败”问题。

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>417 Expectation Failed</title>
</head><body>
<h1>Expectation Failed</h1>
<p>The expectation given in the Expect request-header
field could not be met by this server.
The client sent<pre>
    Expect: 100-Continue, 100-Continue
</pre>
</p><p>Only the 100-continue expectation is supported.</p>
</body></html>

在网上进行了更多搜索后,我最终阅读了 Guzzle 自动发送的“Expect: 100-continue”标头,因此我尝试了:

$request->removeHeader('expect');

我现在收到了一个错误的请求:

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>400 Bad Request</title>
</head><body>
<h1>Bad Request</h1>
<p>Your browser sent a request that this server could not understand.<br />
Request header field is missing ':' separator.<br />
<pre>
zzle/3.7.3 curl/7.15.5 PHP/5.3.27</pre>
</p>
</body></html>

打印请求标头以发现:丢失,我得到:

var_dump($request->__toString());

POST /files/ HTTP/1.1
Host: nunc57.qc.bell.ca
User-Agent: Guzzle/3.7.3 curl/7.15.5 PHP/5.3.27
Content-Type: multipart/form-data
Authorization: Basic bm92YTpzeW5hcHNl

现在我真的很难过,我希望有人已经找到了解决这个问题的方法。我真的厌倦了这一切:(

【问题讨论】:

  • 您可以使用网络浏览器发布到目标 URL 吗?如果是这样,请尝试使用浏览器的工具来查看提供了哪些标头。另外,发到/files/ 看起来有点奇怪,你确定最后没有什么东西吗?或者,应该是/files 没有斜杠吗?最后,用 PHP 在本地构建一个简单的文件上传系统进行测试——你可能会发现你遇到问题的服务器对某些事情特别挑剔;知道您的 Guzzle 系统可以与普通文件上传页面配合使用会很有帮助!
  • 您访问的服务端点可能不合规,或者您可能发现了错误。尝试使用像 wiztools's 这样的 REST 客户端,看看是否可以让请求以这种方式工作。
  • 哦,该服务有效,我从头开始完全构建它,并且 html 部分工作正常,即使使用 application/json 或 vnd.xxx.yyy.type+xml 的 get 部分也有效,只有帖子似乎不起作用。我将尝试@halfer 关于删除尾部斜杠的解决方案,我将再次查看我的 chrome 开发工具,了解当我使用 html 界面手动发布时发生了什么
  • 哦,好吧,我必须做不同的更改才能实现完美的功能,但这更多是因为我没有正确地做事,主要的解决方法是简单地删除尾部斜杠@halfer所以请写一个快速回答,这样我就可以将其标记为好人

标签: php curl file-get-contents guzzle


【解决方案1】:

我想知道发布到/files/(带有斜杠)是否会导致问题。也许这会强制进行内部重定向并让 Goutte 不安,而不是网络浏览器?我会尝试调整您的页面,以便您发布到 /files/files/something

如果您可以使用网络浏览器 POST 到目标 URL,我还建议您使用浏览器工具记录请求标头,并查看是否有任何标头可以添加到您的 Guzzle 请求中。

【讨论】:

    猜你喜欢
    • 2010-12-21
    • 1970-01-01
    • 2015-07-28
    • 1970-01-01
    • 1970-01-01
    • 2011-01-19
    • 1970-01-01
    • 2013-07-02
    • 2017-09-25
    相关资源
    最近更新 更多