Bazaprogram.ru

Новости из мира ПК
3 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Java net httpurlconnection

Java.net.HttpURLConnection > 31.12.2019 Java

Класс HttpURLConnection является абстрактным классом, непосредственно выходящим из класса URLConnection . Он включает в себя все функциональные возможности своего родительского класса с дополнительными специфическими функциями HTTP. HttpsURLConnection — это другой класс, который используется для более защищенного протокола HTTPS.
Где это используется?
Это один из самых популярных среди разработчиков Java вариантов взаимодействия с веб-серверами, и команда разработчиков Android официально предложила использовать его везде, где это возможно.
В конце, эта статья иллюстрирует простую реализацию интерактивного приложения, которое использует API эмоций Microsoft для получения оценок эмоций из изображения с использованием методов класса HttpURLConnection.

Конструктор:

Методы (кроме класса URLConnection):

  1. getResponseCode (): Используется для получения статуса ответа с сервера.
  2. setRequestMethod (): используется для установки метода запроса. По умолчанию это GET.
  3. getRequestMethod (): возвращает метод запроса.
  4. getResponseMessage (): извлекает ответное сообщение.
  5. getHeaderField (): возвращает n- ное поле заголовка или ноль, если оно не существует. Переопределяет метод getHeaderField класса URLConnection.
  6. setFixedLengthStreamingMode (): используется для установки длины содержимого, записанного в outputtream, если оно известно заранее.
  7. setFollowRedirects (): Устанавливает, будут ли запросы кода ответа 3xx перенаправляться автоматически или нет.
  8. getFollowRedirects (): возвращает true или false в зависимости от автоматического перенаправления или нет.
  9. disconnect (): указывает на то, что запросы к серверу маловероятны в будущем.
  10. usingProxy (): возвращает true, если соединение установлено с использованием прокси, иначе false.
  11. setChunkedStreamingMode (): этот режим используется, когда длина содержимого неизвестна. Вместо того, чтобы создавать буфер фиксированной длины и записывать его на сервер, содержимое разбивается на куски, а затем записывается. Не все серверы поддерживают этот режим.
  12. getPermission (): извлекает разрешение, необходимое для подключения к целевому хосту и порту.
  13. getErrorStream (): Получает поток ошибок, если сервер не может быть подключен или произошла какая-либо ошибка. Может содержать информацию о том, как исправить ошибку с сервера.
  14. setInstanceFollowRedirects (): Устанавливает, будут ли запросы кода ответа 3xx автоматически перенаправляться этим экземпляром httpURLconnection. Он переопределяет более общие setFollowRedirects
    параметр. Если не указан, то экземпляр перенаправляет на основе setFollowRedirects ().
  15. getInstanceFollowRedirects (): возвращает значение true или false, в зависимости от того, установлено или нет автоматическое перенаправление экземпляра.

Обратитесь к статье URLConnection для всех методов, унаследованных от него.

Реализация Java:

// Java-программа для иллюстрации
// использование HttpURLConnection
// чтобы получить оценку эмоций
// изображения с использованием Microsoft Emotion API

Блог только про Java

Учимся программировать на Java с нуля

Обзор класса HttpURLConnection Java, примеры работающих программ

В Java предоставляется подкласс HttpURLConnection, производный от класса URLConnection и поддерживающий соединения по сетевому протоколу НТТР. Чтобы получить объект класса HttpURLConnection, следует вызвать метод openConnection() для объекта типа URL, как описано в данной статье, но результат нужно привести к типу HttpURLConnection.

Разумеется , при этом необходимо убедиться, что соединение по протоколу HTTP действительно установлено. Получив ссылку HttpURLConnection , можно вызвать любые методы, унаследованные от класса URLConnection, а также любые методы, определенные в самом классе HttpURLConnection.

Некоторые методы из этого класса перечислены ниже:

static boolean getFollowRedirects() — возвращает логическое значение true, если автома­тически следует переадресация, а иначе — логическое значение false.

