Server returned HTTP response code: 401 for URL解决方案

请求url时报未认证错误解决


场景:需要用户验证,验证方式为HTTP Basic 验证。
使用:
1.设置请求参数并发送post请求:

 JSONObject paramJson = new JSONObject();
        paramJson.put("car_no", "苏A535KU");
        paramJson.put("car_color", 2);
        paramJson.put("start_time", "2020-04-09 12:00");
        paramJson.put("end_time", "2020-04-09 13:00");
        String result = PostContect.sendHttpRequest("http://218.5.80.8:8065/api/v10/Car/HistoryTrackData",paramJson);

2.sendHttpRequest方法具体实现(问题出现)

public static String sendHttpRequest(String strUrl, JSONObject jsonData) {
        System.out.println("jsonData =" + jsonData.toString());

        try {
            System.out.println("======" + new String(jsonData.toString().getBytes("utf-8"), "utf-8"));
        } catch (UnsupportedEncodingException e1) {
            e1.printStackTrace();
        }
        URL url = null;
        StringBuilder result = new StringBuilder();
        BufferedReader bufferedReader = null;
        HttpURLConnection urlconn = null;
        OutputStreamWriter writer = null;
        // String string = "username:password";
        // String encoding = Base64.encode(string.getBytes());
        try {
            url = new URL(strUrl);
            urlconn = (HttpURLConnection) url.openConnection();
            urlconn.setDoInput(true);// 设置输入流采用字节流模式
            urlconn.setDoOutput(true);
            urlconn.setRequestMethod("POST");
            // post请求不能使用缓存
            urlconn.setUseCaches(false);
            urlconn.setRequestProperty("Content-Type", "application/json");
            //  + encoding
            // urlconn.setRequestProperty("Authorization", "Basic "+ encoding);
            urlconn.setConnectTimeout(5000);
            urlconn.setReadTimeout(8000);
            urlconn.connect();// 链接服务器并发送消息

            writer = new OutputStreamWriter(urlconn.getOutputStream());
            System.out.println("2=" + jsonData.toString());
            writer.write(jsonData.toString());
            writer.flush();// 发送,清除缓存

            // 开始接收返回的数据
            bufferedReader = new BufferedReader(new InputStreamReader(urlconn.getInputStream(), "UTF-8"));
            String readLine = "";
            while ((readLine = bufferedReader.readLine()) != null) {
                result.append(readLine);
            }
        } catch (MalformedURLException e) {
            e.printStackTrace();
            result.delete(0, result.length());
        } catch (IOException e) {
            e.printStackTrace();
            result.delete(0, result.length());
        } catch (Exception e) {
            e.printStackTrace();
            result.delete(0, result.length());
        } finally {
            try {
                if (writer != null) {
                    writer.close();
                }
                if (bufferedReader != null) {
                    bufferedReader.close();
                }
                if (urlconn != null) {
                    urlconn.disconnect();
                }
            } catch (IOException e) {
                result.delete(0, result.length());
            }
        }
        return result.toString();
    }

解决方案:
在sendHttpRequest方法中加入以下内容

	String login= "username:password";
	String encode = String encoding = Base64.encode(string.getBytes());
	urlconn.setRequestProperty("Authorization", "Basic "+ encoding);

勉强解释:
由HttpBasic登录验证联想到spring secrity的basic登录方式,其中就是对根据用户名和密码进行Base64编码用于验证,另外就是请求头带着这些信息进行basic登录方式的验证。

你可能感兴趣的:(http)