请求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 encoding = Base64.encode(login.getBytes());
urlconn.setRequestProperty("Authorization", "Basic "+ encoding);
勉强解释: 由HttpBasic登录验证联想到spring secrity的basic登录方式,其中就是对根据用户名和密码进行Base64编码用于验证,另外就是请求头带着这些信息进行basic登录方式的验证。 另外,根据POSTMAN中的提示,Authorization的认证方式还有很多,具体业务具体分析。请求别人的接口时,还应该多沟通,选用合适的方案。
|