法拉第宝石未解压响应身体

时间:2019-07-17 21:44:51

标签: ruby ssl https gzip faraday

我正在尝试使用英国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压缩,但是它们都不是。

欢迎任何想法或建议。

1 个答案:

答案 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