6

私はrubyでhttpリクエストを行っています:

  http = Net::HTTP.new(uri.host, uri.port)
  req = Net::HTTP::Post.new(uri.path)
  req.body = payload
  req['customeheader'] = 'xxxxxxxxx'
  http.set_debug_output $stdout

デバッグをオンにしました。リクエストが投稿されると、ヘッダーが次のように投稿されていることがわかります。

  Customheader: xxxxxxxxx

これを止める方法はありますか?私が投稿しているサードパーティのサーバーは、ヘッダー名が正しくないためにエラーを出します-それは期待していますcustomheader:

4

3 に答える 3

14

Net :: HTTPHeaderとNet:HTTPGenericRequestにモンキーパッチを適用してダウンケースを削除して大文字にすることは可能ですが、すべてを強制するのではなく、大文字と小文字を選択的に区別できる別のアプローチを見つけました。

ソリューション:

class CaseSensitiveString < String
    def downcase
        self
    end
    def capitalize
        self
    end
end

次に、CaseSensitiveString.new('keyname')を使用して、大文字と小文字が区別されるキーを作成します。既存の動作を維持するために、他のキーに文字列/記号を使用します。これはモンキーパッチよりもはるかに簡単で、RESTクライアントライブラリやNet::HTTPでうまく機能します。

于 2013-05-15T21:06:35.063 に答える
6

HTTP仕様(RFC 2616)によると、ヘッダーフィールド名では大文字と小文字が区別されません。そのため、サードパーティのサーバーの実装は壊れています。

本当に必要な場合は、Net :: HTTPにモンキーパッチを適用して大文字と小文字を区別することができます。これは、フィールド名を格納するときにフィールド名を小文字にして、最初の大文字で書き込むためです。

使用した保存方法は次のとおりです(Net::HTTPHeader#[]=):

# File net/http.rb, line 1160
    def []=(key, val)
      unless val
        @header.delete key.downcase
        return val
      end
      @header[key.downcase] = [val]
    end

そして、ここにヘッダー(Net::HTTPGenericRequest#write_header)を書き込みます。

# File lib/net/http.rb, line 2071
    def write_header(sock, ver, path)
      buf = "#{@method} #{path} HTTP/#{ver}\r\n"
      each_capitalized do |k,v|
        buf << "#{k}: #{v}\r\n"
      end
      buf << "\r\n"
      sock.write buf
    end

これらはおそらくオーバーライドする必要がある唯一のメソッドですが、私は100%確実ではありません。

于 2012-04-21T15:02:32.240 に答える
5

以前の回答に基づいて、これはruby2.3で機能します。

class CaseSensitiveString < String
  def downcase
    self
  end

  def capitalize
    self
  end

  def to_s
    self
  end
end

2.3以降、のメソッドは各ヘッダーを呼び出すto_sため、メソッドを追加する必要がありますHTTP::Headercapitalizeto_s

于 2017-02-08T18:54:37.270 に答える