GVKun编程网logo

laravel创建响应、设置响应头、重定向等(laravel创建项目)

19

本文将介绍laravel创建响应、设置响应头、重定向等的详细情况,特别是关于laravel创建项目的相关信息。我们将通过案例分析、数据研究等多种方式,帮助您更全面地了解这个主题,同时也将涉及一些关于A

本文将介绍laravel创建响应、设置响应头、重定向等的详细情况,特别是关于laravel创建项目的相关信息。我们将通过案例分析、数据研究等多种方式,帮助您更全面地了解这个主题,同时也将涉及一些关于Angular 响应头读取错误,响应为空对象、flask请求钩子、HTTP响应、响应报文、重定向、手动返回错误码、修改MIME类型、jsonify()方法 --、header函数设置响应头解决php跨域问题实例详解、Http 协议请求头、响应头、响应码的知识。

本文目录一览:

laravel创建响应、设置响应头、重定向等(laravel创建项目)

laravel创建响应、设置响应头、重定向等(laravel创建项目)

所有路由和控制器处理完业务逻辑之后都会返回一个发送到用户浏览器的响应,laravel提供了多种方式返回响应。最简单的是在路由或控制器中返回一个字符串,laravel底层会自动创建一个完整的http响应返回。

Route::get('index', function () {
    return 'study laravel'
});

如果返回的是一个数组,那么laravel会自动转换为json格式输出,另外,以下的代码是等价的:

return ['name' => 'laravel', 'email' => 'laravel@qq.com'];
return response(['name' => 'laravel', 'email' => 'laravel@qq.com']);
return response()->json(['name' => 'laravel', 'email' => 'laravel@qq.com']);

添加响应头

添加响应头非常简单,只需要使用header方法即可,可以在使用多个header方法设置多个响应头。

return response('study laravel')
        ->header('Content-Type', 'text/html; charset=UTF-8')
        ->header('PHP-Version', '7.4');

还可以使用withHeaders 来一次设置多个响应头,该方法接受一个数组做第一个参数。

return response('study laravel')
         ->withHeaders([
             'Conetnt-Type' => 'text/html; charset=UTF-8',
             'PHP-Version' => '7.4'
         ]);

重定向

在laravel中,实现重定向的也有几种方法。可以通过Route::redirect或函数redirect。因为Route::redirect这个属于路由相关的知识,这里,我们来看redirect函数。

return redirect('index/users');

经常的,当一个表单提交时,验证失败,我们就会返回到之前的表单页面,这里,需要使用back函数来完成。

return back();

还可以重定向到命名路由中,如果路由中有参数,那么通过第二个参数传递:

return redirect()->route('news', ['id' => 23]);

经常的,我们在进行一些逻辑处理后,会重定向到另一个控制器接着进行下一步操作。比如,注册一个东西需要填写多个表单时。

return redirect()->action('IndexController@index', ['id' => 1]);

有时候你需要重定向到应用外的域名,那么还可以使用away来完成该操作。它是不带任何编码的

return redirect()->away('http://google.com');

其它的响应类型

视图响应是非常常见的,可以使用view方法来设置

return response()
    ->view('welcome', $data, 200)
    ->header(Content-Type, text/html;charset=utf-8);

除此之外,laravel还提供下载的响应、文件响应等,因为它们在日常工作中用的不是很多,这里就不介绍了。有兴趣的同学可以自行去查询相关文档。

推荐教程:《laravel框架》

Angular 响应头读取错误,响应为空对象

Angular 响应头读取错误,响应为空对象

看起来像是 CORS 问题。 可能你需要设置 cors.allowed.headers

<init-param>
            <param-name>cors.allowed.headers</param-name>
            <param-value>Origin,Accept,X-Requested-With,Content-Type,Content-Disposition,Access-Control-Request-Method,**Access-Control-Request-Headers**</param-value>
        </init-param>

如果是春天,它可能是这样的:

 @Override
    protected void configure(HttpSecurity http) throws Exception {
        CorsConfiguration corsConfiguration = new CorsConfiguration();
        corsConfiguration.setAllowedHeaders(List.of("Authorization","Cache-Control","Content-Type"));
       ........
       .........
}
,

我曾经遇到过类似的问题,

