【发布时间】:2019-11-26 19:02:35
【问题描述】:
我正在尝试使用 UK NHS 'GP Connect' REST API,并尝试将一些连接复杂性封装在一个更简单的 Ruby 层中。
我已经通过 Postman 成功地使用了 API,并且所有响应都正确解压缩为 JSON/FHIR。从我的 Postman 会话中获取最简单的请求并使用 Faraday HTTP gem 将其转换为 Ruby,我可以使请求/响应周期正常工作,但响应仍然是 gzip 压缩的。 (我使用的是 Ruby 2.6.1 和 Faraday 0.15.4)
(API 需要 'accept-encoding': 'gzip' 才能工作。)
谷歌搜索我遇到的问题只出现了 Faraday 中间件,该中间件旨在不使用 Net::HTTP(默认适配器,以及我正在使用的适配器)时使用
在这个阶段,整个事情都是一个脚本,所以很容易展示。 (另外还有一些客户端证书和本地安装的 CA 证书都可以正常工作,没有问题)
***** = 尽管我在这里使用的医疗保健端点无论如何都是虚构数据的虚拟测试,但我已将其设为空白以保护无辜者。
require 'faraday'
identifier = "identifier=https://fhir.nhs.uk/Id/nhs-number|*****"
baseurl = "https://systmoneukdemo1.tpp-uk.com"
headers = {
"authorization": '*****',
"content-type": 'application/json+fhir',
"accept-encoding": 'gzip',
"accept": 'application/json+fhir',
"ssp-from": '*****',
"ssp-interactionid": 'urn:nhs:names:services:gpconnect:fhir:rest:search:patient-1',
"ssp-to": '123456',
"ssp-traceid": '*****',
"cache-control": 'no-cache',
}
connection = Faraday.new(
url: baseurl,
ssl: {
ca_file: './certs/cacert.crt',
client_cert: OpenSSL::X509::Certificate.new(File.read("certs/summer-school-cert.crt")),
client_key: OpenSSL::PKey::RSA.new(File.read("certs/summer-school-cert.key")),
}
)
response = connection.get do |request|
request.url "/SystmOneMHS/NHSConnect/Z12345/STU3/1/Patient?#{identifier}"
request.headers = headers
end
puts response.body
我运行ruby script.rb 时的响应是:
�U�o�0������- |Z��U�nӪjrV�A�T����;;dM�n�4-������{wϽ'
������)9f�W�Һ�b�-+�e��7���2pZ���dPr�5o���,m��\;
`*�:�Ά������r��1Aju�H��셸T�Ϙ��ލ|�?�
߶ih>jy����D����5&=��m��/G��Ñ�'�Ϣ#?��'Q6�~���y��^[.�u��-��@�ȡSǛ^�~�b?|A�#צ�%eu��:
�� ���h�M�4dm��j�WB�l
8�%��f��b��sf����C�>iS[
��C�q$�ɛ���ǣ��h�oF�?�jٙR
�7�gh�h�����w�`��d�:iq�P� ������Ya�z<����k��d5X1����J�WfV��}�y�@�w%��0���
��;à)�!g����(��L�WMm�<xg��L����p�I�������9��]#
��i�N3�nz��z�'�Mf�țz�ڪ�����]"�y�����r'
j����gru��_��u��C,��U�� /
ý"���H����V��0�kT�ĸ��.f��pUNՊI�ݎvs��Z���잹˂�}��g��6Q��v���p<
�-.6z
R�Ğ��6�V�� ��-Pzs�L��Ի�4�_��L��Z�b��g:��;�OF=g{�y�?Ly�+����kk���H�y���
������a��s}��O/�W�=��r��F��%a
但是,如果我将该输出通过管道传输到 gzip:
ruby script.rb | gzip -d
{"resourceType":"Bundle","id":"4D2EAEC0-A8DB-11E9-8B9A-1BA7090BDAD3","meta":{"profile":["https://fhir.nhs.uk/STU3/StructureDefinition/GPConnect-Searchset-Bundle-1"]},"type":"searchset","entry":[{"fullUrl":"Patient/9222500000000000","resource":{"resourceType":"Patient","id":"9222500000000000","meta":{"profile":["https://fhir.nhs.uk/STU3/StructureDefinition/CareConnect-GPC-Patient-1"],"versionId":"220262D942C746E9D8023C82ABC8F500","lastUpdated":"2019-07-17T22:39:05+01:00"},"identifier":[{"system":"https://fhir.nhs.uk/Id/nhs-number","value":"6656336566","extension":[{"url":"https://fhir.nhs.uk/STU3/StructureDefinition/Extension-CareConnect-GPC-NHSNumberVerificationStatus-1","valueCodeableConcept":{
"coding":
[
{
"system":"https://fhir.nhs.uk/STU3/CodeSystem/CareConnect-NHSNumberVerificationStatus-1",
"code":"01",
"display":"Number present and verified"
}
]
}}]}],"name":[{"prefix":["Mr"],"given":["Michael"],"family":"Smith","use":"official"}],"address":[{"use":"home","type":"both","line":["6 Wren Street"],"city":"London","postalCode":"WC1X 0HD"}],"telecom":[{"system":"phone","use":"home","value":"01132252263"},{"system":"email","use":"home","value":"liang.lin@tpp-uk.com"}],"birthDate":"1960-01-19","gender":"male","active":true,"managingOrganization":{"reference":"Organization/bd00000000000000"},"generalPractitioner":[{"reference":"Practitioner/e576600000000000"}],"extension":[{"url":"https://fhir.nhs.uk/STU3/StructureDefinition/Extension-CareConnect-GPC-RegistrationDetails-1","extension":[{"url":"registrationPeriod","valuePeriod":{"start":"2017-01-01T00:00:00Z"}},{"url":"registrationType","valueCodeableConcept":{"coding":[{"system":"https://fhir.nhs.uk/STU3/CodeSystem/CareConnect-RegistrationType-1","code":"O","display":"Other"}]}},{"url":"preferredBranchSurgery","valueReference":{"reference":"Location/bd00000000000000_0100000000000000"}}]}]}}]}
gzip: stdin: unexpected end of file
我得到了未压缩的 FHIR JSON 内容,这是我所期待的。所以一切都在正常工作,直到解压缩阶段,这没有被执行,原始的 ugzip 内容作为响应返回给我。
法拉第似乎并没有自动解压缩响应正文。我在 Faraday 的文档中搜索了我可能应该设置的标志或其他控件,但我找不到关于如何处理的明确解释。
显然,我可以直接解压缩此输出,但我想知道是否有适当的内部“法拉第”方式来执行此操作。如果它使用 Faraday Gzip 中间件,那就太好了,但是如何呢?
如果它有助于弄清楚发生了什么,我已经在普通的 Net::HTTP 中重新实现了它,结果完全相同,响应体没有被解压缩。 Faraday 和 Net::HTTP 都说它们会自动解压缩,但它们都不是。
欢迎任何想法或建议。
【问题讨论】:
标签: ruby ssl https gzip faraday