HttpUrlConnection.getInputStream上的HTTP响应代码401

时间:2018-11-07 12:21:53

标签: java http httpurlconnection http-status-code-401

请考虑以下代码段:

    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

2 个答案:

答案 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。问他们如何处理。了解您是否需要一个帐户,以及如何获得一个帐户。