当前位置: 首页 > 知识库问答 >
问题:

PHP中protobuf响应中出现错误“意外的导线类型”

宋唯
2023-03-14

我正在向服务器执行POST请求,它会“正确”响应,但当尝试调用mergeFromString()函数时,我收到以下错误:

Google\PROTOBUF\内部\GPBDecodeException:解析过程中发生错误:意外的线型。在Google\PROTOBUF\内部\Message.php第353行

我在PHP中使用CURL:

$handle = curl_init($url);

$curl_options = [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_POST => true,
    CURLOPT_POSTFIELDS => $body,
    CURLOPT_HEADER => true,
    CURLOPT_VERBOSE => true
];

curl_setopt_array($handle, $curl_options);

$curlResponse = curl_exec($handle);

$responseMessage = new MyMessage();
$responseMessage->mergeFromString($curlResponse);

curl_close($handle);

var\u dump($curlResponse)的结果如下:

╔╔eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE2MjI1MTQwMTAsInVzZXJuYW1lIjoiNTM1MTAyODA2MCIsInZlcnNpb24iOiIyMTgwNiJ9.Li-bp3bIPdIrsRhuTWEWToS0ds62VCG-a2PCGaKSrigڲօ═"

在纯文本中,它应该如下所示:

1: 1
2: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE2MjI1MTQwMTAsInVzZXJuYW1lIjoiNTM1MTAyODA2MCIsInZlcnNpb24iOiIyMTgwNiJ9.Li-bp3bIPdIrsRhuTWEWToS0ds62VCG-a2PCGaKSrig
3: 1619765852

我的响应的原型文件如下:

message MyMessage{
    // I'm only interested in property 2
    string prop = 2;
}

环境:

"protobuf-php / protobuf": "^ 0.1.3",
"google / protobuf": "^ 3.16"

但是,使用Protoman(用于基于协议的消息的类似Postman的API客户端)的测试是成功的。我使用我在PHP中使用的相同原型文件进行了测试。

共有1个答案

有骏祥
2023-03-14

在这种情况下,错误是因为字符串无效
这是无效的,因为CURL返回的值(字符串)包括HTTP请求中的所有数据,例如:

HTTP/2 200 
content-type: application/x-protobuf
date: Wed, 02 Jun 2021 23:12:37 GMT
content-length: 172

╔╔eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE2MjI1MTQwMTAsInVzZXJuYW1lIjoiNTM1MTAyODA2MCIsInZlcnNpb24iOiIyMTgwNiJ9.Li-bp3bIPdIrsRhuTWEWToS0ds62VCG-a2PCGaKSrigڲօ═"

我没有注意到这一点,因为我认为这些细节是由于CURLOPT\u的冗长=

现在,如何从CURL返回的值中提取正文有点复杂,在这个问题中您将看到原因。

我的解决方案如下(我重复一遍,阅读我提到的问题,也许更简单的解决方案会适合你):

// I can't trust the Content-Length header (it may or may not be present).
// However, I can reliably calculate the length of the headers and use it instead.

$responseHeadersLength = 0;

$handle = curl_init($url);

$curl_options = [
    // ...
    CURLOPT_HEADERFUNCTION => function ($curl, $header) use (&$responseHeadersLength) {
            $len = strlen($header);
            $responseHeadersLength += $len;
            return $len;
    }
];

curl_setopt_array($handle, $curl_options);

$response = curl_exec($handle);

$body = trim(substr($response, $responseHeadersLength));
 类似资料:
  • 基本上,我正在youtube上做注册和登录教程。它使用的是旧版本的PHP,我试图更新代码,但出现以下错误: 分析错误:语法错误,在第23行的C:\Program Files(x86)\EasyPHP-DevServer-14.1VC11\data\localweb\projects\Forum\Forum\core\functions\users.php中出现意外“,” users.php

  • 我使用画布创建了这幅画,但在这样做之后,由于某种原因,我讨厌地在最左边的红色矩形之间出现一条黑线

  • 当我用php创建一个类时,我遇到了这个错误: 一个简单的例子: 我已经看过Reference-PHP中这个错误意味着什么?但这似乎不符合我的情况。所有其他现存问题的问题似乎都依赖于一个旧的PHP版本。但是我用的是PHP 5.6.3! 我能做什么?我只是失明吗?

  • 我在Heroku上托管了一个Springboot应用程序。构建和部署工作得非常好。然而,每当我想访问该方法时,我都会看到这个错误<代码>出现意外错误(类型=错误请求,状态=400) 如果我使用loclhost,但使用Heroku的应用程序时抛出错误,那么它在Postman上运行得非常好。 这是控制器的样子。我猜这就是问题的来源。 . 你认为我能做些什么让api在Heroku上工作?

  • 我正在使用Flash和PHP创建一个JPG。我让Flash和PHP在本地主机服务器上按预期工作。当我上传到服务器时,出现以下错误: 分析错误:语法错误,在/home/carlosrg/public\u html/mysubdomain/image中出现意外的“:”。php在线6 以及守则: 提前感谢您的时间。

  • 我正在尝试使用Spring Boot开发工具(Spring Remote),并将重新编译的文件自动上传到我的docker容器中。 我一直收到 这是我的docker文件: 这是我收到的错误: