首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >图片图片- Laravel 404异常

图片图片- Laravel 404异常
EN

Stack Overflow用户
提问于 2022-02-11 13:44:15
回答 3查看 352关注 0票数 0

我正在建立一个使用MS认证的网站。正如你在下面看到的,我想登录并获取我自己的数据,以及我的管理人员,这是好的工作,但问题开始时,我想选择的照片。

代码语言:javascript
复制
$graph = new Graph();
$graph->setAccessToken($accessToken->getToken());
      
$user = $graph->createRequest('GET', '/me?$expand=manager($levels=1;$select=displayName,givenName,surname,mail)&$select=displayName,givenName,surname,mail&$count=true')    
   ->addHeaders(array("Content-Type" => "application/json"))
   ->setReturnType(Model\User::class)
   ->execute();
    
$photo = $graph->createRequest('GET', '/me/photo/$value')
   ->addHeaders(array("Content-Type" => "image/jpeg"))
   ->execute();
          
$photo = $photo->getRawBody();
$avatar = 'data:image/jpeg;base64,'.base64_encode($photo).'';

当用户没有配置文件照片集时,它将返回一个404 not ,这是可以的,但是如果没有照片,我不希望我的脚本停止。我想要的是这样的:

代码语言:javascript
复制
if($photo->getStatus(404)){
     $avatar = null;
}
else{
     $photo = $photo->getRawBody();
     $avatar = 'data:image/jpeg;base64,'.base64_encode($photo).'';
}     

如果没有照片,我希望将$avatar设置为null,而不是获得以下错误:

提前感谢!

全功能

代码语言:javascript
复制
public function callback(Request $request)
  {
    // Validate state
    $expectedState = session('oauthState');
    $request->session()->forget('oauthState');
    $providedState = $request->query('state');

    if (!isset($expectedState)) {
      // If there is no expected state in the session,
      // do nothing and redirect to the home page.
      return redirect('/');
    }

    if (!isset($providedState) || $expectedState != $providedState) {
      return redirect('/')
        ->with('error', 'Invalid auth state')
        ->with('errorDetail', 'The provided auth state did not match the expected value');
    }

    // Authorization code should be in the "code" query param
    $authCode = $request->query('code');
    if (isset($authCode)) {
      // Initialize the OAuth client
      $oauthClient = new \League\OAuth2\Client\Provider\GenericProvider([
        'clientId'                => config('azure.appId'),
        'clientSecret'            => config('azure.appSecret'),
        'redirectUri'             => config('azure.redirectUri'),
        'urlAuthorize'            => config('azure.authority').config('azure.authorizeEndpoint'),
        'urlAccessToken'          => config('azure.authority').config('azure.tokenEndpoint'),
        'urlResourceOwnerDetails' => '',
        'scopes'                  => config('azure.scopes')
      ]);

      try {
        // Make the token request
        $accessToken = $oauthClient->getAccessToken('authorization_code', [
          'code' => $authCode
        ]);

        $graph = new Graph();
        $graph->setAccessToken($accessToken->getToken());
      
        $user = $graph->createRequest('GET', '/me?$expand=manager($levels=1;$select=displayName,givenName,surname,mail)&$select=displayName,givenName,surname,mail&$count=true')    
          ->addHeaders(array("Content-Type" => "application/json"))
          ->setReturnType(Model\User::class)
          ->execute();
    
        $photo = $graph->createRequest('GET', '/me/photo/$value')
          ->addHeaders(array("Content-Type" => "image/jpeg"))
          ->execute();
          $photo = $photo->getRawBody();
          $avatar = 'data:image/jpeg;base64,'.base64_encode($photo).'';

        $manager = $user->getManager();

        $tokenCache = new TokenCache();
        $tokenCache->storeTokens($accessToken, $user, $manager, $avatar);     
        
        // Define user details and manager details
        $userFirstName = $user->getGivenName();
        $userSurname = $user->getSurname();
        $userEmail = $user->getMail();
  
        $managerFirstName = $manager->getGivenName();
        $managerSurname = $manager->getSurname();
        $managerEmail = $manager->getMail();

        return redirect('/');
      }
      catch (Exception $e) {
        $avatar = null;
        return redirect('/')
          ->with('error', 'Error requesting access token')
          ->with('errorDetail', json_encode($e->getResponseBody()));
      }
    }

    return redirect('/')
      ->with('error', $request->query('error'))
      ->with('errorDetail', $request->query('error_description'));
  }
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2022-02-11 17:25:32

尝试捕获确切的异常,错误是404状态代码的客户端异常,尝试直接捕获它并捕获它的响应。另外,我从未听说过函数$e->getResponseBody(),它应该是$e->getResponse(),就像口香糖文档中给出的那样。您可以从this answer获得更多参考

代码语言:javascript
复制
public function callback(Request $request)
  {
    // Validate state
    // ...

    
    // Initialize the OAuth client
      try {
        // Make the token request
        // ...
        // Define user details and manager details
        // ...
        
      }
      catch(\GuzzleHttp\Exception\ClientException $e){
            if($e->hasResponse()){
               if ($e->getResponse()->getStatusCode() == '404'){
                    $avatar = null;
                    return redirect('/')
                      ->with('error', 'Error requesting access token')
                      ->with('errorDetail', json_encode($e->getResponse()));
               }
            }
      }
      catch (Exception $e) {
        $avatar = null;
        return redirect('/')
          ->with('error', 'Error requesting access token')
          ->with('errorDetail', json_encode($e->getResponseBody()));
      }
    }

    return redirect('/')
      ->with('error', $request->query('error'))
      ->with('errorDetail', $request->query('error_description'));
  }
票数 2
EN

Stack Overflow用户

发布于 2022-02-11 13:54:29

我不太熟悉微软的图形api,但是一个基本的PHP试抓块在这里应该能做到这一点。

https://www.php.net/manual/en/language.exceptions.php

尝试获取图像->,以防出现异常,将$avatar设置为null

票数 1
EN

Stack Overflow用户

发布于 2022-02-11 13:58:34

请使用try/catch块。这样做的目的是在您的终端处理错误,而不是服务器为您处理这些错误。

另外,我注意到'/me/photo/$value',这并不能正确地替换使用单引号的$value。请在这里使用双引号"/me/photo/$value"

代码语言:javascript
复制
use Exception; //import right after namespace    
try {
    $photo = $graph->createRequest('GET', '/me/photo/$value')
       ->addHeaders(array("Content-Type" => "image/jpeg"))
       ->execute();
    $photo = $photo->getRawBody();
    $avatar = 'data:image/jpeg;base64,'.base64_encode($photo).'';
} catch (Exception $e) {
    //in-case of error
    $avatar = null;
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71081110

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档