您的位置:澳门新葡萄京娱乐网站 > 编程知识 > PHP使Laravel为JSON REST API重回自定义错误的题目_p

PHP使Laravel为JSON REST API重回自定义错误的题目_p

2019-12-22 01:29

这将将401和404的所有错误转换为自定义json错误,而不是Whoops stacktrace.加这个:

if (response.ok) {
  return json;
} else {
  throw new Error(json.error);
}
class UserController
{
    public function show($id)
    {
        return User::findOrFail($id);
    }
}

以上所述是小编给大家介绍的PHP使Laravel为JSON REST API返回自定义错误的解决方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

所以很简单直接通过 response code 区分出来就行了 : if (response.status >= 200 && response.code < 300)。 fetch 的 Response 对象的 ok 属性就是干这个事情的

Morphing And Morphed Events   

 在发送一个响应之前,它会改变它,在发送。这个过程包括运行所有转换器(Transformer)以及通过配置的响应格式发送响应。如果你需要对响应的变化有更多的控制,你可以使用 ResponseWasMorphed 和 ResponseIsMorphing 这两个事件.

在你的app/Listeners文件夹,创建一个监听器。

use DingoApiEventResponseWasMorphed;

class AddPaginationLinksToResponse
{
    public function handle(ResponseWasMorphed $event)
    {
        if (isset($event->content['meta']['pagination'])) {
            $links = $event->content['meta']['pagination']['links'];

            $event->response->headers->set(
                'link',
                sprintf('<%s>; rel="next", <%s>; rel="prev"', $links['links']['next'], $links['links']['previous'])
            );
        }
    }
}

 然后通过在EventServiceProvider中注册事件及其对应监听器来监听该事件:

protected $listen = [
    'DingoApiEventResponseWasMorphed' => [
        'AppListenersAddPaginationLinksToResponse'
    ]
];                                                                                                                                                      

 Now all responses that contain pagination links will also add these links to the Link header.(这句话,留给你们翻译)

这章结束了,马上要2018年了。新的一年,go go go !!!

