我的API(门卫)正在将base64中的PDF发送给我的客户端(Oauth2)。它无法检索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对象确实包含正文中的数据,但解析的结果为nil。应该怎么做才能检索数据?
答案 0 :(得分:1)
我认为问题出在内容类型上。 OAuth
将尝试为您解码响应正文(通过parsed
),但不知道如何处理text/html
,这是您似乎正在接收的内容。我可以在这里看到两个选项。
首先,您可以更改服务器的响应以返回不同的内容类型。 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解码失败,你应该添加一些错误处理。