404在Laravel API中的响应

Laravel 5.5中提供的一个有用功能是回退路由。您可以学习穆罕默德Said(该功能的作者)使用Laravel+5.5在更好的404响应中的回退路由,以全面了解它为什么有用以及如何使用回退路由。n当您创建API时,您可能希望使用JSON响应的404路由(或通过内容协商提供的任何格式)而不是默认的404 JSON响应。n如果您请求一个JSON内容类型的未定义路由,您会得到这样的结果:n 1curl 2-H\"Content-Type:application/json\" 3-H\"Accept: application/json\" 4-i http://apidemo.test/not/found 5 6HTTP/1.1 404 Not Found 7Content-Type: application/json 8Transfer-Encoding: chunked 9Connection: keep-alive10Vary: Accept-Encoding11Cache-Control: no-cache, private12Date: Thu, 16 Aug 2018 06:00:42 GMT1314{15\"message\": \"\"16}n您可以看到我们得到一个空消息,它不一定非常有用,但是框架返回有效的JSON,而不需要我们做任何工作。让我们介绍几个场景,并详细介绍如何确保当API路由不匹配时,您的API使用回退404响应并提供有用的消息。nSetupn使用Laravel CLI,我们将创建一个新的项目来详细介绍如何向您的API添加404响应:n1laravel new apidemo2cd apidemo/34# Valet users...5valet linkn我们将配置一个MySQL数据库对于这个项目:n1mysql -u root -e\"create database apidemo\"n将.env更新为与您的数据库环境匹配的凭据,对我来说是:n我们将使用users表来演示一些事情。将database/seeds/DatabaseSeeder.php更新为以下内容:n 1create();15}16}n最后,您可以运行迁移和种子程序:n1php artisan migrate:fresh --seedAPI路由n我们将设置一些API路由,包括API的回退路由,并完成测试。第一,让我们创建以下测试:n1php artisan make:test Api/FallbackRouteTestn添加测试用例以查找JSON响应并验证404错误:n 1withoutExceptionHandling();1617$response->assertStatus(404);18$response->assertHeader(\"Content-Type\", \"application/json\");19$response->assertJson([21]);22}23}n如果此时运行测试套件,此测试将失败,因为我们尚未定义回退路由:n1phpunit>2...3There was 1 error:451) TestsFeatureApiFallbackRouteTest::missing_api_routes_should_return_a_json_4046SymfonyComponentHttpKernelExceptionNotFoundHttpException: GET http://localhost/api/missing/routen让我们在routes/api.php的末尾定义回退路由文件:n1Route::fallback(function(){2return>3})->name(\"api.fallback.404\");n我们创建了一个回退路由,用JSON响应并返回我们在测试中断言的消息。我们还断言内容类型也是application/json。n请注意我们为路由api.fallback.404定义的名称。我们需要很快使用这个名称来响应异常处理程序中的一些异常类型。一个有效的用户端点n为了进一步说明回退路由是如何使用的,我们将为User模型定义一个有效路由:n1Route::get(\"/users/{user}\", \"UsersController@show\")2->name(\"api.users.show\");n接下来,我们将创建一个控制器和用户资源:n1php artisan make:controller UsersController2php artisan make:resource Usern我们所依赖的在隐式路由模型绑定上,我们的控制器使用用户资源用JSON响应:n 1<?php 2 3namespace AppHttpControllers; 4 5use AppUser; 6use AppHttpResourcesUser as UserResource; 7use IlluminateHttpRequest; 8 9class UsersController extends Controller10{11public function show(User $user)12{13return new UserResource($user);14}15}nNext,我们将创建一个测试来验证用户端点,并验证当我们请求一个无效用户时是否返回404:n1php artisan make:test Api/ViewUserTesn这就是有趣的地方:让我们创建一个测试来验证路由触发ModelNotFoundException通过路由模型绑定:n 1withoutExceptionHandling();16try {17$this->json(\"GET\", \"/api/users/123\");18} catch (ModelNotFoundException $exception) {19$this->assertEquals(\"No query results for model [AppUser].\", $exception->getMessage());20return;21}2223$this->fail(\"ModelNotFoundException should be triggered.\");24}25}n这个测试是有效的,应该通过它确保我们的控制器以某种方式使用路由模型绑定或以某种方式触发模型异常。我们马上再来讨论,但请注意,您可能需要为ModelNotFoundException自定义响应消息。n这是一个有点冗余的测试,我们不会禁用异常处理,并确保从API返回404和\"no query results\"错误消息:n 1/** @test */ 2public function requesting_an_invalid_user_returns_no_query_results_error() 3{> 5$response->assertStatus(404); 6$response->assertHeader(\"Content-Type\", \"application/json\"); 7$response->assertJson([> 9]);10}n此时两个测试都应该通过我们不必使用TDD来驱动路由模型绑定。n接下来,让我们为路由模型绑定编写一个失败的测试确保无效的用户id与路由不匹配,我们得到回退路由:n 1/** @test */ 2public function invalid_user_uri_triggers_fallback_route() 3{> 5$response->assertStatus(404); 6$response->assertHeader(\"Content-Type\", \"application/json\"); 7$response->assertJson([> 9]);10}n如果运行此测试,您将(部分)得到以下错误:n 1Failed asserting that an array has the subset Array &0 (> 3). 4--- Expected 5+++ Actual 6@@ @@ 7 Array 8 (>10+>n通过约束{user}路由参数,我们可以使此测试通过:n1Route::get(\"/users/{user}\", \"UsersController@show\")2->name(\"api.users.show\")3->where(\"user\", \"[0-9]+\");n如果运行测试,它将通过,因此,成功命中API回退路由:n1phpunit>2...3OK (1 test, 4 assertions)n最好给路由参数添加条件,使路由只匹配有效参数,否则命中回退路由。如果使用回退对您来说不是必需的,那么路由模型绑定仍然会返回404错误,但是某些数据库在查询具有无效值的表时可能会触发错误。n您可能也会有类似的测试,确保您的端点为有效用户工作:n 1use RefreshDatabase; 2 3/** @test */ 4public function guests_can_view_a_valid_user() 5{>>> 9]);1012$response->assertOk();13$response->assertJson([17]18]);19}自定义ModelNotFoundException响应n当通过我们的路由模型绑定触发ModelNotFoundException时,API响应的错误消息可能会很好。如果您对触发回退路由感兴趣,您可以使用类似于以下内容的检查来更新异常处理程序:n 1# app/Exceptions/Handler.php 2use IlluminateDatabaseEloquentModelNotFoundException; 3use IlluminateSupportFacadesRoute; 4 5public function render($request, Exception $exception) 6{ 7if ($exception instanceof ModelNotFoundException && $request->isJson()) { 8return Route::respondWithRoute(\"api.fallback.404\"); 9}1011return parent::render($request, $exception);12}n同样,这是一个可选步骤,让您了解如何将异常处理与回退路由结合使用。您可能对d提供的JSON响应非常满意