您可以尝试将以下添加到您的主类中

 @Bean
    public WebMvcConfigurer corsConfigurer() {
        return new WebMvcConfigurer() {
            @Override
            public void addCorsMappings(CorsRegistry registry) {
                registry.addMapping("/**").allowedOrigins("http://localhost:8080");
            }
        };
    }

flask请求钩子、HTTP响应、响应报文、重定向、手动返回错误码、修改MIME类型、jsonify()方法 --

flask请求钩子、HTTP响应、响应报文、重定向、手动返回错误码、修改MIME类型、jsonify()方法 --

 

请求钩子:

当我们需要对请求进行预处理和后处理时,就可以用Flask提供的回调函数(钩子),他们可用来注册在请求处理的不同阶段执行的处理函数。这些请求钩子使用装饰器实现,通过程序实例app调用,以 before_request钩子为例(请求之前),当你对一个函数附加了app.before_request装饰器后,就会将这个函数注册为before_request处理函数,每次执行请求前都会触发所有before_request函数

 

Flask默认 实现的五种钩子:

 

 

示例代码:

定义了三个视图函数 A,B,C,其中C使用了after_this_request钩子,在网页中请求url 为/C,会触发C视图函数,在执行该函数的流程是先进入before_first_requst钩子,然后进入before_request钩子,之后进入C函数内部注册的after_this_request钩子函数。

之后的after_requet和teardown_request在触发响应条件时会执行。

 

@app.before_request
def before_request():
    print "before request"

@app.before_first_request
def before_first_request():
    print "before first request"

# @app.after_request
# def after_request(response):
#     print "after request"

@app.after_request
def per_request_callbacks(response):
    for func in getattr(g, ''call_after_request'', ()):
        print "after request"
       
response = func(response)
    return response

@app.route(''/A'')
def A():
    return ''<p> this is function A</p>''

@app.route(''/B'')
def B():
    return ''<p>this is function B</p>''

@app.route(''/C'')
def C():
    @flask.after_this_request
    def after_this_request(response):
        print "after this request"
       
#raise ValueError
       
return response
    return "<p>after this request</p>"



if __name__ == ''__main__'':
    app.run(debug = True)

 

结果:

 

 

 

http响应

Flask程序中,客户端的请求会触发相应的视图函数,获取返回值作为响应的主题,最后生成完整的响应,即响应报文

 

响应报文:

响应报文有协议版本、状态码、原因短语、响应首部和响应主体组成

 

响应报文的首部包含一些关于响应和服务器的信息,这些内容有Flask生成,而我们在视图函数中返回的内容即为响应报文中的主体内容。浏览器接收响应后,会把返回的响应主题解析并显示 在浏览器窗口上。

 

HTTP状态码用来表示请求处理的结果

 

 

在Flask中生成响应

响应在Flask中使用Response对象表示 ,响应报文中的大部分内容有服务器处理,大多数情况下,我们只负责返主题内容。

 

Flask处理请求时会先判断是否可以找到与请求URL相匹配的路由,如果没有则返回404响应。如果有,则调用对应的视图函数,视图函数的返回值构成了响应报文的主题内容,正确返回时状态码默认为200,Flask会调用make_response()方法将视图函数返回值转换为响应对象。

 