public static function error($code = 400, $message = null){ // check if $message is object and transforms it into an array if  { $message = $message->toArray { default: $code_message = 'error_occured'; break; } $data = array( 'code' => $code, 'message' => $code_message, 'data' => $message ); // return an error return Response::json;}

fetch 对所有的 response code 包括 200X 300X 400X 500X 等返回的都是 resolve 状态, 只有抛异常时才会走到 catch 里面, 所以我们希望把 非200X 请求作为 reject 状态区分出来, 在 REST API 中 300X 400X 500X 的状态码通常意外着错误,服务端通常还会返回一个 errorCode 和 errorMessage 来表示错误原因。

Setting Response Status Code    设置返回值状态

return $this->response->item($user, new UserTransformer)->setStatusCode(200);

    

总结

注意 response.json() 返回的也是一个 Promise 对象

Promise.all 可以组合多个 Promise ,只有所有的 promise 都 resolve 时其结果才会是 resolve, 只要有一个 reject 结果就是 reject 状态。 如果数组中元素不是 promise 对象会先转为 promise 对象。

注意在 catch 里面抛出异常, 这个 promise 就是 reject 状态, 在外面可以这样使用

getUsers() {
    return get('/api/users').then(json => {
      return json;
    }).catch(error=>{
      // 这里处理错误
    });
}

注意我们每次都返回了一个 Promise 对象 (fetch 本身返回的就是 Promise) 所以使用的时候可以级联写
我们调用 getUsers 的时候就可以这样写

getUsers.then(json => {
  // 处理数据
  return json;
}).catch(error=>{

});

每一个方法都返回 Promise 对象, 我们可以一层一层的根据自己的实际情况处理数据。

 

Array( [code] => 401 [message] => "Invalid User")

ok 时直接返回 json, 其它情况抛出异常, 所有的异常放到 catch 里面去处理, 抛异常时当前 promise 也是 reject 状态,我们应该把这个异常继续抛出这样外界调用时就可以用 catch 进行异常处理了。

因为某些某些原因,不能按时更新,唉。我会尽力,加快速度。(这句话不是翻译的哈)

有没有人知道是否可能,如果是,我该怎么做?

fetch 返回的是一个 Promise 对象, 每个 promise 对象最后会有 resolve 或 reject 两种状态, then 方法是 promise 对象的方法, then 方法返回的也是一个 promise 对象,所以 then 可以连着写。

class UserController
{
    public function index()
    {
        return User::all();
    }
}

问题是:我希望他用键“代码”和“消息”抛出一个json形成的数组,每个数组都包含上述数据.

这里我们用了 Promise.all([resp.ok, resp.status,resp.json()]) 把 ok status response.json() 都放到一个 then 里面去处理, 因为非 ok 时我们也要从 response.json() 中拿错误信息。

Response Builder  响应构建器

这个响应构建器,提供一个流畅的接口去简单的生成一个定制的响应信息。这个响应构建器通常与transformers结合使用。

要想在你的控制器,使用这个响应返回。你应该引入(使用) DingoApiRoutingHelpers。为了让你的全部控制器都可以用使用这个特性,你应该创建一个基类控制器,让你所有的控制器都去继承(extends)它。

use DingoApiRoutingHelpers;
use IlluminateRoutingController;

class BaseController extends Controller
{
    use Helpers;
}

 

现在,你的控制器能简单的继承基本控制器。在你的控制器中可以经由$response属性来访问响应构建器。

关于这,更详细的文档,你应该看Transformers那节。(接下来,我会慢慢翻译的,等。。)

制作API最好创建自己的帮助器,如Responser :: error,扩展了Response类.

get = (url) =>
  fetch(url, {
    method: 'GET',
  }).then(resp => Promise.all([resp.ok, resp.status,resp.json()])
  ).then(([ok, status, json]) => {
    if (ok) {
      return json;
    } else {
      this.handleError(status, json.error);
      throw new Error(json.error);
    }
  }).catch(error => {
    throw error;
  });

post = (url, body) => this._request(url, body, 'POST');

put = (url, body) => this._request(url, body, 'PUT');

_delete = (url, body) => this._request(url, body, 'DELETE');

_request = (url, body, method) =>
  fetch(url, {
    method: method,
    body: JSON.stringify(body)
  }).then(resp => {
    return Promise.all([resp.ok, resp.status, resp.json()]);
  }).then(([ok, status, json]) => {
    if (ok) {
      return json;
    } else {
      this.handleError(status, json.error);
      throw new Error(json.error);
    }
  }).catch(error => {
    throw error;
  });

Responding With No Content     无内容响应

return $this->response->noContent();

我正在开发某种RESTful API.发生一些错误时,我会抛出一个App :: abort错误.

在这个实例中,我们的User类继承了IlluminateDatabaseEloquentModel,意味着它能作为一个格式化的数组返回,所以我们能通过调用User::all(),简单的返回一个users集合。

这是处理此错误的众多选项之一.

同样的,你也能使用它返回一个单一的user。例:如下

去你的app / start / global.php.

Adding Additional Headers      添加附加的表头

一旦您使用了上述方法中的一个,您就可以通过添加附加的表头来进一步定制响应。

return $this->response->item($user, new UserTransformer)->withHeader('X-Foo', 'Bar');
App::error(function(Exception $exception, $code){ Log::error; $message = $exception->getMessage(); // switch statements provided in case you need to add // additional logic for specific error code. switch  { case 401: return Response::json(array( 'code' => 401, 'message' => $message ), 401); case 404: $message = (!$message ? $message = 'the requested resource was not found' : $message); return Response::json(array( 'code' => 404, 'message' => $message ), 404); }});

Custom Response Formats    自定义响应格式

在这个配置章节,我们简单的讲解了返回信息格式。通过这个dingo包,我们将自动的使用json格式,并设置一个恰当的Content-Type头。除了 JSON 格式化,还有一个 JSONP 格式化。这个 formatter 将会用一个回调包裹响应。更改格式只需要简单将配置文件(Laravel)或启动文件(Lumen)中的默认JSON格式替换成JSONP即可:

'formats' => [
    'json' => 'DingoApiHttpResponseFormatJsonp'
]

 或

DingoApiHttpResponse::addFormatter('json', new DingoApiHttpResponseFormatJsonp);

 你可以注册之后使用你自己需要的格式。你的格式应该继承 DingoApiHttpResponseFormatFormat。这有很多请求应该被定义:formatEloquentModel,formatEloquentCollection,formatArray和getContentType。

 

返回一个可使用的响应最简单的方式是直接从控制器返回数组或对象。不是每个对象都能够被返回正确的格式,但因此,你应该确定它继承了ArrayObject或者IlluminateSupportContractsArrayableInterface接口。

Responding With Created Response    创建了资源的响应

return $this->response->created();

你也可以,为这个created 随意的提供一个值,作为第一个参数。

return $this->response->created($location);  

A functioning API is built upon receiving requests and returning a consumable response to the client. An API will generally return responses in an easy to consume format such as JSON. There's a number of different ways to return responses and it will largely depend on how complex your API is or will become.

Adding Meta Data   添加元数据

某些转化层可能会使用元数据(meta data)。当你需要提供与资源相关的额外数据时,这很有用。

return $this->response->item($user, new UserTransformer)->addMeta('foo', 'bar');

你也可以设置一个 meta 数据的数组,省得多次调用 addMeta 方法。

return $this->response->item($user, new UserTransformer)->setMeta($meta);

Responding With An Error 返回一个错误提示

这个包内有很多不同的响应错误的提示,你可以快速的形成一个错误提示。(这块文字理解,我感觉不太好,就把真实的返回值写出来了)

return $this->response->error('This is an error.', 404);

返回信息:{"message":"This is an error.","status_code":404}

return $this->response->errorNotFound();

返回信息:{"message":"Not Found","status_code":404} 

return $this->response->errorBadRequest();

返回信息:{"message":"Bad Request","status_code":400}

return $this->response->errorForbidden();

返回信息:{"message":"Forbidden","status_code":403}

 

return $this->response->errorInternal();

返回信息:{"message":"Internal Error","status_code":500}

 

return $this->response->errorUnauthorized();

返回信息:{"message":"Unauthorized","status_code":401}

 

 

Responding With An Array 作为一个数组返回

class UserController extends BaseController
{
    public function show($id)
    {
        $user = User::findOrFail($id);

        return $this->response->array($user->toArray());
    }
}   

 Responding With A Single Item 作为一个item返回

class UserController extends BaseController
{
    public function show($id)
    {
        $user = User::findOrFail($id);

        return $this->response->item($user, new UserTransformer);
    }
}

一个运行的API 主要是获取请求并返回给客户端响应信息。一个API通常会以一种易于使用的格式返回响应,例如JSON。这是一个不同的方法去返回请求。这里有许多不同的方法可以返回响应,很大程度上取决于您的API的复杂程度或者API未来的方向。

原文地址——> 

Responding With A Collection Of Items 作为一个元素集合返回

class UserController extends BaseController
{
    public function index()
    {
        $users = User::all();

        return $this->response->collection($users, new UserTransformer);
    }
}

  

The easiest way to return a consumable response is to simply return an array or object directly from your controller. Not every object can be correctly formatted though so you should ensure that it implements either the ArrayObject or the IlluminateSupportContractsArrayableInterface interface.

Responding With Paginated Items    返回带分页的数组

class UserController extends BaseController
{
    public function index()
    {
        $users = User::paginate(25);

        return $this->response->paginator($users, new UserTransformer);
    }
}

这个包,将自动格式化响应信息之后作为JSON格式返回,并且为Content-Type 头设置为application/json。 

本文由澳门新葡萄京娱乐网站发布于编程知识,转载请注明出处:PHP使Laravel为JSON REST API重回自定义错误的题目_p

关键词: