Oauth2 在解析 base64 响应时遇到问题
Oauth2 has problems to parse a base64 response
我的 API(看门人)正在向我的客户 (Oauth2) 发送 base64 格式的 PDF。无法检索 base64 字符串。
这是我在客户端中的控制器操作(顺便说一句,索引操作工作正常并且显示来自 API 的数据没有任何问题):
def show
if access_token
contrat_data=access_token.get("/api/user/contrats/#{params[:id]}").parsed
logger.debug access_token.get("/api/user/contrats/#{params[:id]}").inspect
@contrat=Base64.decode64 contrat_data['contrat_64']
end
end
好像contrat_data是零。但是,调试数据如下
(我缩短了 base64 字符串,因为它有几 ko 长):
#<OAuth2::Response:0x249fb554
@response=#<Faraday::Response:0x249fbb6c @on_complete_callbacks=[],
@env=#<Faraday::Env @method=:get
@body="{\"contrat_64 \":\"JVBERi0xLjQKMSAwIG9iago8PAovVGl0bGUgKP7/KQovQ3JlYXRvciAo/v8A\ndwBrAGgAdABtAGwAdABvA....Aw\nMTkKJSVFT0YK\n\"}"
@url=#<URI::HTTP:0x24a2064c URL:http://ubuntu-syl:3000/api/user/contrats/482>
@request=#<Faraday::RequestOptions (empty)>
@request_headers={"User-Agent"=>"Faraday v0.9.0", "Authorization"=>"Bearer 9cd25cfbb2fc2af6f2e252826195fad3b530b388fdb9b27e55fed7a1021845db"}
@ssl=#<Faraday::SSLOptions (empty)>
@response_headers={"content-type"=>"text/html; charset=utf-8", "transfer-encoding"=>"chunked", "connection"=>"close", "status"=>"200 OK", "x-frame-options"=>"SAMEORIGIN", "x-xss-protection"=>"1; mode=block", "x-content-type-options"=>"nosniff", "x-ua-compatible"=>"chrome=1", "cache-control"=>"max-age=0, private, must-revalidate", "x-request-id"=>"662ddbd2-9f26-4bba-8bb7-c8e79b02e8fb", "x-runtime"=>"0.396093", "x-powered-by"=>"Phusion Passenger 4.0.53", "date"=>"Tue, 20 Jan 2015 16:29:13 GMT", "server"=>"nginx/1.6.2 + Phusion Passenger 4.0.53"}
@status=200>>,
@options={:parse=>nil}
>
OAuth对象的body中确实有数据,但是parsed的结果是nil。应该怎么做才能检索数据?
我认为问题出在内容类型上。 OAuth
将尝试为您解码响应正文(通过 parsed
)但不知道如何处理 text/html
,这就是您似乎收到的内容。我可以在这里看到两个选项。
首先,您可以将服务器的响应更改为 return 不同的内容类型。 OAuth
应该能够使用 application/json
和 a few others
.
将响应解码为 JSON
其次,您可以访问原始 body
并手动解码。
contrat_data_raw = access_token.get("...")
contrat_data_json = JSON.parse(contrat_data_raw.body)
@contrat = Base64.decode64(contrat_data_json["contrat_64"])
当然你应该添加一些错误处理,以防 json 解析或 Base64 解码失败。
我的 API(看门人)正在向我的客户 (Oauth2) 发送 base64 格式的 PDF。无法检索 base64 字符串。
这是我在客户端中的控制器操作(顺便说一句,索引操作工作正常并且显示来自 API 的数据没有任何问题):
def show
if access_token
contrat_data=access_token.get("/api/user/contrats/#{params[:id]}").parsed
logger.debug access_token.get("/api/user/contrats/#{params[:id]}").inspect
@contrat=Base64.decode64 contrat_data['contrat_64']
end
end
好像contrat_data是零。但是,调试数据如下 (我缩短了 base64 字符串,因为它有几 ko 长):
#<OAuth2::Response:0x249fb554
@response=#<Faraday::Response:0x249fbb6c @on_complete_callbacks=[],
@env=#<Faraday::Env @method=:get
@body="{\"contrat_64 \":\"JVBERi0xLjQKMSAwIG9iago8PAovVGl0bGUgKP7/KQovQ3JlYXRvciAo/v8A\ndwBrAGgAdABtAGwAdABvA....Aw\nMTkKJSVFT0YK\n\"}"
@url=#<URI::HTTP:0x24a2064c URL:http://ubuntu-syl:3000/api/user/contrats/482>
@request=#<Faraday::RequestOptions (empty)>
@request_headers={"User-Agent"=>"Faraday v0.9.0", "Authorization"=>"Bearer 9cd25cfbb2fc2af6f2e252826195fad3b530b388fdb9b27e55fed7a1021845db"}
@ssl=#<Faraday::SSLOptions (empty)>
@response_headers={"content-type"=>"text/html; charset=utf-8", "transfer-encoding"=>"chunked", "connection"=>"close", "status"=>"200 OK", "x-frame-options"=>"SAMEORIGIN", "x-xss-protection"=>"1; mode=block", "x-content-type-options"=>"nosniff", "x-ua-compatible"=>"chrome=1", "cache-control"=>"max-age=0, private, must-revalidate", "x-request-id"=>"662ddbd2-9f26-4bba-8bb7-c8e79b02e8fb", "x-runtime"=>"0.396093", "x-powered-by"=>"Phusion Passenger 4.0.53", "date"=>"Tue, 20 Jan 2015 16:29:13 GMT", "server"=>"nginx/1.6.2 + Phusion Passenger 4.0.53"}
@status=200>>,
@options={:parse=>nil}
>
OAuth对象的body中确实有数据,但是parsed的结果是nil。应该怎么做才能检索数据?
我认为问题出在内容类型上。 OAuth
将尝试为您解码响应正文(通过 parsed
)但不知道如何处理 text/html
,这就是您似乎收到的内容。我可以在这里看到两个选项。
首先,您可以将服务器的响应更改为 return 不同的内容类型。 OAuth
应该能够使用 application/json
和 a few others
.
其次,您可以访问原始 body
并手动解码。
contrat_data_raw = access_token.get("...")
contrat_data_json = JSON.parse(contrat_data_raw.body)
@contrat = Base64.decode64(contrat_data_json["contrat_64"])
当然你应该添加一些错误处理,以防 json 解析或 Base64 解码失败。