String getRequestMethod() — возвращает строковое представление метода, которым выполняется запрос по URL. По умолчанию запрос выполняется методом GET. Доступны и другие методы, в том числе и POST.

int getResponseCode() throws IOException — возвращает код ответа по протоколу НТТР. Если код ответа не может быть получен, возвращается значе­ние — 1. При разрыве соединения генерируется исклю­чение типа IОЕхсерtiоn.

String getResponseMessage() throws IOException — возвращает ответное сообщение, связанное с кодом ответа. Если ответное сообщение отсутствует, то воз­вращает пустое значение null.

static void setFollowRadirects(boolean способ) — если параметр способ принимает логическое значение true, то переадресация выполняется автоматически. Если же он принимает логическое значение false, то переадресация не происходит. По умолчанию пере­адресация выполняется автоматически.

void setRequestмethod(String способ) throws ProtocolZxception — задает метод, которым делаются запросы по прото­колу HTTP, в соответствии со значением параметра способ. По умолчанию принят метод GET, но доступны и другие методы, в том числе POST. Если в качестве параметра способ указано неправильное значение, то генерируется исключение типа ProtocolExoeption.

Читать еще:  Java lang number

В приведенном ниже примере программы демонстрируется применение класса HttpURLConnection. Сначала в этой программе устанавливается соединение с веб-сайтом pro-java.ru, а затем выводится метод запроса, код ответа и ответное сообщение. И наконец, выводятся ключи и значения из заголовка ответа.

Ниже приведен результат, выводимый данной программой ( разумеется, точный ответ, возвращаемый сайтом pro-java.ru, будет меняться с течением времени).

Обратите внимание на порядок вывода ключей и значений из заголовка. Сначала вызывается метод getHeaderFields() , унаследованный от класса URLConnection, чтобы получить отображение ключей и значений из заголовка. Затем для этого отображения вызывается метод keySet(), чтобы извлечь мно­жество ключей из заголовка. Далее полученное множество ключей перебирается в цикле for в стиле for each, где вызывается также метод get(), чтобы получить значение, связанное с каждым ключом.

How to use java.net.URLConnection to fire and handle HTTP requests?

Use of java.net.URLConnection is asked about pretty often here, and the Oracle tutorial is too concise about it.

That tutorial basically only shows how to fire a GET request and read the response. It doesn’t explain anywhere how to use it to among others perform a POST request, set request headers, read response headers, deal with cookies, submit a HTML form, upload a file, etc.

So, how can I use java.net.URLConnection to fire and handle «advanced» HTTP requests?

11 Answers 11

First a disclaimer beforehand: the posted code snippets are all basic examples. You’ll need to handle trivial IOException s and RuntimeException s like NullPointerException , ArrayIndexOutOfBoundsException and consorts yourself.

Preparing

We first need to know at least the URL and the charset. The parameters are optional and depend on the functional requirements.

The query parameters must be in name=value format and be concatenated by & . You would normally also URL-encode the query parameters with the specified charset using URLEncoder#encode() .

The String#format() is just for convenience. I prefer it when I would need the String concatenation operator + more than twice.

Firing a HTTP GET request with (optionally) query parameters

It’s a trivial task. It’s the default request method.

Any query string should be concatenated to the URL using ? . The Accept-Charset header may hint the server what encoding the parameters are in. If you don’t send any query string, then you can leave the Accept-Charset header away. If you don’t need to set any headers, then you can even use the URL#openStream() shortcut method.

Either way, if the other side is a HttpServlet , then its doGet() method will be called and the parameters will be available by HttpServletRequest#getParameter() .

For testing purposes, you can print the response body to stdout as below:

Firing a HTTP POST request with query parameters

Setting the URLConnection#setDoOutput() to true implicitly sets the request method to POST. The standard HTTP POST as web forms do is of type application/x-www-form-urlencoded wherein the query string is written to the request body.

Note: whenever you’d like to submit a HTML form programmatically, don’t forget to take the name=value pairs of any elements into the query string and of course also the name=value pair of the element which you’d like to «press» programmatically (because that’s usually been used in the server side to distinguish if a button was pressed and if so, which one).

