【问题标题】:Apache HttpClient Error: Target host must not be null, or set in parametersApache HttpClient 错误:目标主机不能为空,或在参数中设置
【发布时间】:2014-01-01 20:04:38
【问题描述】:

我正在尝试使用 Apache HttpClient 从站点的 API 获取 JSON 响应,但它给了我“IllegalStateException:目标主机不能为空,或在参数中设置。”

Java 代码:

private String orderInURL = "https://r-test.ordr.in";

public String deliveryList(String datetime, String zip, String city, String addr) throws ClientProtocolException, IOException {
    String listURL = orderInURL+"/dl/" + datetime + "/" + zip + "/" + city + "/" + 
                addr + "?_auth=1," + this.privateKey;
    DefaultHttpClient httpClient = new DefaultHttpClient();
    HttpGet getRequest = new HttpGet(URLEncoder.encode(listURL, "UTF-8"));

    //header
    getRequest.setHeader("accept", "application/json");

    HttpResponse response = httpClient.execute(getRequest);

    if (response.getStatusLine().getStatusCode() != 200) {
        throw new RuntimeException("Failed : HTTP error code : "
           + response.getStatusLine().getStatusCode());
    }

    BufferedReader br = new BufferedReader(
            new InputStreamReader((response.getEntity().getContent())));

    String output;
    System.out.println("Output from Server .... \n");
    while ((output = br.readLine()) != null) {
        System.out.println(output);
    }

    httpClient.getConnectionManager().shutdown();
    return output;
}


 ....
 System.out.println(orderin.deliveryList("ASAP", "11111", "MyCity", "100 My Address"));

GET URL 结果是:

https://r-test.ordr.in/dl/ASAP/11111/MyCity/100%20My%20Address?_auth=1,XXXXXXXXXXXXXXXXX

如果您将 XXXXXXXXX... 替换为私钥。如果我只是复制此 URL 并将其放入浏览器中,则会返回正确的 JSON。我不知道为什么它不会在 Java 中返回正确的结果。任何帮助表示赞赏。

【问题讨论】:

    标签: java json apache http httpclient


    【解决方案1】:

    不确定问题出在哪里,但有一种更简单的方法可以从 URL 读取 JSON。试试这样的:

    public static String readJsonFromUrl(String url) throws IOException
    {
        InputStream is = new URL(url).openStream();
        try {
          BufferedReader rd = new BufferedReader(
                  new InputStreamReader(is, Charset.forName("UTF-8")));
          String jsonText = readAll(rd);
          return jsonText;
        } finally {
          is.close();
        }
        return "";
    }
    
    private static String readAll(Reader rd) throws IOException 
    {
        StringBuilder sb = new StringBuilder();
        int cp;
        while ((cp = rd.read()) != -1) {
          sb.append((char) cp);
        }
        return sb.toString();
    }
    

    【讨论】:

      【解决方案2】:

      rfc2616 要求 HTTP 1.1 服务器拒绝没有 Host 标头的 HTTP 请求,请参阅rfc2616 第 14.23 节。 在调用httpClient.execute之前尝试添加以下行:

      getRequest.setHeader("host", "r-test.ordr.in");
      

      【讨论】:

        猜你喜欢
        • 2013-08-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多