Java HttpURLConnection状态码302

时间:2016-09-27 19:09:23

标签: java rest alm

我试图让这个代码块运行但我一直得到302.我已经尝试显示代码的流程。我只是不知道出了什么问题。

import java.net.HttpURLConnection;
import java.util.HashMap;
import java.util.Map;
import java.util.Base64;

public class AuthenticateLoginLogoutExample {


public static void main(String[] args) throws Exception {
    new AuthenticateLoginLogoutExample().authenticateLoginLogoutExample(
                    "http://" + Constants.HOST + "/qcbin",
                    Constants.DOMAIN,
                    Constants.PROJECT,
                    Constants.USERNAME,
                    Constants.PASSWORD);
}

public void authenticateLoginLogoutExample(final String serverUrl,
      final String domain, final String project, String username,
      String password) throws Exception {

    RestConnector con =
            RestConnector.getInstance().init(
                    new HashMap<String, String>(),
                    serverUrl,
                    domain,
                    project);

    AuthenticateLoginLogoutExample example =
        new AuthenticateLoginLogoutExample();

    //if we're authenticated we'll get a null, otherwise a URL where we should login at (we're not logged in, so we'll get a URL).

当它在isAuthenticated()方法上启动时,这是下一行。

    String authenticationPoint = example.isAuthenticated();
    Assert.assertTrue("response from isAuthenticated means we're authenticated. that can't be.", authenticationPoint != null);

    //do a bunch of other stuff
}

所以我们进入isAuthenticated方法:

public String isAuthenticated() throws Exception {

    String isAuthenticateUrl = con.buildUrl("rest/is-authenticated");
    String ret;

然后在下一行尝试获得响应。 con.httpGet

    Response response = con.httpGet(isAuthenticateUrl, null, null);
    int responseCode = response.getStatusCode();

    //if already authenticated
    if (responseCode == HttpURLConnection.HTTP_OK) {

        ret = null;
    }

    //if not authenticated - get the address where to authenticate
    // via WWW-Authenticate
    else if (responseCode == HttpURLConnection.HTTP_UNAUTHORIZED) {

        Iterable<String> authenticationHeader =
                response.getResponseHeaders().get("WWW-Authenticate");

        String newUrl =
            authenticationHeader.iterator().next().split("=")[1];
        newUrl = newUrl.replace("\"", "");
        newUrl += "/authenticate";
        ret = newUrl;
    }

    //Not ok, not unauthorized. An error, such as 404, or 500
    else {

        throw response.getFailure();
    }

    return ret;
}

这会让我们跳到另一个班级并进入这个方法:

public Response httpGet(String url, String queryString, Map<String,
       String> headers)throws Exception {

    return doHttp("GET", url, queryString, null, headers, cookies);
}

doHttp将我们带到了这里。 type =&#34; GET&#34;,url =&#34; http://SERVER/qcbin/rest/is-authenticated&#34;,其余都是空的。

private Response doHttp(
        String type,
        String url,
        String queryString,
        byte[] data,
        Map<String, String> headers,
        Map<String, String> cookies) throws Exception {

    if ((queryString != null) && !queryString.isEmpty()) {

        url += "?" + queryString;
    }

    HttpURLConnection con = (HttpURLConnection) new URL(url).openConnection();

    con.setRequestMethod(type);
    String cookieString = getCookieString();

    prepareHttpRequest(con, headers, data, cookieString);

下一行的con.connect()永远不会连接。

    con.connect();
    Response ret = retrieveHtmlResponse(con);

    updateCookies(ret);

    return ret;
}

prepareHttpRequest代码:

private void prepareHttpRequest(
        HttpURLConnection con,
        Map<String, String> headers,
        byte[] bytes,
        String cookieString) throws IOException {

    String contentType = null;

    //attach cookie information if such exists
    if ((cookieString != null) && !cookieString.isEmpty()) {

        con.setRequestProperty("Cookie", cookieString);
    }

    //send data from headers
    if (headers != null) {

        //Skip the content-type header - should only be sent
        //if you actually have any content to send. see below.
        contentType = headers.remove("Content-Type");

        Iterator<Entry<String, String>>
            headersIterator = headers.entrySet().iterator();
        while (headersIterator.hasNext()) {
            Entry<String, String> header = headersIterator.next();
            con.setRequestProperty(header.getKey(), header.getValue());
        }
    }

    // If there's data to attach to the request, it's handled here.
    // Note that if data exists, we take into account previously removed
    // content-type.
    if ((bytes != null) && (bytes.length > 0)) {

        con.setDoOutput(true);

        //warning: if you add content-type header then you MUST send
        // information or receive error.
        //so only do so if you're writing information...
        if (contentType != null) {
            con.setRequestProperty("Content-Type", contentType);
        }

        OutputStream out = con.getOutputStream();
        out.write(bytes);
        out.flush();
        out.close();
    }
}

getCookieString方法:

public String getCookieString() {

    StringBuilder sb = new StringBuilder();

    if (!cookies.isEmpty()) {

        Set<Entry<String, String>> cookieEntries =
            cookies.entrySet();
        for (Entry<String, String> entry : cookieEntries) {
            sb.append(entry.getKey()).append("=").append(entry.getValue()).append(";");
        }
    }

    String ret = sb.toString();

    return ret;
}

有谁知道出了什么问题?我不知道为什么它会一直返回302.

编辑:根据要求添加了chrome开发人员图片。enter image description here

2 个答案:

答案 0 :(得分:2)

我没有关注你的整个代码,但http 302意味着重定向 https://en.wikipedia.org/wiki/HTTP_302

根据重定向的类型,可以顺利运行。例如,前几天我遇到了一个http到https重定向,我必须解决它手动检查位置标题。

我要做的是首先检查浏览器中的标题,在Chrome中查看开发人员工具,网络并查看响应标题(屏幕截图)。你应该看到那里有一个302响应的位置标题,你应该遵循新的URL。

enter image description here

答案 1 :(得分:0)

302表示那里有一个页面,但你真的想要一个不同的页面(或者你想要这个页面,然后是另一个页面)。如果你查看从服务器返回的标题,当它给你一个302时,你可能会找到一个“Location:”标题,告诉你下一步要查询的地方,你将不得不写另一个交易。

浏览器解释302响应并自动重定向到“Location:”标题中指定的URL。

相关问题