Rails Net: проблема с кодировкой HTTP JSON - PullRequest
1 голос
/ 09 мая 2019

Я использую внешний API, которому я отправляю JSON.

Когда я копирую тот же JSON в Paw (инструмент, похожий на почтальон), он работает.

С рельсами я получаю ошибку 400 bad request.

Я думаю, что этопроблема кодирования, потому что, когда я хочу проанализировать тело ответа 400, мне нужно сделать

response.body.encode('UTF-8', invalid: :replace, undef: :replace, replace: '?')

Тогда запрос и ответ:

Запрос

{"searchable":{"default":true},"c_body":{"ja-JP":{"_type":"markup_text","source":"<div class=\"cms-content-wrapper\"><div class=\"cms-page-module\" data-template-id=\"552100319\" data-template-name=\"PEP_Features_Carousel\" data-page-module-id=\"408407719\" rank=\"cptiuz\"><section class=\"sk-component sk-component--pep-feature-slider\" data-slider-id=\"\" id=\"\">\r\n  <div class=\"sk-carousel sk-carousel__emotional sk-carousel-load\" data-sk-carousel-limit=\"{'large':1, 'medium':1, 'small':1}\" data-loop=\"true\">\r\n\t<div class=\"sk-carousel-inner\">\r\n\t\t<ul class=\"sk-carousel-wrapper\" style=\"left: -100%; transform:none;\">\r\n  \r\n          \r\n          \r\n            <li>\r\n              <div class=\"sk-carousel__item\" data-gallery-item=\"\">\r\n                <div class=\"sk-copy--text-wrapper\">\r\n                  <div class=\"sk-copy--text\">\r\n                  <div class=\"sk-pre-header\"><p>ストッケ エクスプローリーの主な特徴</p>\n</div>\r\n                  <h3>より近くで絆を感じる</h3>\r\n            \r\n                  <div class=\"sk-copy--large\">公園からコーヒーショップまで、エクスプローリーはお子さまと親御さまの絆を感じられる、最適な高さにお子さまの位置を調節します。</div>\r\n                    \r\n                      <div   .........

Тело ответа

{"_v":"19.5","fault":{"arguments":{"body":"{\"searchable\":{\"default\":true},\"c_body\":{\"ja-JP\":{\"_type\":\"markup_text\",\"source\":\"<div class=\\\"cms-content-wrapper\\\"><div class=\\\"cms-page-module\\\" data-template-id=\\\"552100319\\\" data-template-name=\\\"PEP_Features_Carousel\\\" data-page-module-id=\\\"408407719\\\" rank=\\\"cptiuz\\\"><section class=\\\"sk-component sk-component--pep-feature-slider\\\" data-slider-id=\\\"\\\" id=\\\"\\\">\\r\\n  <div class=\\\"sk-carousel sk-carousel__emotional sk-carousel-load\\\" data-sk-carousel-limit=\\\"{'large':1, 'medium':1, 'small':1}\\\" data-loop=\\\"true\\\">\\r\\n\\t<div class=\\\"sk-carousel-inner\\\">\\r\\n\\t\\t<ul class=\\\"sk-carousel-wrapper\\\" style=\\\"left: -100%; transform:none;\\\">\\r\\n  \\r\\n          \\r\\n          \\r\\n            <li>\\r\\n              <div class=\\\"sk-carousel__item\\\" data-gallery-item=\\\"\\\">\\r\\n                <div class=\\\"sk-copy--text-wrapper\\\">\\r\\n                  <div class=\\\"sk-copy--text\\\">\\r\\n                  <div class=\\\"sk-pre-header\\\"><p>???????????? ???????????????????????????????????????</p>\\n</div>\\r\\n                  <h3>?????????????????????

При прокрутке до ответа вправо в ответе появляется много ???где японский текст был.Вот почему я предполагаю, что это проблема кодирования.Но я не могу это исправить.

Вот мой код:

def patch_content(content_asset_document, content_asset_id, instance_url)
  puts :patch_content
  token = get_token
  header = {
    "Authorization" => "Bearer #{token.access_token}",
    "Content-Type" => "application/json; charset=UTF-8"
  }
  url = "#{instance_url}/libraries/lib/content/#{content_asset_id}"
  uri = URI.parse(url)
  request = Net::HTTP::Patch.new(uri.request_uri, header)
  http = Net::HTTP.new(uri.host, uri.port)

  http.use_ssl = true
  http.ssl_version = :TLSv1_2
  request.body = content_asset_document.to_json.to_s
  response = http.request(request)
  File.open("request.txt", "w") { |file| file.puts request.body }
  yield response.code.to_i, response
end
...