Отправка и получение почтовых данных HTTP — Java

Я пытаюсь отправить запрос через Google Safe Browsing API, но ничего не получаю и не знаю почему. Я искал это в Интернете, но каждое решение либо относится только к тому, как отправить или получить запрос POST (но не оба), либо ввод данных выполняется по-разному.

Согласно документации Google Safe Browsing:

Укажите запрошенные URL-адреса в теле запроса POST, используя следующий формат:

POST_REQ_BODY = NUM LF URL (LF URL)* NUM = (DIGIT)+ URL = URL string following the RFC 1738

-

Текст ответа:

POST_RESP_BODY = VERDICT (LF VERDICT)* VERDICT = “phishing” | “malware” | "unwanted" | “phishing,malware” >| "phishing,unwanted" | "malware,unwanted" | "phishing, malware, unwanted" >| “ok”

и отправлено по адресу:

https://sb-ssl.google.com/safebrowsing/api/lookup?client=CLIENT&key=APIKEY

Я нашел другую тему, в которой показано, как вы отправляете этот запрос, но я не уверен, как получить/распечатать ответ. Вот что я пробовал:

String baseURL="https://sb-ssl.google.com/safebrowsing/api/lookup";
String arguments = "";
arguments +=URLEncoder.encode("client", "UTF-8") + "=" + URLEncoder.encode("myapp", "UTF-8") + "&";
arguments +=URLEncoder.encode("apikey", "UTF-8") + "=" + URLEncoder.encode("12345", "UTF-8") + "&";
arguments +=URLEncoder.encode("appver", "UTF-8") + "=" + URLEncoder.encode("1.5.2", "UTF-8") + "&";
arguments +=URLEncoder.encode("pver", "UTF-8") + "=" + URLEncoder.encode("3.0", "UTF-8");

// Construct the url object representing cgi script
URL url = new URL(baseURL + "?" + arguments);

// Get a URLConnection object, to write to POST method
URLConnection connect = url.openConnection();

// Specify connection settings
connect.setDoInput(true);
connect.setDoOutput(true);

InputStream input = connect.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(input));
StringBuilder result = new StringBuilder();
String line;

// Get an output stream for writing
OutputStream output = connect.getOutputStream();
PrintStream pout = new PrintStream (output);
pout.print("2");
pout.println();
pout.print("http://www.google.com");
pout.println();
pout.print("http://www.facebook.com");
pout.close();

while((line = reader.readLine()) != null) {
   result.append(line);
}
System.out.println(result.toString());

Где ошибка?


person Chris    schedule 01.07.2015    source источник


Ответы (1)


Переместите эти строки:

InputStream input = connect.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(input));

После pout.close(); метод getInputStream фактически отправляет HTTP-запрос на сервер, в этом примере вы отправляете запрос до того, как заполните тело.

Похоже, после этого будут другие вещи, которые нужно исправить.

person Umberto Raimondi    schedule 01.07.2015
comment
Хорошо, сделал это. Что еще исправить? Спасибо за ваш ответ. - person Chris; 01.07.2015
comment
Если это ничего не работает :), мне не нравится их выбор с точки зрения формата запроса, кажется, что он немного подвержен ошибкам при создании запроса, они должны были просто использовать json или что-то более структурированное... - person Umberto Raimondi; 01.07.2015
comment
Кажется, это не работает. Я не получаю никаких ошибок, но также и никакого вывода. - person Chris; 01.07.2015
comment
Похоже, теперь получение ответа работает, но вы можете быть правы насчет самого запроса. Я сделал новый пост здесь, если вы хотите взглянуть. stackoverflow.com/questions/31182690 / Спасибо! - person Chris; 02.07.2015