请考虑以下代码段:
URL url = new URL("https://wfs.geodienste.ch/av/deu?&LAYERS=LCSFC,SOLI,SOSFC,LOCPOS,HADR,LNNA,OSNR,RESF,OSBP,MBSF&FORMAT=image%2Fjpeg&DPI=100&SERVICE=WMS&VERSION=1.1.1&REQUEST=GetMap&STYLES=&SRS=EPSG%3A2056&BBOX=2637158.3069220297,1236087.7425729688,2639935,1237632&WIDTH=2463&HEIGHT=1369");
HttpURLConnection uc = (HttpURLConnection) url.openConnection();
InputStream is = uc.getInputStream();
对于给定的URL,我会收到401异常:
java.io.IOException: Server returned HTTP response code: 401 for URL: https://wfs.geodienste.ch/av/deu?&LAYERS=LCSFC,SOLI,SOSFC,LOCPOS,HADR,LNNA,OSNR,RESF,OSBP,MBSF&FORMAT=image%2Fjpeg&DPI=100&SERVICE=WMS&VERSION=1.1.1&REQUEST=GetMap&STYLES=&SRS=EPSG%3A2056&BBOX=2637158.3069220297,1236087.7425729688,2639935,1237632&WIDTH=2463&HEIGHT=1369
at sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1839)
at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1440)
at sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:254)
at HTTPTestMain.doit(HTTPTestMain.java:43)
at HTTPTestMain.main(HTTPTestMain.java:28)
现在,我希望该URL在与浏览器一起使用时会要求一些凭据。出乎意料的是,不需要凭据,并且响应例如Firefox是200。
出于好奇,我添加了以下代码行:
uc.setRequestProperty("Authorization", "Basic ");
仍然是相同的401响应。
您能告诉我使用Java正确获得响应需要什么吗?
亲切的问候 Klib
答案 0 :(得分:0)
401的意思是“未经授权”,因此您的凭据必须包含某些内容。您可以使用身份验证器
enter code here
Authenticator.setDefault(new Authenticator(){
@Override
protected PasswordAuthentication getPasswordAuthentication(){
return new PasswordAuthentication(login, password.toCharArray());
}
});
答案 1 :(得分:0)
我也能够从浏览器访问该页面而无需输入任何密码。
他们对待网络浏览器的请求与程序性请求的方式可能有所不同;即通过自动刮板例如,他们可能正在查看您请求中的“ User-Agent”标头。
但是,如果您尝试对此进行逆向工程以规避可能的限制,他们可能会决定使用其他机制来阻止您。
我认为您需要与网站的支持部门联系:https://geodienste.ch/support。问他们如何处理。了解您是否需要一个帐户,以及如何获得一个帐户。