完整的说,视图函数可以返回最多有三个元素组成的元祖:响应主题、状态码、首部字段。其中首部字段可以为字典,或是两元素元祖组成的列表([(‘Location’,’http://localhost:5000/hi’),(‘contentType’,’…’)])

 

flask请求成功时默认的响应码是200

 

可以对请求指定不同的响应状态码:指定url为hi的请求的响应状态码为201

 

结果:

 

重定向

重定向可以通过修改30X响应的首部Location的字段的值来进行:

 

在视图函数中,return语句后面用字典的形式指定Location的值,访问的时候,会根据Location的值进行重定向

 

@app.route(''/redirect'')
def redirect():
    return "<p>This is a redirect pare</p>"

@app.route(''/hello1'')
def hello1():
    print "redirect..."
   
return '''', 302, {''Location'': ''http://127.0.0.1:5000/redirect''}

 

if __name__ == ''__main__'':
    app.run(debug = True)

 

结果:

 

 

访问hello1路径时,页面进行了重定向,重定向的位置是首部中Location字段的URL

 

也可以通过Flask提供的redirect()函数来生成重定向响应

from flask import Flask,redirect

@app.route(''/hello2'')
def hello2():
    return redirect(''http://localhost:5000/redirect'')

if __name__ == ''__main__'':
    app.run(debug = True)

 

结果:

 

 

修改重定向redirect函数返回码为303

@app.route(''/hello2'')
def hello2():
    return redirect(''http://localhost:5000/redirect'',303)

if __name__ == ''__main__'':
    app.run(debug = True)

 

结果:

 

 

程序内重定向到其他视图函数

如果要在程序内重定向到其他视图函数,可以在redirect()函数中使用url_for()函数生成目标URL,可以在响应首部的Location看到重定向的目标URL,重定向到其他视图其实就是重定向到该视图对应的url

 

from flask import Flask,redirect,url_for

@app.route(''/hello3'')
def hello3():
    return redirect(url_for(''redirect''))#重定向到/redirect

@app.route(''/redirect'')
def redirect():
    return "<p>This is a redirect pare</p>"

if __name__ == ''__main__'':
    app.run(debug = True)

 

结果:

 

手动返回错误响应

大多数情况下,Flask会自动处理常见的错误响应。HTTP错误对应的异常类在Werkzeug的werkzeug.exceptions模块中定义,抛出这些异常即可返回对应的错误响应。如果你想手动返回错误响应,可以使用Flask提供的abort()函数。

在abort()函数中传入状态码即可返回对应的错误响应。

需要注意,abourt()函数被调用后,abort()函数之后的代码不会被执行。

例子为手动返回404错误:

 

from flask import abort

@app.route(''/404'')
def not_found():
    abort(404)



if __name__ == ''__main__'':
    app.run(debug = True)

 

结果:

 

响应格式:

在http响应中,数据可以通过多种格式传输,我们会使用HTML格式,这也是Flask中的默认审核制。在特定的情况下,我们也会用其他格式。不同的响应数据格式需要设置不同的MIME类型,MIME类型在首部的Content-Type字段中定义,以默认的HTML类型为例 :

 

Content-Type:  text/html; charset=utf-8

 

MIME类型

MIME类型(又称media type或content type)是一种用来表示文件类型的机制,它与文件扩展名相对应,可以让客户端区分不同的内容类型,并执行不同的操作。一般的格式为“类型名/子类型名”。其中子类型名一般为文件扩展名。比如HTML的MIME类型为”text/html”,png图片的MIME类型为”image/png”。

 

如果想使用其他MIME类型,可以通过Flask提供的make_response()方法生成响应对象,传入响应的主体作为参数,然后使用响应对象的mimetype属性设置MIME类型,不需要设置字符集(charset)选项。

修改MIME类型:

from flask import make_response

@app.route(''/foo'')
def foo():
    response = make_response(''Hello,World!'')
    response.mimetype = ''text/plain''
   
return response

 

 

结果:

 

常用的数据格式(纯文本、HTML、XML和JSON)对应的MIME类型

纯文本的MIME类型:text/plain

HTML的MIME类型:text/html

XML的MIME类型:application/xml

JSON的MIME类型:application/json

 

Flask提供JSON的支持

Flask通过引入Python标准库中的json模块为程序提供了JSON支持。你可以直接从Flask中导入json对象,然后调用dumps()方法将字典、列表或元祖序列化为JSON字符串,在使用前面介绍的方法修改MIME类型,即可返回JSON响应

例如:

用json模块把响应转换为JSON

from flask import Flask,make_response,json

@app.route(''/foo1'')
def foo1():
    data={''name'':''Sam Xia'',''gender'':''male''}
    response = make_response(json.dumps(data))
    response.mimetype = ''application/json''
   
return response

if __name__ == ''__main__'':
    app.run(debug = True)

 

结果:

 

 

也可以jsonnify()方法转换响应内容为JSON

不过我们一般并不直接使用json模块的dumps()、load()等方法,因为Flask通过包装这些方法提供了更方便的jsonify()函数。用jsonify()函数,我们进需要传入数据或参数,他会把传入的参数转化成JSON字符串作为响应的主体,然后生成一个响应对象,并且设置正确的MIME类型。

例如:

@app.route(''/foo3'')
def foo3():
    return jsonify(name = ''Sam Xia'',gender = ''make'')

if __name__ == ''__main__'':
    app.run(debug = True)

 

结果:

 

jsonify()函数可以接收多种形式的参数。可以传入如上边的关键字参数,也可以像dumps()方法一样传入字段、列表或元祖,如:


from flask import jsonify

@app.route(''/foo3'')
def foo3():
    return jsonify({''name'':''Sam Xia'',''gender'' : ''make''})#传入字典

if __name__ == ''__main__'':
    app.run(debug = True)

 

结果:

 

jsonify()函数可以自定义响应码

 

from flask import jsonify

@app.route(''/foo3'')
def foo3():
    return jsonify(message = ''Error !''),500

 

if __name__ == ''__main__'':
    app.run(debug = True)

 

结果:

 

 

header函数设置响应头解决php跨域问题实例详解

header函数设置响应头解决php跨域问题实例详解

设置允许访问的域名:

1、允许全部的域名访问

header("Access-Control-Allow-Origin:*");

2、允许指定域名访问

header( 'Access-Control-Allow-Origin:http://a.test.com' );

设置允许访问的请求方式:

1、一种或者多种

header('Access-Control-Allow-Methods:POST,GET,OPTIONS,DELETE');

2、全部

header('Access-Control-Allow-Methods:*');

然后根据需要再设置其他的参数。

以上就是通过header函数设置响应头解决PHP跨域问题的详细内容,如果大家有任何需要补充的可以联系小编,感谢大家对我们的支持。

Http 协议请求头、响应头、响应码

Http 协议请求头、响应头、响应码

Http 部分请求头 Accept 客户机通过这个头,告诉服务器,它支持哪些数据类型 Accept-Charset 客户机通过这个头,告诉服务器,它支持的编码 Accept-Encoding 客户机通过这个头,告诉服务器,支持哪种数据压缩格式 Accept-Language 客户机采用的是哪个语言 application/x-www-form-urlencoded 浏览器提交 Web 表单时使用 Content-Type 在使用 REST 接口时,服务器会检查该值,用来确定 HTTP Body 中的内容该怎样解析。 Host 客户机通过这个头,告诉服务器,想访问服务器哪台主机 If-Modified-Since 客户机通过这个头,告诉服务器,数据缓存的时间 Referer 客户机通过这个头,告诉服务器,客户机是从哪个页面来的(防盗链) User-Agent 说明客户机操作系统信息,以及浏览器信息 Cookie 客户机通过这个头,可以带点数据给服务器 Connection 表示是否需要持久连接。 Range: bytes=start-end 请求资源的部分内容

 

HTTP 部分响应头 Location 服务器通过这个头告诉浏览器去访问哪个页面,这个头通常配合 302 状态码使用 server 服务器通过这个头,告诉浏览器服务器类型 Content-Encoding 服务器通过这个头告诉浏览器,回送的数据采用的压缩格式 Content-Length 服务器通过这个头告诉浏览器,回送的数据的大小长度 Content-Type 服务器通过这个头告诉浏览器,回送数据的类型 Last-Modified 服务器通过这个头告诉浏览器,缓存资源的最后修改时间 Refresh 服务器通过这个头告诉浏览器,定时刷新网页 Content-Disposition: attachment; filename=aaa.zip 服务器通过这个头告诉浏览器,以下载方式打开数据 ETag: W/"7777-1242234904000" 缓存相关的头,为每一个资源配一个唯一的编号 Expires: 0 服务器通过这个头,告诉浏览器把会送的资源缓存多长时间,-1 或 0,0 则是不缓存

Expires: 0

Pragma: no-cache  

Cache-Control: no-cache 

这三个头组合使用,让浏览器不要缓存数据

 

HTTP 部分响应码 1xx(临时响应) 表示临时响应并需要请求者继续执行操作的状态代码。 100(继续) 请求者应当继续提出请求。 服务器返回此代码表示已收到请求的第一部分,正在等待其余部分。   101(切换协议) 请求者已要求服务器切换协议,服务器已确认并准备切换。 2xx (成功) 表示成功处理了请求的状态代码。 200(成功) 服务器已成功处理了请求。通常,这表示服务器提供了请求的网页。 201(已创建) 请求成功并且服务器创建了新的资源。 202(已接受)  服务器已接受请求,但尚未处理。 203(非授权信息) 服务器已成功处理了请求,但返回的信息可能来自另一来源。 204(无内容) 服务器成功处理了请求,但没有返回任何内容。 205(重置内容) 服务器成功处理了请求,但没有返回任何内容。 206(部分内容) 服务器成功处理了部分 GET 请求。 3xx (重定向) 表示要完成请求,需要进一步操作。 通常,这些状态代码用来重定向。 300(多种选择) 针对请求,服务器可执行多种操作。 服务器可根据请求者 (user agent) 选择一项操作,或提供操作列表供请求者选择。 301(永久移动) 请求的网页已永久移动到新位置。 服务器返回此响应(对 GET 或 HEAD 请求的响应)时,会自动将请求者转到新位置。 302(临时移动) 服务器目前从不同位置的网页响应请求,但请求者应继续使用原有位置来进行以后的请求。 303(查看其他位置) 请求者应当对不同的位置使用单独的 GET 请求来检索响应时,服务器返回此代码。 304(未修改) 自从上次请求后,请求的网页未修改过。 服务器返回此响应时,不会返回网页内容。 305(使用代理) 请求者只能使用代理访问请求的网页。 如果服务器返回此响应,还表示请求者应使用代理。 307(临时重定向) 服务器目前从不同位置的网页响应请求,但请求者应继续使用原有位置来进行以后的请求。 4xx(请求错误) 这些状态代码表示请求可能出错,妨碍了服务器的处理。 400(错误请求) 服务器不理解请求的语法。 401(未授权) 请求要求身份验证。 对于需要登录的网页,服务器可能返回此响应。 403(禁止) 服务器拒绝请求。 404(未找到) 服务器找不到请求的网页。 405(方法禁用) 禁用请求中指定的方法。 406(不接受) 无法使用请求的内容特性响应请求的网页。 407(需要代理授权) 此状态代码与 401(未授权)类似,但指定请求者应当授权使用代理。 408(请求超时) 服务器等候请求时发生超时。 409(冲突) 服务器在完成请求时发生冲突。 服务器必须在响应中包含有关冲突的信息。 410(已删除) 如果请求的资源已永久删除,服务器就会返回此响应。 411(需要有效长度) 服务器不接受不含有效内容长度标头字段的请求。 412(未满足前提条件) 服务器未满足请求者在请求中设置的其中一个前提条件。 413(请求实体过大) 服务器无法处理请求,因为请求实体过大,超出服务器的处理能力。 414(请求的 URI 过长) 请求的 URI(通常为网址)过长,服务器无法处理。 415(不支持的媒体类型) 请求的格式不受请求页面的支持。 416(请求范围不符合要求) 如果页面无法提供请求的范围,则服务器会返回此状态代码。 417(未满足期望值) 服务器未满足” 期望” 请求标头字段的要求。 5xx(服务器错误) 这些状态代码表示服务器在尝试处理请求时发生内部错误。 这些错误可能是服务器本身的错误,而不是请求出错。 500(服务器内部错误) 服务器遇到错误,无法完成请求。 501(尚未实施) 服务器不具备完成请求的功能。 例如,服务器无法识别请求方法时可能会返回此代码。 502(错误网关) 服务器作为网关或代理,从上游服务器收到无效响应。 503(服务不可用) 服务器目前无法使用(由于超载或停机维护)。 通常,这只是暂时状态。 504(网关超时) 服务器作为网关或代理,但是没有及时从上游服务器收到请求。 505(HTTP 版本不受支持) 服务器不支持请求中所用的 HTTP 协议版本。

关于laravel创建响应、设置响应头、重定向等laravel创建项目的问题我们已经讲解完毕,感谢您的阅读,如果还想了解更多关于Angular 响应头读取错误,响应为空对象、flask请求钩子、HTTP响应、响应报文、重定向、手动返回错误码、修改MIME类型、jsonify()方法 --、header函数设置响应头解决php跨域问题实例详解、Http 协议请求头、响应头、响应码等相关内容,可以在本站寻找。

本文标签: