2014-03-29 7 views
1

나는 구글 맞춤 검색 API를 사용하고 있는데 좀 루비 코드를 통해 액세스하려고 해요 : 여기브라우저의 요청이 좋으나 루비의 요청이 잘못 되었나요?

req = Typhoeus::Request.new("https://www.googleapis.com/customsearch/v1?key={my_key}&cx=017576662512468239146:omuauf_lfve&q=" + keyword, followlocation: true) 
res = req.run 

이 나타나는 코드의 조각입니다 대답의 몸 다음과 같습니다.

<p>Your client has issued a malformed or illegal request. <ins>That’s all we know.</ins> 
' 
    from /usr/local/lib/ruby/2.1.0/json/common.rb:155:in `parse' 
    from main.rb:20:in `initialize' 
    from main.rb:41:in `new' 
    from main.rb:41:in `<main>' 

브라우저에서 똑같은 작업을 시도하면 매력처럼 작동합니다. 훨씬 더 혼란스러운 것은 12 시간 전에 동일한 코드가 작동한다는 것입니다. 찾으려는 키워드 만 변경했으나 오류가 반환되기 시작했습니다.

제안 사항? 더 많은 요청에 대해 충분한 크레딧을 가지고 있다고 확신합니다.

+0

키워드에 펑키 문자가 포함되어 있습니까? '? # & /. +'등 또는 유니 코드 문자와 비슷합니까? – amoebe

+0

"sky line"을 시도한 다음 "sky/line"을 시도하여 공간을 벗어났습니다. 아무 것도 반환하지 않는 것 같지만 오류는 – Bula

+2

'sky + line'과'sky % 20line'을 시도해보십시오. 오류를 피하기 위해'CGI :: escape'를 사용해야한다고 생각합니다 : http://ruby-doc.org/stdlib-1.9.3/libdoc/cgi/rdoc/CGI.html#method-c-escape – amoebe

답변

1

get 매개 변수 keyword에 특수 문자 문제가있을 수 있습니다. 브라우저에 URL을 입력하면 브라우저가 URL을 조정합니다. 그러나 루비의 경우 "sky line"과 같은 문자열이 "sky+line"이되는 방식으로 이러한 문자를 이스케이프 처리해야합니다. 어쨌든 Typhoeus을 사용하고 있기 때문에

req = Typhoeus::Request.new("https://www.googleapis.com/customsearch/v1?key={my_key}&cx=017576662512468239146:omuauf_lfve&q=" + CGI::escape(keyword), followlocation: true) 
res = req.run 

그러나, 당신은 할 수 있어야한다 :

require 'cgi' 
CGI::escape("sky line") 
=> "sky+line" 

귀하의 고정 된 코드는 다음과 같이 보일 것입니다 : 다음과 같이 사용되는 유틸리티 함수 CGI::escape가있다 그 params 매개 변수를 사용하고 Typhoeus가 탈출을 처리 할 수 ​​있도록 : Typhoeus' GitHub page에 더 많은 예제를있다

req = Typhoeus::Request.new(
    "https://www.googleapis.com/customsearch/v1?&cx=017576662512468239146:omuauf_lfve", 
    followlocation: true, 
    params: {q: keyword, key: my_key} 
) 
res = req.run 

.

+1

와우. Typhoeus는 훌륭합니다. 저 여분의 비트를 알려 주셔서 감사합니다. 나는 내가 좀 더 읽을 것을 확실히 할 것이다. – Bula