Как передать параметры в гет запрос на Java

566
16 мая 2017, 02:16
    public void getCategory() {
    String sResult = "";
    try {
        oUrl = new URL(sUrl);
        sParams = "token="+sToken;
        oConnect = (HttpURLConnection) oUrl.openConnection();
        oConnect.setDoInput(true);
        oConnect.setDoOutput(true);
        oConnect.setRequestProperty("Pragma","no-cache");
        oConnect.setRequestProperty("Content-type", "application/x-www-form-urlencoded");
        oConnect.setRequestProperty("Content-Length", Integer.toString(sParams.length()));
        oReader  = new BufferedReader(new InputStreamReader(oConnect.getInputStream()));
        while ((sLine = oReader.readLine()) != null) {
            sResult += sLine;
        }
        oReader.close();
    } catch (Exception error){
        System.out.print(error.toString());
    }
    System.out.print(sResult);
}
Answer 1

Как заметил @Victor, параметры GET-запроса - это параметры URL, идущие после символа ?, разделённые символом &, состоящие из имени параметра, символа = и значения параметра, а так же соответствующим образом кодированные.

Наиболее удобный, на мой взгляд, способ конструирования URL с параметрами - это URLBuilder. Люблю я fluent interface. Поиск в Google по запросу "java urlbuilder" возвращает немало результатов, в том числе URLBuilder, входящий в состав Apache HttpClient. Его и рекомендую использовать. Впрочем, если есть желание понять принцип, то можно и свой велосипед изобрести:

public class URLBuilder {
    private String url;
    private List<String> params;
    public URLBuilder() {
        url = "";
        params = new ArrayList<>();
    }
    public URLBuilder(String url) {
        this();
        this.url = url;
    }
    public URLBuilder withProtocol(String protocol) throws IllegalStateException {
        if (!url.isEmpty())
            throw new IllegalStateException("Метод должен вызываться первым");
        url = protocol + "://";
        return this;
    }
    public URLBuilder withHost(String host) {
        if (url.isEmpty())
            throw new IllegalStateException("Не определён протокол");
        url += host;
        return this;
    }
    public URLBuilder withPath(String ... path) {
        if (!url.endsWith("/"))
            url += "/";
        if (path.length > 0)
            url += String.join("/", path);
        else
            url += path;
        return this;
    }
    public URLBuilder withParam(String name, String value) throws UnsupportedEncodingException {
        String charset = Charset.defaultCharset().name();
        String encodedName = URLEncoder.encode(name, charset);
        String encodedValue = URLEncoder.encode(value, charset);
        params.add(encodedName + "=" + encodedValue);
        return this;
    }
    public URL build() throws MalformedURLException {
        return new URL(this.toString());
    }
    @Override
    public String toString() {
        return url + "?" + String.join("&", params);
    }
}

Естественно, класс для простоты примера предельно примитивен и не учитывает множество факторов, но в простых случаях задачу решает:

URL url = new URLBuilder("https://ru.stackoverflow.com/unanswered/tagged/")
    .withParam("page", "2")
    .withParam("tab", "новые")
    .build();

Что даст https://ru.stackoverflow.com/unanswered/tagged/?page=2&tab=%ED%EE%E2%FB%E5

READ ALSO
Как подключить svg спрайт в файл в html и css

Как подключить svg спрайт в файл в html и css

Есть сгенерированый svg спрайт - spritesvg c symbol:

719
Изменяющая рамка сайта

Изменяющая рамка сайта

Привет, ребятаЯ верстаю сайт по макету и как вы могли заметить, есть серая рамка, которая должна меняться в зависимости от размера окна браузера,...

251