如何在Cro::HTTP::Client中覆盖默认Content-Type?
解决Cro::HTTP::Client请求中覆盖默认Content-Type的问题
你遇到的问题是因为客户端默认的Content-Type会和请求参数里的content-type拼接,导致媒体类型解析失败,同时客户端的content-type属性是不可变字符串,无法直接修改。以下是两种无需新建客户端、也不用全局修改的正确覆盖方式:
方法一:通过请求的headers参数覆盖
在post调用中直接通过headers指定Content-Type,这会覆盖客户端的默认设置,避免拼接问题:
my $response = await $!ua.post( "add", headers => { Content-Type => 'multipart/form-data' }, body => [Cro::HTTP::Body::MultiPartFormData::Part.new( headers => { content-type => $mimetype }, name => $name, body-blob => $data, )] );
方法二:手动构建请求对象发送
如果需要更灵活的请求控制,可以直接创建Cro::HTTP::Request对象,指定完整的请求头和体后用客户端发送:
my $request = Cro::HTTP::Request.new( method => 'POST', uri => $!ua.base-uri ~ "add", headers => { Content-Type => 'multipart/form-data' }, body => [Cro::HTTP::Body::MultiPartFormData::Part.new( headers => { content-type => $mimetype }, name => $name, body-blob => $data, )] ); my $response = await $!ua.send($request);
为什么之前的方法失效?
- 直接在
post中传content-type参数时,Cro会将客户端默认值与请求参数值拼接,生成无效的application/json,multipart/form-data媒体类型 - 客户端的
content-type属性是不可变字符串(immutable Str),因此无法通过赋值修改
内容的提问来源于stack exchange,提问作者VZ.
相关产品推荐
相关产品推荐

