File Coverage

blib/lib/WebService/Rakuten.pm
Criterion Covered Total %
statement 40 198 20.2
branch 6 40 15.0
condition 4 19 21.0
subroutine 10 40 25.0
pod 27 28 96.4
total 87 325 26.7


line stmt bran cond sub pod time code
1             package WebService::Rakuten;
2              
3             our $VERSION = '0.05';
4              
5 1     1   23537 use 5.008008;
  1         4  
  1         38  
6 1     1   5 use strict;
  1         2  
  1         34  
7 1     1   4 use warnings;
  1         6  
  1         37  
8             {
9 1     1   6 use Carp;
  1         1  
  1         112  
10 1     1   1110 use LWP::UserAgent;
  1         56151  
  1         31  
11 1     1   1181 use JSON qw( from_json );
  1         13757  
  1         7  
12 1     1   4148 use Unicode::Japanese;
  1         18825  
  1         7  
13             }
14              
15             my (
16             $USER_AGENT_ALIAS, $OUTPUT_TYPE_REGEX, $DEFAULT_OUTPUT_TYPE,
17             $MT_STR, %RESPONSE_TYPE_FOR,
18             );
19             {
20 1     1   789 use Readonly;
  1         3000  
  1         3879  
21              
22             Readonly $USER_AGENT_ALIAS => __PACKAGE__ . "/$VERSION";
23             Readonly $OUTPUT_TYPE_REGEX => qr{\A (?: xml|perl|json ) \z}xms;
24             Readonly $DEFAULT_OUTPUT_TYPE => 'perl';
25             Readonly $MT_STR => "";
26              
27             Readonly %RESPONSE_TYPE_FOR => (
28             json => 'json',
29             perl => 'json',
30             xml => 'rest',
31             );
32             }
33              
34             sub new {
35 1     1 0 9 my $class = shift @_;
36              
37 1         4 my %params = _hashify(@_);
38              
39 1 50       4 croak "couldn't make sense of the parameters\n"
40             if !keys %params;
41              
42 1 50 33     5 croak "developer_id is required\n"
43             if !defined $params{developer_id} || !$params{developer_id};
44              
45 1   33     10 $params{affiliate_id} ||= $MT_STR;
46              
47 1   33     15 $params{output_type} ||= $DEFAULT_OUTPUT_TYPE;
48              
49 1 50       4 if ( $params{output_type} !~ $OUTPUT_TYPE_REGEX ) {
50              
51 0         0 carp "unrecognized output type requested ",
52             "defaulting to $DEFAULT_OUTPUT_TYPE\n";
53              
54 0         0 $params{output_type} = $DEFAULT_OUTPUT_TYPE;
55             }
56              
57 1         21 my $self = bless {
58             output_type => delete $params{output_type},
59             developer_id => delete $params{developer_id},
60             affiliate_id => delete $params{affiliate_id},
61             ua => LWP::UserAgent->new(),
62             }, $class;
63              
64 1         2953 $self->{ua}->default_header( 'User-Agent', $USER_AGENT_ALIAS );
65              
66 1         50 for my $unexpected ( keys %params ) {
67 0         0 carp "unrecognized parameter: $unexpected\n";
68             }
69              
70 1         5 return $self;
71             }
72              
73             ## Service Methods ##
74              
75             sub simplehotelsearch {
76 0     0 1 0 my $self = shift @_;
77              
78 0         0 my %params = _hashify(@_);
79              
80 0         0 my $api_url = $self->_build_url(
81             developerId => $self->{developer_id},
82             affiliateId => $self->{affiliate_id},
83             operation => 'SimpleHotelSearch',
84             version => '2008-11-13',
85             url => 'http://api.rakuten.co.jp/rws/2.0/',
86             callBack => $params{callBack},
87             largeClassCode => $params{largeClassCode},
88             middleClassCode => $params{middleClassCode},
89             smallClassCode => $params{smallClassCode},
90             detailClassCode => $params{detailClassCode},
91             hotelNo => $params{hotelNo},
92             latitude => $params{latitude},
93             longitude => $params{longitude},
94             searchRadius => $params{searchRadius},
95             squeezeCondition => $params{squeezeCondition},
96             carrier => $params{carrier},
97             hits => $params{hits},
98             datumType => $params{datumType},
99             );
100              
101 0         0 return $self->_get_results($api_url);
102             }
103              
104             sub booksgamesearch {
105 0     0 1 0 my $self = shift @_;
106              
107 0         0 my %params = _hashify(@_);
108              
109 0         0 my $api_url = $self->_build_url(
110             developerId => $self->{developer_id},
111             affiliateId => $self->{affiliate_id},
112             operation => 'BooksGameSearch',
113             version => '2009-04-15',
114             url => 'http://api.rakuten.co.jp/rws/2.0/',
115             callBack => $params{callBack},
116             title => $params{title},
117             hardware => $params{hardware},
118             makerCode => $params{makerCode},
119             label => $params{label},
120             jan => $params{jan},
121             booksGenreId => $params{booksGenreId},
122             hits => $params{hits},
123             page => $params{page},
124             availability => $params{availability},
125             outOfStockFlag => $params{outOfStockFlag},
126             sort => $params{sort},
127             carrier => $params{carrier},
128             );
129              
130 0         0 return $self->_get_results($api_url);
131             }
132              
133             sub hoteldetailsearch {
134 0     0 1 0 my $self = shift @_;
135              
136 0         0 my %params = _hashify(@_);
137              
138 0 0       0 croak "hoteldetailsearch: missing required parameter: hotelNo"
139             if !defined $params{hotelNo};
140              
141 0         0 my $api_url = $self->_build_url(
142             developerId => $self->{developer_id},
143             affiliateId => $self->{affiliate_id},
144             operation => 'HotelDetailSearch',
145             version => '2009-03-26',
146             url => 'http://api.rakuten.co.jp/rws/2.0/',
147             callBack => $params{callBack},
148             hotelNo => $params{hotelNo},
149             carrier => $params{carrier},
150             datumType => $params{datumType},
151             );
152              
153 0         0 return $self->_get_results($api_url);
154             }
155              
156             sub gethotelchainlist {
157 0     0 1 0 my $self = shift @_;
158              
159 0         0 my %params = _hashify(@_);
160              
161 0         0 my $api_url = $self->_build_url(
162             developerId => $self->{developer_id},
163             affiliateId => $self->{affiliate_id},
164             operation => 'GetHotelChainList',
165             version => '2009-05-12',
166             url => 'http://api.rakuten.co.jp/rws/2.0/',
167             callBack => $params{callBack},
168             );
169              
170 0         0 return $self->_get_results($api_url);
171             }
172              
173             sub bookssoftwaresearch {
174 0     0 1 0 my $self = shift @_;
175              
176 0         0 my %params = _hashify(@_);
177              
178 0         0 my $api_url = $self->_build_url(
179             developerId => $self->{developer_id},
180             affiliateId => $self->{affiliate_id},
181             operation => 'BooksSoftwareSearch',
182             version => '2009-04-15',
183             url => 'http://api.rakuten.co.jp/rws/2.0/',
184             callBack => $params{callBack},
185             title => $params{title},
186             os => $params{os},
187             makerCode => $params{makerCode},
188             label => $params{label},
189             jan => $params{jan},
190             booksGenreId => $params{booksGenreId},
191             hits => $params{hits},
192             page => $params{page},
193             availability => $params{availability},
194             outOfStockFlag => $params{outOfStockFlag},
195             sort => $params{sort},
196             carrier => $params{carrier},
197             );
198              
199 0         0 return $self->_get_results($api_url);
200             }
201              
202             sub bookscdsearch {
203 0     0 1 0 my $self = shift @_;
204              
205 0         0 my %params = _hashify(@_);
206              
207 0         0 my $api_url = $self->_build_url(
208             developerId => $self->{developer_id},
209             affiliateId => $self->{affiliate_id},
210             operation => 'BooksCDSearch',
211             version => '2009-04-15',
212             url => 'http://api.rakuten.co.jp/rws/2.0/',
213             callBack => $params{callBack},
214             title => $params{title},
215             artistName => $params{artistName},
216             label => $params{label},
217             jan => $params{jan},
218             booksGenreId => $params{booksGenreId},
219             hits => $params{hits},
220             page => $params{page},
221             availability => $params{availability},
222             outOfStockFlag => $params{outOfStockFlag},
223             sort => $params{sort},
224             carrier => $params{carrier},
225             );
226              
227 0         0 return $self->_get_results($api_url);
228             }
229              
230             sub vacanthotelsearch {
231 0     0 1 0 my $self = shift @_;
232              
233 0         0 my %params = _hashify(@_);
234              
235 0         0 my @required = qw( checkinDate checkoutDate );
236 0         0 for my $param (@required) {
237 0 0       0 croak "vacanthotelsearch: missing required parameter: $param"
238             if !defined $params{$param};
239             }
240              
241 0         0 my $api_url = $self->_build_url(
242             developerId => $self->{developer_id},
243             affiliateId => $self->{affiliate_id},
244             operation => 'VacantHotelSearch',
245             version => '2009-06-25',
246             url => 'http://api.rakuten.co.jp/rws/2.0/',
247             callBack => $params{callBack},
248             largeClassCode => $params{largeClassCode},
249             middleClassCode => $params{middleClassCode},
250             smallClassCode => $params{smallClassCode},
251             detailClassCode => $params{detailClassCode},
252             hotelNo => $params{hotelNo},
253             checkinDate => $params{checkinDate},
254             checkoutDate => $params{checkoutDate},
255             adultNum => $params{adultNum},
256             upClassNum => $params{upClassNum},
257             lowClassNum => $params{lowClassNum},
258             infantWithMBNum => $params{infantWithMBNum},
259             infantWithMNum => $params{infantWithMNum},
260             infantWithBNum => $params{infantWithBNum},
261             infantWithoutMBNum => $params{infantWithoutMBNum},
262             roomNum => $params{roomNum},
263             maxCharge => $params{maxCharge},
264             minCharge => $params{minCharge},
265             latitude => $params{latitude},
266             longitude => $params{longitude},
267             searchRadius => $params{searchRadius},
268             squeezeCondition => $params{squeezeCondition},
269             carrier => $params{carrier},
270             datumType => $params{datumType},
271             );
272              
273 0         0 return $self->_get_results($api_url);
274             }
275              
276             sub booksmagazinesearch {
277 0     0 1 0 my $self = shift @_;
278              
279 0         0 my %params = _hashify(@_);
280              
281 0         0 my $api_url = $self->_build_url(
282             developerId => $self->{developer_id},
283             affiliateId => $self->{affiliate_id},
284             operation => 'BooksMagazineSearch',
285             version => '2009-04-15',
286             url => 'http://api.rakuten.co.jp/rws/2.0/',
287             callBack => $params{callBack},
288             title => $params{title},
289             publisherName => $params{publisherName},
290             jan => $params{jan},
291             booksGenreId => $params{booksGenreId},
292             hits => $params{hits},
293             page => $params{page},
294             availability => $params{availability},
295             outOfStockFlag => $params{outOfStockFlag},
296             sort => $params{sort},
297             carrier => $params{carrier},
298             );
299              
300 0         0 return $self->_get_results($api_url);
301             }
302              
303             sub itemcodesearch {
304 0     0 1 0 my $self = shift @_;
305              
306 0         0 my %params = _hashify(@_);
307              
308 0 0       0 croak "itemcodesearch: missing required parameter: itemCode"
309             if !defined $params{itemCode};
310              
311 0         0 my $api_url = $self->_build_url(
312             developerId => $self->{developer_id},
313             operation => 'ItemCodeSearch',
314             version => '2007-04-11',
315             url => 'http://api.rakuten.co.jp/rws/2.0/',
316             itemCode => $params{itemCode},
317             );
318              
319 0         0 return $self->_get_results($api_url);
320             }
321              
322             sub bookstotalsearch {
323 0     0 1 0 my $self = shift @_;
324              
325 0         0 my %params = _hashify(@_);
326              
327 0         0 my $api_url = $self->_build_url(
328             developerId => $self->{developer_id},
329             affiliateId => $self->{affiliate_id},
330             operation => 'BooksTotalSearch',
331             version => '2009-04-15',
332             url => 'http://api.rakuten.co.jp/rws/2.0/',
333             callBack => $params{callBack},
334             keyword => $params{keyword},
335             booksGenreId => $params{booksGenreId},
336             hits => $params{hits},
337             page => $params{page},
338             availability => $params{availability},
339             outOfStockFlag => $params{outOfStockFlag},
340             sort => $params{sort},
341             field => $params{field},
342             carrier => $params{carrier},
343             orFlag => $params{orFlag},
344             NGKeyword => $params{NGKeyword},
345             );
346              
347 0         0 return $self->_get_results($api_url);
348             }
349              
350             sub booksforeignbooksearch {
351 0     0 1 0 my $self = shift @_;
352              
353 0         0 my %params = _hashify(@_);
354              
355 0         0 my $api_url = $self->_build_url(
356             developerId => $self->{developer_id},
357             affiliateId => $self->{affiliate_id},
358             operation => 'BooksForeignBookSearch',
359             version => '2009-04-15',
360             url => 'http://api.rakuten.co.jp/rws/2.0/',
361             callBack => $params{callBack},
362             title => $params{title},
363             author => $params{author},
364             publisherName => $params{publisherName},
365             isbn => $params{isbn},
366             booksGenreId => $params{booksGenreId},
367             hits => $params{hits},
368             page => $params{page},
369             availability => $params{availability},
370             outOfStockFlag => $params{outOfStockFlag},
371             sort => $params{sort},
372             carrier => $params{carrier},
373             );
374              
375 0         0 return $self->_get_results($api_url);
376             }
377              
378             sub genresearch {
379 0     0 1 0 my $self = shift @_;
380              
381 0         0 my %params = _hashify(@_);
382              
383 0 0       0 croak "genresearch: missing required parameter: genreId"
384             if !defined $params{genreId};
385              
386 0         0 my $api_url = $self->_build_url(
387             developerId => $self->{developer_id},
388             operation => 'GenreSearch',
389             version => '2007-04-11',
390             url => 'http://api.rakuten.co.jp/rws/2.0/',
391             genreId => $params{genreId},
392             );
393              
394 0         0 return $self->_get_results($api_url);
395             }
396              
397             sub auctionitemsearch {
398 0     0 1 0 my $self = shift @_;
399              
400 0         0 my %params = _hashify(@_);
401              
402 0         0 my $api_url = $self->_build_url(
403             developerId => $self->{developer_id},
404             affiliateId => $self->{affiliate_id},
405             operation => 'AuctionItemSearch',
406             version => '2009-05-20',
407             url => 'http://api.rakuten.co.jp/rws/2.0/',
408             callBack => $params{callBack},
409             keyword => $params{keyword},
410             genreId => $params{genreId},
411             hits => $params{hits},
412             page => $params{page},
413             minPrice => $params{minPrice},
414             maxPrice => $params{maxPrice},
415             sort => $params{sort},
416             blowFlag => $params{blowFlag},
417             itemType => $params{itemType},
418             newFlag => $params{newFlag},
419             field => $params{field},
420             carrier => $params{carrier},
421             imageFlag => $params{imageFlag},
422             orFlag => $params{orFlag},
423             NGKeyword => $params{NGKeyword},
424             );
425              
426 0         0 return $self->_get_results($api_url);
427             }
428              
429             sub dynamicad {
430 0     0 1 0 my $self = shift @_;
431              
432 0         0 my %params = _hashify(@_);
433              
434 0         0 my $api_url = $self->_build_url(
435             developerId => $self->{developer_id},
436             affiliateId => $self->{affiliate_id},
437             url => 'http://dynamic.rakuten.co.jp/rcm/1.0/i/',
438             url => $params{url},
439             carrier => $params{carrier},
440             callBack => $params{callBack},
441             );
442              
443 0         0 return $self->_get_results($api_url);
444             }
445              
446             sub cdsearch {
447 0     0 1 0 my $self = shift @_;
448              
449 0         0 my %params = _hashify(@_);
450              
451 0         0 my $api_url = $self->_build_url(
452             developerId => $self->{developer_id},
453             affiliateId => $self->{affiliate_id},
454             operation => 'CDSearch',
455             version => '2007-10-25',
456             url => 'http://api.rakuten.co.jp/rws/1.11/',
457             callBack => $params{callBack},
458             keyword => $params{keyword},
459             genreId => $params{genreId},
460             hits => $params{hits},
461             page => $params{page},
462             sort => $params{sort},
463             minPrice => $params{minPrice},
464             maxPrice => $params{maxPrice},
465             availability => $params{availability},
466             field => $params{field},
467             carrier => $params{carrier},
468             imageFlag => $params{imageFlag},
469             orFlag => $params{orFlag},
470             NGKeyword => $params{NGKeyword},
471             genreInformationFlag => $params{genreInformationFlag},
472             );
473              
474 0         0 return $self->_get_results($api_url);
475             }
476              
477             sub booksearch {
478 0     0 1 0 my $self = shift @_;
479              
480 0         0 my %params = _hashify(@_);
481              
482 0         0 my $api_url = $self->_build_url(
483             developerId => $self->{developer_id},
484             affiliateId => $self->{affiliate_id},
485             operation => 'BookSearch',
486             version => '2007-10-25',
487             url => 'http://api.rakuten.co.jp/rws/1.11/',
488             callBack => $params{callBack},
489             keyword => $params{keyword},
490             genreId => $params{genreId},
491             hits => $params{hits},
492             page => $params{page},
493             sort => $params{sort},
494             minPrice => $params{minPrice},
495             maxPrice => $params{maxPrice},
496             availability => $params{availability},
497             field => $params{field},
498             carrier => $params{carrier},
499             imageFlag => $params{imageFlag},
500             orFlag => $params{orFlag},
501             NGKeyword => $params{NGKeyword},
502             genreInformationFlag => $params{genreInformationFlag},
503             );
504              
505 0         0 return $self->_get_results($api_url);
506             }
507              
508             sub getareaclass {
509 0     0 1 0 my $self = shift @_;
510              
511 0         0 my %params = _hashify(@_);
512              
513 0         0 my $api_url = $self->_build_url(
514             developerId => $self->{developer_id},
515             affiliateId => $self->{affiliate_id},
516             operation => 'GetAreaClass',
517             version => '2009-03-26',
518             url => 'http://api.rakuten.co.jp/rws/2.0/',
519             callBack => $params{callBack},
520             );
521              
522 0         0 return $self->_get_results($api_url);
523             }
524              
525             sub hotelranking {
526 0     0 1 0 my $self = shift @_;
527              
528 0         0 my %params = _hashify(@_);
529              
530 0 0       0 croak "hotelranking: missing required parameter: genre"
531             if !defined $params{genre};
532              
533 0         0 my $api_url = $self->_build_url(
534             developerId => $self->{developer_id},
535             affiliateId => $self->{affiliate_id},
536             operation => 'HotelRanking',
537             version => '2009-06-25',
538             url => 'http://api.rakuten.co.jp/rws/2.0/',
539             callBack => $params{callBack},
540             genre => $params{genre},
541             carrier => $params{carrier},
542             );
543              
544 0         0 return $self->_get_results($api_url);
545             }
546              
547             sub catalogsearch {
548 0     0 1 0 my $self = shift @_;
549              
550 0         0 my %params = _hashify(@_);
551              
552 0         0 my $api_url = $self->_build_url(
553             developerId => $self->{developer_id},
554             affiliateId => $self->{affiliate_id},
555             operation => 'CatalogSearch',
556             version => '2009-04-15',
557             url => 'http://api.rakuten.co.jp/rws/2.0/',
558             callBack => $params{callBack},
559             keyword => $params{keyword},
560             genreId => $params{genreId},
561             hits => $params{hits},
562             page => $params{page},
563             sort => $params{sort},
564             field => $params{field},
565             imageFlag => $params{imageFlag},
566             releaseRange => $params{releaseRange},
567             orFlag => $params{orFlag},
568             NGKeyword => $params{NGKeyword},
569             genreInformationFlag => $params{genreInformationFlag},
570             );
571              
572 0         0 return $self->_get_results($api_url);
573             }
574              
575             sub booksdvdsearch {
576 0     0 1 0 my $self = shift @_;
577              
578 0         0 my %params = _hashify(@_);
579              
580 0         0 my $api_url = $self->_build_url(
581             developerId => $self->{developer_id},
582             affiliateId => $self->{affiliate_id},
583             operation => 'BooksDVDSearch',
584             version => '2009-04-15',
585             url => 'http://api.rakuten.co.jp/rws/2.0/',
586             callBack => $params{callBack},
587             title => $params{title},
588             artistName => $params{artistName},
589             label => $params{label},
590             jan => $params{jan},
591             booksGenreId => $params{booksGenreId},
592             hits => $params{hits},
593             page => $params{page},
594             availability => $params{availability},
595             outOfStockFlag => $params{outOfStockFlag},
596             sort => $params{sort},
597             carrier => $params{carrier},
598             );
599              
600 0         0 return $self->_get_results($api_url);
601             }
602              
603             sub keywordhotelsearch {
604 0     0 1 0 my $self = shift @_;
605              
606 0         0 my %params = _hashify(@_);
607              
608 0 0       0 croak "keywordhotelsearch: missing required parameter: keyword"
609             if !defined $params{keyword};
610              
611 0         0 my $api_url = $self->_build_url(
612             developerId => $self->{developer_id},
613             affiliateId => $self->{affiliate_id},
614             operation => 'KeywordHotelSearch',
615             version => '2009-04-23',
616             url => 'http://api.rakuten.co.jp/rws/2.0/',
617             callBack => $params{callBack},
618             carrier => $params{carrier},
619             page => $params{page},
620             hits => $params{hits},
621             sumDisplayFlag => $params{sumDisplayFlag},
622             keyword => $params{keyword},
623             middleClassCode => $params{middleClassCode},
624             );
625              
626 0         0 return $self->_get_results($api_url);
627             }
628              
629             sub itemranking {
630 0     0 1 0 my $self = shift @_;
631              
632 0         0 my %params = _hashify(@_);
633              
634 0         0 my $api_url = $self->_build_url(
635             developerId => $self->{developer_id},
636             affiliateId => $self->{affiliate_id},
637             operation => 'ItemRanking',
638             version => '2009-04-15',
639             url => 'http://api.rakuten.co.jp/rws/2.0/',
640             callBack => $params{callBack},
641             genreId => $params{genreId},
642             age => $params{age},
643             sex => $params{sex},
644             );
645              
646 0         0 return $self->_get_results($api_url);
647             }
648              
649             sub auctionitemcodesearch {
650 0     0 1 0 my $self = shift @_;
651              
652 0         0 my %params = _hashify(@_);
653              
654 0 0       0 croak "auctionitemcodesearch: missing required parameter: itemCode"
655             if !defined $params{itemCode};
656              
657 0         0 my $api_url = $self->_build_url(
658             developerId => $self->{developer_id},
659             affiliateId => $self->{affiliate_id},
660             operation => 'AuctionItemCodeSearch',
661             version => '2007-12-13',
662             url => 'http://api.rakuten.co.jp/rws/2.0/',
663             callBack => $params{callBack},
664             itemCode => $params{itemCode},
665             carrier => $params{carrier},
666             );
667              
668 0         0 return $self->_get_results($api_url);
669             }
670              
671             sub dvdsearch {
672 0     0 1 0 my $self = shift @_;
673              
674 0         0 my %params = _hashify(@_);
675              
676 0         0 my $api_url = $self->_build_url(
677             developerId => $self->{developer_id},
678             affiliateId => $self->{affiliate_id},
679             operation => 'DVDSearch',
680             version => '2007-10-25',
681             url => 'http://api.rakuten.co.jp/rws/1.11/',
682             callBack => $params{callBack},
683             keyword => $params{keyword},
684             genreId => $params{genreId},
685             hits => $params{hits},
686             page => $params{page},
687             sort => $params{sort},
688             minPrice => $params{minPrice},
689             maxPrice => $params{maxPrice},
690             availability => $params{availability},
691             field => $params{field},
692             carrier => $params{carrier},
693             imageFlag => $params{imageFlag},
694             orFlag => $params{orFlag},
695             NGKeyword => $params{NGKeyword},
696             genreInformationFlag => $params{genreInformationFlag},
697             );
698              
699 0         0 return $self->_get_results($api_url);
700             }
701              
702             sub itemsearch {
703 0     0 1 0 my $self = shift @_;
704              
705 0         0 my %params = _hashify(@_);
706              
707 0         0 my $api_url = $self->_build_url(
708             developerId => $self->{developer_id},
709             affiliateId => $self->{affiliate_id},
710             operation => 'ItemSearch',
711             version => '2009-04-15',
712             url => 'http://api.rakuten.co.jp/rws/2.0/',
713             callBack => $params{callBack},
714             keyword => $params{keyword},
715             shopCode => $params{shopCode},
716             genreId => $params{genreId},
717             catalogCode => $params{catalogCode},
718             hits => $params{hits},
719             page => $params{page},
720             sort => $params{sort},
721             minPrice => $params{minPrice},
722             maxPrice => $params{maxPrice},
723             availability => $params{availability},
724             field => $params{field},
725             carrier => $params{carrier},
726             imageFlag => $params{imageFlag},
727             orFlag => $params{orFlag},
728             NGKeyword => $params{NGKeyword},
729             genreInformationFlag => $params{genreInformationFlag},
730             purchaseType => $params{purchaseType},
731             );
732              
733 0         0 return $self->_get_results($api_url);
734             }
735              
736             sub booksbooksearch {
737 0     0 1 0 my $self = shift @_;
738              
739 0         0 my %params = _hashify(@_);
740              
741 0         0 my $api_url = $self->_build_url(
742             developerId => $self->{developer_id},
743             affiliateId => $self->{affiliate_id},
744             operation => 'BooksBookSearch',
745             version => '2009-04-15',
746             url => 'http://api.rakuten.co.jp/rws/2.0/',
747             callBack => $params{callBack},
748             title => $params{title},
749             author => $params{author},
750             publisherName => $params{publisherName},
751             size => $params{size},
752             isbn => $params{isbn},
753             booksGenreId => $params{booksGenreId},
754             hits => $params{hits},
755             page => $params{page},
756             availability => $params{availability},
757             outOfStockFlag => $params{outOfStockFlag},
758             sort => $params{sort},
759             carrier => $params{carrier},
760             );
761              
762 0         0 return $self->_get_results($api_url);
763             }
764              
765             sub booksgenresearch {
766 0     0 1 0 my $self = shift @_;
767              
768 0         0 my %params = _hashify(@_);
769              
770 0 0       0 croak "booksgenresearch: missing required parameter: booksGenreId"
771             if !defined $params{booksGenreId};
772              
773 0         0 my $api_url = $self->_build_url(
774             developerId => $self->{developer_id},
775             operation => 'BooksGenreSearch',
776             version => '2009-03-26',
777             url => 'http://api.rakuten.co.jp/rws/2.0/',
778             booksGenreId => $params{booksGenreId},
779             );
780              
781 0         0 return $self->_get_results($api_url);
782             }
783              
784             ## Internal Methods ##
785              
786             sub _hashify {
787              
788 1     1   1 my %params;
789              
790 1 50 33     8 if ( @_ == 1 && ref $_[0] eq 'HASH' ) {
    50          
791 0         0 %params = %{ $_[0] };
  0         0  
792             }
793             elsif ( @_ % 2 == 0 ) {
794 1         5 %params = @_;
795             }
796 1 50       5 croak "couldn\'t make sense of the parameters\n"
797             if !keys %params;
798              
799 1         5 return %params;
800             }
801              
802             sub _get_results {
803 0     0     my ( $self, $url ) = @_;
804              
805 0           my $results;
806             {
807 0           my $request = HTTP::Request->new( GET => $url );
  0            
808 0           my $response = $self->{ua}->request($request);
809 0 0         $results = $response->is_success ? $response->content : undef;
810             }
811              
812 0           utf8::decode($results);
813              
814 0 0         return $results
815             if $self->{output_type} =~ m/(?: xml|json )/xms;
816              
817 0           return from_json($results);
818             }
819              
820             sub _build_url {
821 0     0     my $self = shift @_;
822 0 0         die "unbalanced args" if @_ % 2;
823 0           my %params = @_;
824              
825 0           my $type = $RESPONSE_TYPE_FOR{ $self->{output_type} };
826              
827 0           my $url = ( delete $params{url} ) . $type;
828              
829 0           my $query_str = $MT_STR;
830             PARAM:
831 0           while ( my ( $name, $value ) = each %params ) {
832              
833             next PARAM
834 0 0         if !$value;
835              
836 0           $query_str .= "&$name=" . _url_encode( $value, 'utf8', 'utf8' );
837             }
838 0           $query_str = substr $query_str, 1;
839              
840 0           return "$url?$query_str";
841             }
842              
843             sub _url_encode {
844 0     0     my ( $value, $from_encoding, $to_encoding ) = @_;
845              
846             # Defaults to utf8 -> euc if encoding is not specified
847 0   0       $from_encoding ||= 'utf8';
848 0   0       $to_encoding ||= 'euc';
849              
850             # the easy cases: value is empty or is a number
851 0 0 0       return $value
852             if !$value || $value =~ m/\A \d+ \z/msx;
853              
854 0           my $encoded_value = $value;
855              
856 0           eval {
857 0           $encoded_value =
858             Unicode::Japanese->new( $value, $from_encoding )->$to_encoding();
859             };
860 0 0         if ($@) {
861 0           warn "$@\n";
862 0           return $value;
863             }
864              
865 0           $encoded_value =~ s/([^\w\/ ])/"%" . uc( unpack("H2", $1) )/eg;
  0            
866 0           $encoded_value =~ s/ /%20/g;
867 0           $encoded_value =~ s/[+]/%2B/g;
868              
869 0           return $encoded_value;
870             }
871              
872             1;