2016-09-05 1 views
0

Я пытаюсь получить мгновенный ответ от API DuckDuckGo, но я получаю ошибку 403. Вот мой код до сих пор:HTTP GET возвращает 403

static JSONObject getData(String term){ 
    JSONParser parser = new JSONParser(); 
    JSONObject json = null; 
    term = term.replaceAll(" ", "%20"); 

    try { 
     URL ob=new URL("http://api.duckduckgo.com/?q=" + term + "&format=json&pretty=0"); 
     HttpURLConnection con=(HttpURLConnection) ob.openConnection(); 
     con.setRequestMethod("GET"); 
     con.setRequestProperty("USER_AGENT", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.95 Safari/537.11"); 

     BufferedReader br = new BufferedReader((new InputStreamReader(con.getInputStream()))); 
     json = (JSONObject) parser.parse(br.readLine()); 
    } catch (Exception ex) { 
     ex.printStackTrace(); 
    } 
    return json; 
} 

Я не могу показаться, чтобы получить его работать. Я читал, что мне нужно идентифицировать как обычный браузер, но я не вижу, что я делаю неправильно. Любая помощь в этом?

+0

Подтверждение. У меня такая же ошибка. Я пытаюсь отладить его дальше. – blackpen

+0

Я прошел через него без каких-либо ошибок. Теперь я пытаюсь проверить, есть ли у возвращаемого JSONObject какие-либо данные. – blackpen

+0

Я собрал некоторый быстрый/грязный код, который сработал. Я отправлю через несколько минут – blackpen

ответ

1

Я получил 403 (то же самое, что и вы) с HttpURLConnection. Но он работал, когда я использовал URLConnection вместо HttpURLConnection. Из-за быстрой доступности я просто использовал парсер org.json.simple. Объект json напечатал анализируемые данные в конце.

import java.io.*; 
import java.net.*; 
import java.util.*; 

import org.json.simple.*; 
import org.json.simple.parser.*; 

public class HelloWorld{ 

    public static void main(String []args){ 

    try { 
     JSONParser parser = new JSONParser(); 
     JSONObject json = null; 
     URL url = new URL("http://api.duckduckgo.com/?q=science&format=json&pretty=0"); 
     URLConnection conn = url.openConnection(); 
     conn.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-GB;  rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13 (.NET CLR 3.5.30729)"); 

     Scanner scn = new Scanner(conn.getInputStream()).useDelimiter("\\A"); 
     String buffer = scn.hasNext() ? scn.next() : ""; 
     json = (JSONObject) parser.parse(buffer); 
     System.out.println(json.toString()); 

    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    } 
} 
+0

Хорошо, что исправил 403, поэтому спасибо за это, но как мне получить от него фактическую информацию? Все, что я могу сказать, это http://pastebin.com/EsVv8JTh –

+0

@coolnickname. У вас есть разобранный json-объект (он похож на Map/HashMap). Вы можете получить доступ к дополнительной информации, используя ее методы. Разве это не то, что вы искали? Если вы хотите лучше понять выход, попробуйте распечатать его (возможно, вы можете использовать любой бесплатный сайт, который красиво печатает ваш один вывод линейки). – blackpen

+0

По состоянию на 2017-03-21 все еще нет замера/ограничений, но теперь вам нужно постоянно идентифицировать своего клиента, чтобы получить результаты назад ... строка ниже: 'conn.setRequestProperty (« User-Agent »,« ClientName »); ' Должен соответствовать параметру« & t = ClientName »в URL-адресе, который включает. Вот пример, который работал для меня с Java: http://api.duckduckgo.com/?format=json&pretty=1&t=ClientName&q=Elephant+and+Castle Без User-Agent получил HTTP-код ошибки 500, Агент и параметр «t», которые не совпадают, получают HTTP 301 и пустую HTML-страницу, сообщающую мне только, что страница перенаправляется на главную. Также URLencode ваш параметр «q» – bcmoney

 Смежные вопросы

  • Нет связанных вопросов^_^