我正在尝试通过Java访问某些URL。
在我的代码中,我提供了服务器身份验证的凭据。我还提取了服务器上可用URL的列表(xml格式),并将它们放入一个数组中,我可以自动调用列表中的每个URL。
这是我的代码:
import java.io.File;
import org.apache.http.auth.AuthScope;
import org.apache.http.auth.UsernamePasswordCredentials;
import org.apache.http.client.CredentialsProvider;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.BasicCredentialsProvider;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import java.io.FileOutputStream;
import java.lang.reflect.Array;
import org.apache.http.HttpEntity;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathExpression;
import javax.xml.xpath.XPathFactory;
import org.w3c.dom.Document;
import org.w3c.dom.NodeList;
import org.w3c.dom.Node;
public class ClientAuthentication {
public static void main(String[] args) throws Exception {
/*CREATING FILE*/
File myFile = new File("C:/input.xml");
/*DEFINING CREDENTIALS*/
CredentialsProvider credsProvider = new BasicCredentialsProvider();
credsProvider.setCredentials(new AuthScope("localhost", 80),new UsernamePasswordCredentials(" ", " "));
try (CloseableHttpClient httpclient = HttpClients.custom().setDefaultCredentialsProvider(credsProvider).build()){
HttpGet httpget = new HttpGet("http://localhost/app/rest/buildTypes");
/*WRITE TO FILE*/
try (CloseableHttpResponse response = httpclient.execute(new HttpGet("http://localhost/app/rest/buildTypes"))){
HttpEntity entity = response.getEntity();
if (entity != null) {
try (FileOutputStream outstream = new FileOutputStream(myFile)) {
entity.writeTo(outstream);
}
}
}
/*SHOW EXECUTION*/
System.out.println("Executing request " + httpget.getRequestLine());
try (CloseableHttpResponse response = httpclient.execute(httpget)) {
System.out.println("----------------------------------------");
System.out.println(response.getStatusLine());
System.out.println(EntityUtils.toString(response.getEntity()));
}
}
/*Extract all Build ID from XML file*/
DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance();
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document doc = builder.parse("C:/input.xml");
XPathFactory xPathfactory = XPathFactory.newInstance();
XPath xpath = xPathfactory.newXPath();
XPathExpression expr = xpath.compile("//buildTypes/buildType[@id]");
NodeList nl = (NodeList) expr.evaluate(doc, XPathConstants.NODESET);
/*Creating url and saving into array*/
String array[] = new String[100];
for (int i = 0; i < nl.getLength(); i++){
Node currentItem = nl.item(i);
String key = currentItem.getAttributes().getNamedItem("id").getNodeValue();
String pathing = "http://localhost/app/rest/" + (key);
System.out.println(pathing);
array[i] = pathing;
}
/*Getting the url*/
int size = Array.getLength(array);
for (int i = 0; i < size; i++){
try (CloseableHttpClient areq = HttpClients.custom().setDefaultCredentialsProvider(credsProvider).build()){
HttpGet httpget = new HttpGet(array[i]);
/*SHOW EXECUTION*/
System.out.println("Executing request " + httpget.getRequestLine());
try (CloseableHttpResponse response = areq.execute(httpget)) {
System.out.println("----------------------------------------");
System.out.println(response.getStatusLine());
System.out.println(EntityUtils.toString(response.getEntity()));
}
}
}
}
}
输出错误是:
Exception in thread "main" java.lang.NullPointerException
at java.net.URI$Parser.parse(URI.java:3042)
at java.net.URI.<init>(URI.java:588)
at java.net.URI.create(URI.java:850)
at org.apache.http.client.methods.HttpGet.<init>(HttpGet.java:66)
at ClientAuthentication.main(ClientAuthentication.java:85)
Java returned: 1 BUILD FAILED (total time: 0 seconds)
我认为问题出在代码的最后部分(获取URL)。我不知道问题是什么。有人可以帮忙吗?
答案 0 :(得分:0)
String array[] = new String[100];
for (int i = 0; i < nl.getLength(); i++){
...
为什么使用100
代替nl.getLength
?
由于您稍后迭代此数组以实现HttpGet
实例化,因此每个最后未实例化的单元格仍为null
,导致new HttpGet(array[i])
抛出异常,因为该参数不能null
1}}。
int size = Array.getLength(array);
for (int i = 0; i < size; i++){
try (CloseableHttpClient areq = HttpClients.custom().setDefaultCredentialsProvider(credsProvider).build()){
HttpGet httpget = new HttpGet(array[i]);
这将一直有效,直到您到达阵列中剩余的null
。
使用new String[nl.getLength()]
设置数组。既然你现在不需要更多。 (或更少)。