You can also cast the obtained URLConnection to HttpURLConnection and use its HttpURLConnection#setRequestMethod() instead. But if you’re trying to use the connection for output you still need to set URLConnection#setDoOutput() to true .

Either way, if the other side is a HttpServlet , then its doPost() method will be called and the parameters will be available by HttpServletRequest#getParameter() .

Читать еще:  Unexpected identifier javascript

Actually firing the HTTP request

You can fire the HTTP request explicitly with URLConnection#connect() , but the request will automatically be fired on demand when you want to get any information about the HTTP response, such as the response body using URLConnection#getInputStream() and so on. The above examples does exactly that, so the connect() call is in fact superfluous.

Gathering HTTP response information

You need a HttpURLConnection here. Cast it first if necessary.

When the Content-Type contains a charset parameter, then the response body is likely text based and we’d like to process the response body with the server-side specified character encoding then.

Maintaining the session

The server side session is usually backed by a cookie. Some web forms require that you’re logged in and/or are tracked by a session. You can use the CookieHandler API to maintain cookies. You need to prepare a CookieManager with a CookiePolicy of ACCEPT_ALL before sending all HTTP requests.

Note that this is known to not always work properly in all circumstances. If it fails for you, then best is to manually gather and set the cookie headers. You basically need to grab all Set-Cookie headers from the response of the login or the first GET request and then pass this through the subsequent requests.

The split(«;», 2)[0] is there to get rid of cookie attributes which are irrelevant for the server side like expires , path , etc. Alternatively, you could also use cookie.substring(0, cookie.indexOf(‘;’)) instead of split() .

Streaming mode

The HttpURLConnection will by default buffer the entire request body before actually sending it, regardless of whether you’ve set a fixed content length yourself using connection.setRequestProperty(«Content-Length», contentLength); . This may cause OutOfMemoryException s whenever you concurrently send large POST requests (e.g. uploading files). To avoid this, you would like to set the HttpURLConnection#setFixedLengthStreamingMode() .

But if the content length is really not known beforehand, then you can make use of chunked streaming mode by setting the HttpURLConnection#setChunkedStreamingMode() accordingly. This will set the HTTP Transfer-Encoding header to chunked which will force the request body being sent in chunks. The below example will send the body in chunks of 1KB.

User-Agent

It can happen that a request returns an unexpected response, while it works fine with a real web browser. The server side is probably blocking requests based on the User-Agent request header. The URLConnection will by default set it to Java/1.6.0_19 where the last part is obviously the JRE version. You can override this as follows:

Use the User-Agent string from a recent browser.

Error handling

If the HTTP response code is 4nn (Client Error) or 5nn (Server Error), then you may want to read the HttpURLConnection#getErrorStream() to see if the server has sent any useful error information.

If the HTTP response code is -1, then something went wrong with connection and response handling. The HttpURLConnection implementation is in older JREs somewhat buggy with keeping connections alive. You may want to turn it off by setting the http.keepAlive system property to false . You can do this programmatically in the beginning of your application by:

Uploading files

You’d normally use multipart/form-data encoding for mixed POST content (binary and character data). The encoding is in more detail described in RFC2388.

If the other side is a HttpServlet , then its doPost() method will be called and the parts will be available by HttpServletRequest#getPart() (note, thus not getParameter() and so on!). The getPart() method is however relatively new, it’s introduced in Servlet 3.0 (Glassfish 3, Tomcat 7, etc). Prior to Servlet 3.0, your best choice is using Apache Commons FileUpload to parse a multipart/form-data request. Also see this answer for examples of both the FileUpload and the Servelt 3.0 approaches.

Читать еще:  Ошибка autodesk installer

Dealing with untrusted or misconfigured HTTPS sites

Sometimes you need to connect a HTTPS URL, perhaps because you’re writing a web scraper. In that case, you may likely face a javax.net.ssl.SSLException: Not trusted server certificate on some HTTPS sites who doesn’t keep their SSL certificates up to date, or a java.security.cert.CertificateException: No subject alternative DNS name matching [hostname] found or javax.net.ssl.SSLProtocolException: handshake alert: unrecognized_name on some misconfigured HTTPS sites.

The following one-time-run static initializer in your web scraper class should make HttpsURLConnection more lenient as to those HTTPS sites and thus not throw those exceptions anymore.

Last words

The Apache HttpComponents HttpClient is much more convenient in this all 🙂

Parsing and extracting HTML

If all you want is parsing and extracting data from HTML, then better use a HTML parser like Jsoup

Особенности HttpUrlConnection из java.net

сегодня постараюсь рассказать о том, как можно отправить запрос и прочитать ответ от HTTP сервера, используя URLConnection из библиотеки JRE.

Сейчас изучаем Java в онлайн режиме. Вся наша команда использует Slack для работы и общения. Для получения информации о пользователях, используем Slack API. Чтобы долго не рассказывать про сам API (это тема для отдельной статьи), скажу коротко: Slack API построен на HTTP протоколе, для получения информации о пользователях, нужно отправить запрос с URI в котором должно быть имя метода из API на host-адресс api.slack.com Вот список некторых методов:

  • users.list
  • chat.postMessage
  • conversations.create
  • files.upload
  • im.open

Для получения списка юзеро нужен метод users.list. Формируем URI — /api/users.list в теле запроса должен быть токен аутентификации в форме application/x-www-form-urlencoded, то есть запрос должен выглядеть примерно так (но есть один нюанс который будет ниже):

Я знал про библиотеку Apache HttpComponents, но для иследовательских целей будем использовать средства доступные в стандартной библиотеке Java 8, а именно имплементацию java.net.URLConnection.

Для получений сущности URLConnection нужно использовать объект класса java.net.URL, его конструктор принимает тип String где помимо всего должен быть указан протокол – в нашем случае https.

После получения сущности URL, вызываем метод openConnection() который возвратит нам сущность HttpsUrlConnection.

При этом нужно обработать или пробросить MalformedUrlException и IOException.

После этого переменная connection будет хранить ссылку на объект HttpsUrlConnectionImpl. По умолчанию будет формироваться GET-запрос, для того чтобы добавить Header используем метод setRequestProperty(), который принимает key и value. Нам здесь нужно установить Content-Type который имеет значение application/x-www-form-urlencoded. Ну, и мы это делаем!

Теперь осталось только отправить запрос записав в тело наш токен и лимит. Для этого нужно установить поле doOutput объекта connection в положение true, используя метод setDoOutput();

Далее самая интересная часть — нужно как-то передать наше тело запроса в OutputStream. Будем использовать OutputStreamWriter:

Есть один нюанс: после того, как мы вызвали метод getOutputStream() метод запроса меняется на POST, так как GET не предусматривает наличие request body, но благо что slack ни ставит твёрдое ограничение на метод поэтому всё было хорошо. И поэтому GET-запрос должен выглядеть так:

Но я не стал уже переделывать. И вместо этого наш запрос получился таким:

(*некоторые headers ставятся самим HttpsUrlConnection и здесь они отсутствуют)

И так чтоб записать наше тело запроса пользуемся write();.

После этого наш запрос будет отправлен, и мы можем прочитать полученный ответ. Важно закрывать OutputStream или делать flush(), перед тем как получать InputStream, иначе данные не уйдут из буффера(как альтернатива можно использовать PrintStream — в методе println() по умолчанию вызывается flush()). Для чтение использовал BufferedReader:

(*используем lines() чтобы получить Stream на выходе; rn – символ CRLF – вставляет переход на новую строку)

И, если мы успешно проходим аутентификацию, переменная respBody должна хранить наш ответ от сервера, что в нашем случае является JSON объектом. После этого, его можно отправлять на следующий этап обработки.

После некоторой оптимизации всё выглядет так:

Ссылка на основную публикацию
Adblock
detector