Я не читал документацию по Instagram, но на основе вашего примера кода нужно помнить несколько вещей:
- вы упомянули, что вы должны сделать запрос POST, ваш пример делаетзапрос GET
- никогда не создает URL с ненадежными значениями параметров.В основном это означает: всегда кодировать параметры, никогда не доверять им.
Существуют десятки сторонних библиотек HTTP-запросов, которые обеспечивают гибкость и упрощают понимание таких аспектов, как тайм-ауты и перенаправления.Java 11 имеет встроенный HTTP-клиент, который также может облегчить это.Но, опираясь на код, предоставленный в вашем вопросе, с использованием базовых примитивов подключения Java, это может сработать:
URL url = new URL("https://api.instagram.com/oauth/access_token/?client_id=${URLEncoder.encode(clientId, 'UTF-8')}&client_secret=${URLEncoder.encode(clientSecret, 'UTF-8')}&grant_type=authorization_code&redirect_uri=${URLEncoder.encode(redirectUri, 'UTF-8')}&code=${URLEncoder.encode(code, 'UTF-8')}")
def jsonString = ((HttpURLConnection) url.openConnection()).with {
setRequestMethod('POST')
setRequestProperty('Accept', 'application/json')
setDoInput(true)
connect()
if (getResponseCode() >= 400)
throw new Exception("Error code = ${getResponseCode()}")
inputStream.text
}
Каждый параметр URL закодирован так, что любые не относящиеся к URL безопасные символы, которые они содержат, становятся безопасными, и мы сообщаемв связи с тем, что это будет 'POST' и мы ожидаем получить обратно json в качестве входных данных.inputStream.text
- это код groovy, который принимает входной поток из соединения, читает все содержимое и затем закрывает поток.Поскольку это последняя строка with
замыкания, оно автоматически возвращается в качестве значения замыкания и присваивается переменной jsonString
.