【问题标题】:Http Request doesn't catch all errorsHttp 请求没有捕获所有错误
【发布时间】:2021-07-28 06:52:17
【问题描述】:

我目前正在 symfony 中进行一个项目,我的数据库中存储了很多链接。只需按一下按钮,我想通过 http 请求验证所有链接。

到目前为止,我在大多数情况下都可以正常工作:

我有一个发送请求并返回状态码的服务

    public function validateUrl($query) 
    {
        $response = $this->client->request(
            'GET',
            $query
        );

        $statusCode = $response->getStatusCode();

        return $statusCode;
    }

在调用服务的验证函数中我有这个

public function validateAll(UrlValidatorService $urlValidatorService)
    {
        $request = Request::createFromGlobals();
        $referrer = $request->query->get('referrer');

        $repository = $this->getDoctrine()->getRepository(Url::class);
        $longUrls = $repository->findBy([], ['id' => 'ASC']);
        
        foreach($longUrls as $urlEntity)
        {
            $url = $urlEntity->getLongUrl();
            $statusCode = $urlValidatorService->validateUrl($url);
            $datestring = date('Y-m-d H:i:s');

            if($statusCode == 200) 
            {
                $urlEntity->setValidStatus('valid');
                $urlEntity->setValidDate(new \DateTime($datestring));
            }

            if($statusCode >= 300)
            {
                $urlEntity->setValidStatus('invalid');
                $urlEntity->setValidDate(new \DateTime($datestring));
            }

            $entityManager = $this->getDoctrine()->getManager();
            $entityManager->persist($urlEntity);
            $entityManager->flush(); 
        }

        return $this->redirect($referrer);
    }

正如我所说,这在大多数情况下都有效,但是由于某种原因,它没有捕获一些错误,我不知道如何解决它。任何帮助表示赞赏

无法捕获的错误示例: Example Error

【问题讨论】:

  • 请看这里是否有帮助:stackoverflow.com/questions/58288142/….
  • 在这种特殊情况下的主机名似乎无法在 DNS 中解析,mxtoolbox.com/…
  • @CBroe 是的,我知道。也许我应该澄清一下。我正在使用的工具检查请求发回的状态代码,然后在数据库中设置检查链接是否有效的日期,并且它还放置状态(有效/无效)。问题出在那个链接上,即使它应该是无效的,它也会抛出一个 smfony 异常而不是将其设置为无效
  • 那是因为错误发生了,甚至在它到达您检查状态代码的部分之前。请求无法从一开始就发出,所以您现在希望状态码从哪里来……?您首先需要去捕获异常。当你抓到一个时,让你的 validateUrl 方法返回 null 或 false - 这可以与方法之外的实际状态代码区分开来。
  • @LBA no 即使我执行 getContent(false) 它仍然会抛出错误,即使解决方案的解释似乎正是我所需要的

标签: php symfony get httprequest


【解决方案1】:

好的,我想通了。尽管https://github.com/symfony/symfony/issues/34281 声明捕获错误不起作用,因为响应很懒,但我还是能够像这样捕获它们:

    public function validateUrl($query) 
    {
        try{
            $response = $this->client->request('GET', $query, ['timeout' => 5]);

            $response->getContent(false);
            $statusCode = $response->getStatusCode();
        }
        catch (HttpExceptionInterface $e) {    
            $statusCode = '404';
        }
        // Exceptions like Timeout
        catch (TransportExceptionInterface $e) {
            $statusCode = '404';
        }
        
        return $statusCode;
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多