ruby-on-rails - HTTP 请求的 header 值使用的文本编码是什么?

标签 ruby-on-rails ruby http encoding ruby-1.8

我有一个 Ruby on Rails 应用程序,它是 Java 和 .Net 应用程序的服务器。我有一个自定义 header ,用于发送一些数据,但是当此数据到达 Ruby on Rails 应用程序时,Rails 会将该值读取为 UTF-8,然后表示该值不是有效的 UTF- 8 串。

例如,如果我发送JÜRGENELITE-HP,我会得到:

#<ActiveRecord::StatementInvalid: PGError: ERROR:  invalid byte sequence for encoding "UTF8": 0xdc52
: SELECT * FROM "replicas" WHERE ("replicas"."identification" = 'J?RGENELITE-HP') AND ("replicas".user_id = 121)  LIMIT 1>

Java HTTP 客户端库在控制台中清楚地正确打印了数据:

DEBUG [main] (DefaultClientConnection.java:268) - >> POST /ze/api/files.json HTTP/1.1
DEBUG [main] (DefaultClientConnection.java:271) - >> X-Replica: JÜRGENELITE-HP
DEBUG [main] (DefaultClientConnection.java:271) - >> Authorization: Basic bWxpbmhhcmVzOjEyMzQ1Njc4

DEBUG [main] (DefaultClientConnection.java:271) - >> Content-Length: 0
DEBUG [main] (DefaultClientConnection.java:271) - >> Host: localhost:3000
DEBUG [main] (DefaultClientConnection.java:271) - >> Connection: Keep-Alive
DEBUG [main] (DefaultClientConnection.java:271) - >> User-Agent: Apache-HttpClient/4.1.2 (java 1.5)

但是当它到达 Rails 时它就崩溃了。 HTTP 使用什么编码来编码 header 值?

最佳答案

US-ASCII

如果您查看 RFC2616 的第 2.2 节:

2.2 Basic Rules

The following rules are used throughout this specification to
describe basic parsing constructs. The US-ASCII coded character set
is defined by ANSI X3.4-1986 [21].

   OCTET          = <any 8-bit sequence of data>
   CHAR           = <any US-ASCII character (octets 0 - 127)>
   UPALPHA        = <any US-ASCII uppercase letter "A".."Z">
   LOALPHA        = <any US-ASCII lowercase letter "a".."z">
   ALPHA          = UPALPHA | LOALPHA
   DIGIT          = <any US-ASCII digit "0".."9">
   CTL            = <any US-ASCII control character
                    (octets 0 - 31) and DEL (127)>
   CR             = <US-ASCII CR, carriage return (13)>
   LF             = <US-ASCII LF, linefeed (10)>
   SP             = <US-ASCII SP, space (32)>
   HT             = <US-ASCII HT, horizontal-tab (9)>
   <">            = <US-ASCII double-quote mark (34)>

本节的其余部分包含有关协议(protocol)头和其他元素的更具体信息。

您必须在规范中跳很多次才能找到所有正确的 BNF 定义。不过,第 4.2 节包含了 header 的定义:

   message-header = field-name ":" [ field-value ]
   field-name     = token
   field-value    = *( field-content | LWS )
   field-content  = <the OCTETs making up the field-value
                    and consisting of either *TEXT or combinations
                    of token, separators, and quoted-string>

TEXT 在第 2.2 节中定义:

   TEXT           = <any OCTET except CTLs,
                    but including LWS>

关于ruby-on-rails - HTTP 请求的 header 值使用的文本编码是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10356216/

相关文章:

ruby-on-rails - Ruby .where 只计算一次重复的结果

ruby-on-rails - 如何检查 `Integer` 是否大于另一个 `Integer` "easily"/"efficiently"?

ruby-on-rails - 更改 seed.rb 数据的 created_at

android - 远程数据库帮助类

java - 通过 Java 套接字接收混合媒体。你的更好吗?

ruby-on-rails - FIPS 模式导致 Ruby on Rails 应用程序因 MD5 摘要/openssl 问题而失败?

ruby-on-rails - Rails_admin 不显示所有包含的模型

ruby-on-rails - 带有嵌入式文档的 Mongoid 急切加载

ruby - 是否可以在 Ruby 中卡住(使其不可变)类或方法?