0

会社が提供するサービスの REST API クライアントとして機能する gem を作成しています。

そのために、APIChannelのパスと対話する手段として機能するクラスがあります。実際の HTTP 呼び出し/channelsに使用されます。HTTPartyこのクラスには create というメソッドがあり、必要な属性を持つ Channel インスタンスを POST します。

メソッドは次のようになります。

def create
  body = { external_id: external_id,
           name:        name,
           description: description }
  action = post "/", body
  case action.response.class
  when Net::HTTPAccepted      then return action
  when Net::HTTPNotAcceptable then raise HTTPNotAcceptable
  else raise "Server responded with " + Net::HTTPResponse::CODE_TO_OBJ[action.response.code].to_s
  end
end

このpostメソッドは、ボディ ハッシュを JSON に変換し、認証やその他の属性を実際のHTTParty呼び出しに付加する抽象化です。

これは動作しません。応答が の場合でも202、このcaseステートメントは常にelse条件に該当します。応答が正しいことを確認するためpryに、呼び出しの後にセッションを添付しました。post

    38: def create
    39:   body = { external_id: external_id,
    40:            name:        name,
    41:            description: description }
    42:   action = post "/", body
 => 43:   case action.response.class
    44:   when Net::HTTPAccepted      then return action
    45:   when Net::HTTPNotAcceptable then raise HTTPNotAcceptable
    46:   else raise "Server responded with " + Net::HTTPResponse::CODE_TO_OBJ[action.response.code].to_s
    47:   end
    48: end

[1] (pry) #<ZynkApi::Channel>: 0> action.response.class
=> Net::HTTPAccepted

しかし、それはまだ当てはまりますelse:

[1] (pry) #<ZynkApi::Channel>: 0> action.response.class
=> Net::HTTPAccepted
[2] (pry) #<ZynkApi::Channel>: 0> n

From: /Users/cassiano/projects/Zynk/src/zynk_api/lib/zynk_api/channel.rb @ line 38 ZynkApi::Channel#create:

    38: def create
    39:   body = { external_id: external_id,
    40:            name:        name,
    41:            description: description }
    42:   action = post "/", body
    43:   case action.response.class
    44:   when Net::HTTPAccepted      then return action
    45:   when Net::HTTPNotAcceptable then raise HTTPNotAcceptable
 => 46:   else raise "Server responded with " + Net::HTTPResponse::CODE_TO_OBJ[action.response.code].to_s
    47:   end
    48: end
4

1 に答える 1

2

===メソッドを使用するような case ステートメントについて考えてみましょう。

if Net::HTTPAccepted === action.response.class
  puts 'accepted'
elsif Net::HTTPNotAcceptable === action.response.class
  puts 'not acceptable'
else
  puts 'unknown status'
end

しかし、ご存知のように、ほとんどのクラスのクラスはクラスであるため、ケースを次のように書き直す必要があります (応答時にクラス メソッドを呼び出さずに):

case action.response
  when Net::HTTPAccepted
    return action
  when Net::HTTPNotAcceptable
    raise HTTPNotAcceptable
  else
    raise "Server responded with " + Net::HTTPResponse::CODE_TO_OBJ[action.response.code].to_s
end
于 2012-08-07T11:57:17.743 に答える