我正在尝试使用英国NHS“ GP Connect” REST API,并尝试将一些连接复杂性包装在更简单的Ruby层中。
我已经通过Postman成功地使用了API,并且所有响应都已正确解压缩到JSON / FHIR。从我的Postman会话中获得最简单的请求,并使用Faraday HTTP gem将其转换为Ruby,我可以使请求/响应周期正常运行,但是响应仍然被压缩。 (我正在使用Ruby 2.6.1和Faraday 0.15.4)
(API需要使用“ accept-encoding”:“ gzip”才能完全正常工作。)
谷歌搜索问题,我只出现了法拉第中间件,该中间件旨在在不使用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内容正作为响应返回给我。
以某种方式,法拉第似乎并没有自动解压缩响应主体。我在法拉第的文档中搜索了可能应该设置的标志或其他控件,但是找不到如何处理此标志的清晰说明。
很明显,我可以直接解压缩此输出,但是我想知道是否有适当的内部“法拉第”方法。如果使用的是法拉第Gzip中间件,那很好,但是如何?
如果它有助于弄清正在发生的事情,那么我已在纯Net :: HTTP中重新实现了这一点,并且结果完全相同,因此响应正文不会被解压缩。法拉第(Faraday)和Net :: HTTP都说它们会自动进行ungzip压缩,但是它们都不是。
欢迎任何想法或建议。
答案 0 :(得分:1)
鉴于您使用的是faraday-middleware gem,则可以在连接设置中仅使用:gzip
中间件。
request.use :gzip
以您的代码为例:
response = connection.get do |request|
request.url "/SystmOneMHS/NHSConnect/Z12345/STU3/1/Patient?#{identifier}"
request.use :gzip
request.headers = headers
end