WP_REMOTE_POST在正文中超过1024个字节时不起作用

时间:2018-04-21 作者:That Brazilian Guy

我需要的是,我正在使用第三方API(就本问题而言,哪种API无关紧要),需要向外部服务发送POST请求。

我想用wp_remote_post 为了实现我所需要的,但它在请求正文中可以发送的数据量似乎有限制。

我面临的问题只有在身体包含up to 1024 characters. 还有一个字符,请求(显然)没有发送。

调试我正在尝试使用ngrok 在以下位置收听帖子请求:$url, 和手动设置$body 作为字符串“bla bla bla(…)”。他们只有在$body 包含1024个或更少的字符。I don\'t get a 5xx error or any other error message. In fact, is_wp_error( $response ) returns false.

但是,如果我使用以下工具Postman 生成类似的POST请求outside WP ngrok的正文超过1024个字符,接收效果很好。


  • WP->小于1024字节的请求正文->ngrok=正常
  • WP->大于1024字节的请求正文->ngrok=
  • 邮递员->小于1024字节的请求正文->ngrok=OK
  • 邮递员->大于1024字节的请求正文->ngrok=OK
    • 我尝试的是从外部WordPress发送相同的请求,正文超过1024字节:有效official Docker image for WordPress

      file_uploads = On
      memory_limit = 64M
      upload_max_filesize = 64M
      post_max_size = 64M
      max_execution_time = 600
      
      代码

        $response = wp_remote_post( $url,
          array(
            \'timeout\' => 60,
            \'redirection\' => 5,
            \'blocking\' => true,
            \'headers\' => array(
              \'Content-Type\' => \'application/json\',
            ),
            \'body\' => \'bla bla (...)\' // fails if larger than 1024
          )
        );
      
        if ( is_wp_error( $response ) ) {
          $error_message = $response->get_error_message();
          echo "Something went wrong: $error_message";
        } else { echo "Request sent"; }
      

1 个回复
最合适的回答,由SO网友:Otto 整理而成

如果您碰巧使用了CURL传输,那么它有时在发送大于1024个字符的POST请求时会遇到一些小问题。更多信息请点击此处:

https://stackoverflow.com/questions/463144/php-http-post-fails-when-curl-data-1024

修复建议发送一个空的Expect:header。您可以通过修改代码来做到这一点:

$response = wp_remote_post( $url,
    array(
      \'timeout\' => 60,
      \'redirection\' => 5,
      \'blocking\' => true,
      \'headers\' => array(
        \'Content-Type\' => \'application/json\',
        \'Expect\' => \'\',
      ),
      \'body\' => \'bla bla (...)\' // fails if larger than 1024
    )
  );
编辑:更多信息:

某些版本的curl和PHP在正文中输入超过1024个字符时,会首先发送标题,然后发送“Expect:100 continue”标题。然后,接收到此消息的Web服务器应以100 Continue状态响应,以便客户端继续发送正文的其余部分。

如果您使用的是真正的Web服务器,那么它将发送该响应以接收消息的其余部分。一些较旧的Web服务器没有这样做,因此前面的问题中给出了解决方法。

我不知道ngrok是什么,但我敢打赌它的响应不像这里的普通Web服务器。如果服务器没有说要继续发布,curl就会等待它这样做。它最终会超时。

结束

相关推荐