admin_action_{$_REQUEST[‘action’]}

do_action( "admin_action_{$_REQUEST[‘action’]}" )动作钩子::在发送“Action”请求变量时激发。Action Hook: Fires when an ‘action’ request variable is sent.目录锚点:#说明#源码说明(Description)钩子名称的动态部分$_REQUEST['action']引用从GET或POST请求派生的操作。源码(Source)更新版本源码位置使用被使用2.6.0 wp-admin/admin.php:...

日期:2020-09-02 17:44:16 浏览:1159

admin_footer-{$GLOBALS[‘hook_suffix’]}

do_action( "admin_footer-{$GLOBALS[‘hook_suffix’]}", string $hook_suffix )操作挂钩:在默认页脚脚本之后打印脚本或数据。Action Hook: Print scripts or data after the default footer scripts.目录锚点:#说明#参数#源码说明(Description)钩子名的动态部分,$GLOBALS['hook_suffix']引用当前页的全局钩子后缀。参数(Parameters)参数类...

日期:2020-09-02 17:44:20 浏览:1060

customize_save_{$this->id_data[‘base’]}

do_action( "customize_save_{$this-&gt;id_data[‘base’]}", WP_Customize_Setting $this )动作钩子::在调用WP_Customize_Setting::save()方法时激发。Action Hook: Fires when the WP_Customize_Setting::save() method is called.目录锚点:#说明#参数#源码说明(Description)钩子名称的动态部分,$this->id_data...

