我必须打一个休息网址,在此之前我通过传递用户名/密码来登录另一个用于登录目的的网址。我从第一个网址得到200 OK。现在,当我尝试使用另一个REST URL时,它给我401错误。代码如下"
String urlParameters = "username=a&password=b&rememberme=false";
byte[] postData = urlParameters.getBytes( StandardCharsets.UTF_8 );
int postDataLength = postData.length;
URL url = new URL("myloginurl");
HttpURLConnection con = (HttpURLConnection) url.openConnection();
con.setDoOutput(true);
con.setRequestMethod("POST");
con.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
con.setRequestProperty("charset", "UTF-8");
con.setRequestProperty( "Content-Length", Integer.toString( postDataLength ));
con.setUseCaches( false );
try( DataOutputStream wr = new DataOutputStream( con.getOutputStream())) {
wr.write( postData );
}
int respCode = con.getResponseCode();
if(respCode==200){
urlParameters = "id=x&col1=y&op1=z&val1=t";
postData = urlParameters.getBytes( StandardCharsets.UTF_8 );
postDataLength = postData.length;
url = new URL("myanotherurl");
con.setDoOutput(true);
con = (HttpURLConnection) url.openConnection();
con.setRequestMethod("POST");
con.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
con.setRequestProperty("charset", "UTF-8");
con.setRequestProperty( "Content-Length", Integer.toString( postDataLength ));
con.setUseCaches( false );
try( DataOutputStream wr = new DataOutputStream( con.getOutputStream())) {
wr.write( postData );
}
System.out.println(con.getResponseCode());
}
任何人都可以指出我在做错的地方。另请告诉我有没有更好的方法来编写此代码。
由于
答案 0 :(得分:0)
服务器应在第一个请求中以新cookie的形式返回会话ID。您必须在第二个请求中包含该cookie,以便服务器可以识别您的身份。 Cookie在http标头中发送。
从第一个请求获得响应代码后,您可以获取新的cookie值,如:
String cookieValue = con.getHeaderFields()
.getOrDefault("Set-Cookie", Collections.emptyList())
.stream()
.map(str -> str.split(";")[0])
.collect(joining("; "));
然后在下一个请求中使用该值作为cookie:
con.setRequestProperty("Cookie", cookieValue);