22require 'uri'
33require 'json'
44
5- module Qiita ::API
6- def self . auth ( name : name , password : password )
7- uri = URI ( 'https://qiita.com/api/v1/auth' )
8- params = { url_name : name , password : password }
9- fetch uri , params , method : :post
10- end
5+ module Qiita
6+ class API
117
12- def self . search ( query , args = { } )
13- uri = URI ( 'https://qiita.com/api/v1/search' )
14- fetch uri , { q : query } . update ( args )
15- end
8+ ENDPOINT = "https://qiita.com/api/v1/"
169
17- def self . fetch ( uri , params = { } , *args )
18- defaults = { method : :get , limit : 10 }
19- opt = args . last . kind_of? ( Hash ) ? defaults . update ( args . pop ) : defaults
20- raise ArgumentError , 'too many HTTP redirects' if opt [ :limit ] == 0
21-
22- if opt [ :method ] == :get
23- uri . query = URI . encode_www_form ( params ) if params
24- request = Net ::HTTP ::Get . new ( uri )
25- else
26- request = Net ::HTTP ::Post . new ( uri )
27- request . set_form_data ( params )
10+ def self . auth ( name : name , password : password )
11+ uri = URI . join ( ENDPOINT , 'auth' )
12+ params = { url_name : name , password : password }
13+ fetch uri , params , method : :post
2814 end
2915
30- response = Net ::HTTP . start (
31- uri . host ,
32- uri . port ,
33- :use_ssl => ( uri . scheme == 'https' ) ,
34- :verify_mode => OpenSSL ::SSL ::VERIFY_NONE
35- ) do |https |
36- https . request ( request )
16+ def self . search ( query , args = { } )
17+ uri = URI . join ( ENDPOINT , 'search' )
18+ fetch uri , { q : query } . update ( args )
3719 end
3820
39- case response
40- when Net ::HTTPSuccess
21+ def self . fetch ( uri , params = { } , *args )
22+ defaults = { method : :get , limit : 10 }
23+ opt = args . last . kind_of? ( Hash ) ? defaults . update ( args . pop ) : defaults
24+ raise ArgumentError , 'too many HTTP redirects' if opt [ :limit ] == 0
25+
26+ if opt [ :method ] == :get
27+ uri . query = URI . encode_www_form ( params ) if params
28+ request = Net ::HTTP ::Get . new ( uri )
29+ else
30+ request = Net ::HTTP ::Post . new ( uri )
31+ request . set_form_data ( params )
32+ end
33+
34+ response = Net ::HTTP . start (
35+ uri . host ,
36+ uri . port ,
37+ :use_ssl => ( uri . scheme == 'https' ) ,
38+ :verify_mode => OpenSSL ::SSL ::VERIFY_NONE
39+ ) do |https |
40+ https . request ( request )
41+ end
42+
43+ case response
44+ when Net ::HTTPSuccess
4145
42- if ( response . class . body_permitted? )
43- begin
44- JSON ( response . body )
45- rescue JSON ::ParserError
46+ if ( response . class . body_permitted? )
47+ begin
48+ JSON ( response . body )
49+ rescue JSON ::ParserError
50+ false
51+ end
52+ else
4653 false
4754 end
48- else
55+
56+ when Net ::HTTPRedirection
57+ location = response [ 'location' ]
58+ fetch ( location , limit - 1 )
59+ when Net ::HTTPUnauthorized
4960 false
61+ else
62+ response . value
5063 end
51-
52- when Net ::HTTPRedirection
53- location = response [ 'location' ]
54- fetch ( location , limit - 1 )
55- when Net ::HTTPUnauthorized
56- false
57- else
58- response . value
5964 end
6065 end
61- end
66+ end
0 commit comments