日期:2020-08-15 15:47:24 浏览:800

customize_value_{$this->id_data[‘base’]}

apply_filters( "customize_value_{$this-&gt;id_data[‘base’]}", mixed $default )过滤器::过滤未作为主题模式或选项处理的自定义设置值。Filter Hook: Filter a Customize setting value not handled as a theme_mod or option.目录锚点:#说明#参数#源码说明(Description)钩子名称的动态部分,$this->id_date['base'],指的是设置...

日期:2020-08-15 15:47:24 浏览:887

get_comment_author_url

过滤钩子:过滤评论作者的URL。Filter Hook: Filters the comment author’s URL.目录锚点:#源码源码(Source)更新版本源码位置使用被使用 wp-includes/comment-template.php:32610...

日期:2020-08-10 23:06:14 浏览:925

network_admin_edit_{$_GET[‘action’]}

do_action( "network_admin_edit_{$_GET[‘action’]}" )操作挂钩:启动请求的处理程序操作。Action Hook: Fires the requested handler action.目录锚点:#说明#源码说明(Description)钩子名称的动态部分$u GET['action']引用请求的操作的名称。源码(Source)更新版本源码位置使用被使用3.1.0 wp-admin/network/edit.php:3600...

日期:2020-08-02 09:56:09 浏览:873

network_sites_updated_message_{$_GET[‘updated’]}

apply_filters( "network_sites_updated_message_{$_GET[‘updated’]}", string $msg )筛选器挂钩:在网络管理中筛选特定的非默认站点更新消息。Filter Hook: Filters a specific, non-default site-updated message in the Network admin.目录锚点:#说明#参数#源码说明(Description)钩子名称的动态部分$_GET['updated']引用了非默认的...

日期:2020-08-02 09:56:03 浏览:855

pre_wp_is_site_initialized

过滤器::过滤在访问数据库之前是否初始化站点的检查。Filter Hook: Filters the check for whether a site is initialized before the database is accessed.目录锚点:#源码源码(Source)更新版本源码位置使用被使用 wp-includes/ms-site.php:93910...

日期:2020-07-29 10:15:38 浏览:825

WordPress 的SEO 教学:如何在网站中加入关键字(Meta Keywords)与Meta 描述(Meta Description)?

你想在WordPress 中添加关键字和meta 描述吗?关键字和meta 描述使你能够提高网站的SEO。在本文中,我们将向你展示如何在WordPress 中正确添加关键字和meta 描述。为什么要在WordPress 中添加关键字和Meta 描述?关键字和说明让搜寻引擎更了解您的帖子和页面的内容。关键词是人们寻找您发布的内容时,可能会搜索的重要词语或片语。而Meta Description则是对你的页面和文章的简要描述。如果你想要了解更多关于中继标签的资讯,可以参考Google的说明。Meta 关键字和描...

日期:2020-10-03 21:18:25 浏览:1692

谷歌的SEO是什么

SEO (Search Engine Optimization)中文是搜寻引擎最佳化,意思近于「关键字自然排序」、「网站排名优化」。简言之,SEO是以搜索引擎(如Google、Bing)为曝光媒体的行销手法。例如搜寻「wordpress教学」,会看到本站的「WordPress教学:12个课程…」排行Google第一:关键字:wordpress教学、wordpress课程…若搜寻「网站架设」,则会看到另一个网页排名第1:关键字:网站架设、架站…以上两个网页,每月从搜寻引擎导入自然流量,达2万4千:每月「有机搜...

日期:2020-10-30 17:23:57 浏览:1298