Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/383.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 具有基本身份验证的HTTP请求_Java_Android - Fatal编程技术网

Java 具有基本身份验证的HTTP请求

Java 具有基本身份验证的HTTP请求,java,android,Java,Android,我必须使用http基本身份验证从http服务器下载和解析XML文件。现在我这样做: URL url = new URL("http://SERVER.WITHOUT.AUTHENTICATION/some.xml"); DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder db = dbf.newDocumentBuilder(); Document do

我必须使用http基本身份验证从http服务器下载和解析XML文件。现在我这样做:

URL url = new URL("http://SERVER.WITHOUT.AUTHENTICATION/some.xml");
     DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
     DocumentBuilder db = dbf.newDocumentBuilder();
     Document doc = db.parse(new InputSource(url.openStream()));
     doc.getDocumentElement().normalize();
但以这种方式,我无法使用http身份验证从服务器获取xml(或者我只是不知道那个)文档


如果您能告诉我实现目标的最佳和最简单的方法,我将不胜感激。

使用HttpClient。使用HTTP AUTH执行下载的文档如下所示。获取字符串结果的文档是。然后,解析字符串(理想情况下使用SAX,而不是DOM)。

您可以使用。例如:

Authenticator.setDefault(new Authenticator() {
 @Override
        protected PasswordAuthentication getPasswordAuthentication() {
         return new PasswordAuthentication(
   "user", "password".toCharArray());
        }
});
这将设置默认的
验证器
,并将在所有请求中使用。显然,当您不需要所有请求的凭据或许多不同的凭据(可能在不同的线程上)时,安装会更加复杂

或者,您也可以使用,其中带有基本HTTP身份验证的GET请求类似于:

HttpClient httpClient = new DefaultHttpClient();
HttpGet httpGet = new HttpGet("http://foo.com/bar");
httpGet.addHeader(BasicScheme.authenticate(
 new UsernamePasswordCredentials("user", "password"),
 "UTF-8", false));

HttpResponse httpResponse = httpClient.execute(httpGet);
HttpEntity responseEntity = httpResponse.getEntity();

// read the stream returned by responseEntity.getContent()
我建议使用后者,因为它可以对您的请求进行更多的控制(例如方法、标题、超时等)。

    public String reloadTomcatWebApplication(String user, String pwd, String urlWithParameters, boolean returnResponse) {
        URL url = null;
        try {
            url = new URL(urlWithParameters);
        } catch (MalformedURLException e) {
            System.out.println("MalformedUrlException: " + e.getMessage());
            e.printStackTrace();
            return "-1";
        }
    
        URLConnection uc = null;
        try {
            uc = url.openConnection();
        } catch (IOException e) {
            System.out.println("IOException: " + e.getMessage());
            e.printStackTrace();
            return "-12";
        }
    
    
        String userpass = user + ":" + pwd;
        String basicAuth = "Basic " + javax.xml.bind.DatatypeConverter.printBase64Binary(userpass.getBytes());
    
        uc.setRequestProperty("Authorization", basicAuth);
        InputStream is = null;
        try {
            is = uc.getInputStream();
        } catch (IOException e) {
            System.out.println("IOException: " + e.getMessage());
            e.printStackTrace();
            return "-13";
        }
        if (returnResponse) {
            BufferedReader buffReader = new BufferedReader(new InputStreamReader(is));
            StringBuffer response = new StringBuffer();
    
            String line = null;
            try {
                line = buffReader.readLine();
            } catch (IOException e) {
                e.printStackTrace();
                return "-1";
            }
            while (line != null) {
                response.append(line);
                response.append('\n');
                try {
                    line = buffReader.readLine();
                } catch (IOException e) {
                    System.out.println(" IOException: " + e.getMessage());
                    e.printStackTrace();
                    return "-14";
                }
            }
            try {
                buffReader.close();
            } catch (IOException e) {
                e.printStackTrace();
                return "-15";
            }
            System.out.println("Response: " + response.toString());
            return response.toString();
        }
        return "0";
    }
    
  • DefaultHttpClient已弃用
  • addHeader必须有2个参数
使用HttpClient 4.5.2更新代码块

HttpClient httpClient = HttpClientBuilder.create().build();
HttpGet httpGet = new HttpGet("https://test.com/abc.xyz");
httpGet.addHeader("Authorization", BasicScheme.authenticate(new UsernamePasswordCredentials("login", "password"), "UTF-8"));

HttpResponse httpResponse = httpClient.execute(httpGet);
HttpEntity responseEntity = httpResponse.getEntity();

正如Gabe Rogan提到的,“从BasicScheme进行身份验证的方法已被弃用”

另一种方法是

HttpRequestBase hrb = new HttpGet(req.getUrl()); // should be your URL    
UsernamePasswordCredentials Credential= new UsernamePasswordCredentials("id", "password");
Header header = new BasicScheme(StandardCharsets.UTF_8).authenticate(Credential, hrb, null);
hrb.addHeader(header);

我更喜欢这个变量,因为它不依赖于外部API,并且特定于查询。我已经检查了json lint上的json是否正确。那么,如何消除这个错误呢。谢谢,伙计!正在执行POST请求,必须执行GET。已弃用从基本方案进行身份验证的方法: