将数据 POST 到 XML 服务器时,尽管指定了内容长度,仍出现 Content-Length 错误

发布于 2024-11-04 16:27:51 字数 1651 浏览 0 评论 0原文

我有一个非常奇怪的错误。我正在尝试使用以下代码将数据 POST 到 XML 数据:

`$url = "http://www.example.appspot.com/clients";

$post_string = "<客户>

ABCDE <名字>

<

公司> <

电话>< /电话>

电子邮件

>

/

<

< 地址线2>

gt;&

lt;/县><

/

邮政编码>

;

$header = "POST HTTP/1.0 \r\n";
$header .= "内容类型:text/xml \r\n";
$header .=“内容长度:”。 strlen($post_string)." \r\n";
$header .= "内容传输编码:文本 \r\n";
$header .= "连接: 关闭\r\n\r\n";
$header .=“内容长度:”。 strlen($post_string)." \r\n";
$header .= $post_string;

$ch =curl_init();
curl_setopt($ch, CURLOPT_URL,$url);

curl_setopt($ch, CURLOPT_USERPWD, "用户名:密码");
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $header);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_TIMEOUT, 4); `

但这会返回此错误:

需要长度 POST 请求需要 Content-length 标头。

(来自curl_exec($ch))

这是打印出来的标头数据(print $header):

POST HTTP/1.0 Content-type: text/xml Content-length: 381 <客户> < id>< /id> <姓氏>ABCDE< /姓氏> <名字>< /名字> <公司>< /公司> <电话>< /电话> <移动>< /移动> <传真>< /传真> <网站>< /网站> <电子邮件>< /电子邮件> <地址行1>< /地址行1> <地址行2>< /地址行2> <地址行3>< /地址行3> <镇>< /城镇> <县>< /县> <邮政编码>< /邮政编码> < /客户端>

想知道如何解决这个问题,我已经明确指定了内容长度标头?!还有其他人有这个问题吗?你是怎么解决的?

I have a really strange error. I'm trying to POST data to an XML data using the following code:

`$url = "http://www.example.appspot.com/clients";

$post_string = "< client>

< id>< /id>

< lastName>ABCDE< /lastName>

< firstName>< /firstName>

< company>< /company>

< telephone>< /telephone>

< mobile>< /mobile>

< fax>< /fax>

< website>< /website>

< email>< /email>

< addressLine1>< /addressLine1>

< addressLine2>< /addressLine2>

< addressLine3>< /addressLine3>

< town>< /town>

< county>< /county>

< postcode>< /postcode>

< /client>";

$header = "POST HTTP/1.0 \r\n";
$header .= "Content-type: text/xml \r\n";
$header .= "Content-length: ". strlen($post_string)." \r\n";
$header .= "Content-transfer-encoding: text \r\n";
$header .= "Connection: close \r\n\r\n";
$header .= "Content-length: ". strlen($post_string)." \r\n";
$header .= $post_string;

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,$url);

curl_setopt($ch, CURLOPT_USERPWD, "username:password");
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $header);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_TIMEOUT, 4); `

But this returns this error:

Length Required
POST requests require a Content-length header.

(which is from curl_exec($ch))

And this the header data printed out (print $header):

POST HTTP/1.0 Content-type: text/xml Content-length: 381 < client> < id>< /id> < lastName>ABCDE< /lastName> < firstName>< /firstName> < company>< /company> < telephone>< /telephone> < mobile>< /mobile> < fax>< /fax> < website>< /website> < email>< /email> < addressLine1>< /addressLine1> < addressLine2>< /addressLine2> < addressLine3>< /addressLine3> < town>< /town> < county>< /county> < postcode>< /postcode> < /client>

Wondering how to solve this problem I've clearly specified the content length header?! Does anyone else have this problem? How did you solve it?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

写给空气的情书 2024-11-11 16:27:51

来自手册引用CURLOPT_CUSTOMREQUEST...

执行 HTTP 请求时使用的自定义请求方法,而不是“GET”或“HEAD”。这对于执行“DELETE”或其他更模糊的 HTTP 请求很有用。有效值包括“GET”、“POST”、“CONNECT”等;即不要在此处输入整个 HTTP 请求行。例如,输入“GET /index.html HTTP/1.0\r\n\r\n”将是不正确的。

因此,CURLOPT_CUSTOMREQUEST 选项应仅设置为"POST"

我认为您可能想将该 $header 字符串转换为与 CURLOPT_HTTPHEADER 选项配对的标头数组,但不包含顶部的 POST 标题。并且,也不要在标头中包含 $post_string - 它属于请求正文。

From the manual referencing CURLOPT_CUSTOMREQUEST...

A custom request method to use instead of "GET" or "HEAD" when doing a HTTP request. This is useful for doing "DELETE" or other, more obscure HTTP requests. Valid values are things like "GET", "POST", "CONNECT" and so on; i.e. Do not enter a whole HTTP request line here. For instance, entering "GET /index.html HTTP/1.0\r\n\r\n" would be incorrect.

So, CURLOPT_CUSTOMREQUEST option should be set only to "POST".

I think you may want to instead convert that $header string to an array of headers pared with the CURLOPT_HTTPHEADER option, but do not include the top POST header. And, do not include the $post_string in the headers either - that belongs in the request body.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文