首页 > 解决方案 > Okhttp - java,从响应中获取 url 的问题

问题描述

我正在尝试登录名为 Stockx ( http://stockx.com/login ) 的网站。要发送适当的请求,我需要来自响应(fetchstate)标头或 url 的 state 和 clientID。ClientID 没问题,但状态应如下所示:

hKFo2SBTb0hLMENwUHFIWXlLcTVRaTU2RUduMkR6T2NnMXFhcqFupWxvZ2luo3RpZNkgdnY2emVyNjdzU1o0ekI4YV9RQll2Q3lvVWNld3B5TV-jY2lk2SBPVnhydDRWSnFUeDdMSVVLZDY2MVcwRHVWTXBjRkJ5

但我的代码总是给出:%7B%7D

这是我的代码

public class Stockx_login {
    String email;
    String password;
    OkHttpClient client;
    CookieJar cookieJar;

    public Stockx_login(String email, String password) throws IOException {
        this.email = email;
        this.password = password;

        this.cookieJar = new CookieJar() {
            private final HashMap<String, List<Cookie>> cookieStore = new HashMap<>();

            @Override
            public void saveFromResponse(HttpUrl url, @NotNull List<Cookie> cookies) {
                cookieStore.put(url.host(), cookies);
            }

            @Override
            public List<Cookie> loadForRequest(HttpUrl url) {
                List<Cookie> cookies = cookieStore.get(url.host());
                return cookies != null ? cookies : new ArrayList<>();
            }
        };

        this.client = new OkHttpClient.Builder()
                .cookieJar(cookieJar)
                .followRedirects(true)
                .build();

        Request request = new Request.Builder().url("https://stockx.com/").build();
        client.newCall(request).execute();
    }
    
    public void fetchState() throws IOException{

        String endpoint = "https://stockx.com/login";

        Request request = new Request.Builder().url(endpoint)
                .addHeader("Host", "stockx.com")
                .addHeader("upgrade-insecure-requests", "1")
                .addHeader("user-agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.128 Safari/537.36")
                .addHeader("sec-fetch-mode", "navigate")
                .addHeader("sec-fetch-user", "?1")
                .addHeader("accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9")
                .addHeader("sec-fetch-site", "none")
                .addHeader("accept-language", "pl-PL,pl;q=0.9,en-US;q=0.8,en;q=0.7")
                .build();

        Response response = client.newCall(request).execute();

        if (response.code()==200) {
            String referrer = response.toString();
            String state = referrer.split("state=")[1].split("&")[0];
            String clientID = referrer.split("client_id=")[1].split("&")[0];
            System.out.println(state);
        }
    }
}

标签: javarequestokhttp

解决方案


你能发布你为推荐人获得的价值吗?

but my code always gives: %7B%7D

您可能必须使用URLDecoder.decode


推荐阅读