【问题标题】:http get returns 403http 获取返回 403
【发布时间】:2016-09-05 18:39:52
【问题描述】:

我正在尝试从 DuckDuckGo API 获得一些即时答案,但我不断收到错误 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;
}

我似乎无法让它工作。我读过我需要将其识别为普通浏览器,但我看不出我做错了什么。有什么帮助吗?

【问题讨论】:

  • 我确认。我得到了同样的错误。我正在尝试进一步调试它。
  • 我顺利通过了它,没有任何错误。现在,我正在尝试验证返回的 JSONObject 是否有任何数据。
  • 我整理了一些有效的快速/脏代码。我会在几分钟内发布

标签: java json http get


【解决方案1】:

我用 HttpURLConnection 得到了 403(和你一样)。但是,当我使用 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();
     }
  }
}

【讨论】:

  • 嗯,修复了 403,所以谢谢你,但我如何从中获取实际信息?我只能说pastebin.com/EsVv8JTh
  • @coolnickname,你有一个解析的 json 对象(它就像一个 Map/HashMap)。您可以使用它的方法访问更多信息。这不是你要找的吗?如果您想更好地理解输出,请尝试漂亮地打印它(也许您可以使用任何可以漂亮地打印您的单行输出的免费网站)。
  • 截至 2017 年 3 月 21 日仍然没有计量/限制,但您现在需要始终如一地识别您的客户以获取结果...下面的行:conn.setRequestProperty("User-Agent","ClientName"); 必须匹配 "&t=ClientName " 包含的 URL 中的参数。这是一个适用于我的 Java 示例:api.duckduckgo.com/… 没有用户代理得到 HTTP 错误代码 500,用户代理和“t”参数不匹配得到 HTTP 301 和空白 HTML 页面只告诉我该页面重定向到主要。同时 URLencode 你的“q”参数
猜你喜欢
  • 2017-06-19
  • 2015-10-23
  • 2015-01-18
  • 2018-05-18
  • 1970-01-01
  • 2021-03-24
  • 2022-12-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多