Как выполнить запрос GET для REST API, который имеет тело запроса с использованием Scala?

Я новичок в программировании на Scala и на самом деле тестирую производительность API с помощью Gatling. Дело в том, что мы не хотим хранить пароли в нашем коде, поэтому мы хотим вызвать REST API, который возвращает имя пользователя и пароль.

Здесь Catch - это тип запроса GET, но у него есть тело JSON для отправки. Ответ API на самом деле зависит от тела JSON, которое мы отправляем в запросе.

Например:

URL - https://www.somesecrets.com/ Текст JSON -

{ 
  "env":"qa",
  "key":"micro"
}

Может ли кто-нибудь помочь в написании кода Scala, который позволяет отправлять тело в запросе GET

Это код, который я уже пробовал


def get(url: String,
  connectTimeout: Int = 5000,
  readTimeout: Int = 5000,
  requestMethod: String = "GET") = {
  println("Getting Password from Secret Repo")
  import java.net. {
    URL,
    HttpURLConnection
  }
  val connection = (new URL(url)).openConnection.asInstanceOf[HttpURLConnection]
  connection.setConnectTimeout(connectTimeout)
  connection.setReadTimeout(readTimeout)
  connection.setRequestMethod(requestMethod)
  val inputStream = connection.getInputStream
  val content = scala.io.Source.fromInputStream(inputStream).mkString
  if (inputStream != null) inputStream.close
  content
}

Но я не понимаю, как расширить этот код, чтобы отправить тело JSON.


person Yashwanth    schedule 11.10.2019    source источник


Ответы (2)


Вы не можете добавить тело в запрос GET. Запросы GET включают в себя все необходимые данные в URL-адресе, а запросы POST предоставляют дополнительные данные от клиента (браузера) серверу в теле сообщения.

Вот пример выполнения запроса POST с помощью scala:

import org.apache.http.client.methods.HttpPost
import org.apache.http.entity.StringEntity
import org.apache.http.impl.client.DefaultHttpClient
import com.google.gson.Gson

object ExecutePostRequestApp extends App {

  val requestBody = s"""{ 
          "env":"qa",
          "key":"micro"
        }"""

  // create an HttpPost object
  val post = new HttpPost("https://www.somesecrets.com/")

  // set the Content-type
  post.setHeader("Content-type", "application/json")

  // add the JSON as a StringEntity
  post.setEntity(new StringEntity(requestBody))

  // send the post request
  val response = (new DefaultHttpClient).execute(post)
}
person Gal Naor    schedule 11.10.2019
comment
К сожалению, мне нужно выполнить запрос GET с телом JSON. Спасибо, что дали мне знать, как выполнить POST. - person Yashwanth; 13.10.2019

Вы не можете добавить тело запроса к запросу GET. Ну, технически можно, но это ничего не значит. И многие HTTP-клиенты не позволят вам этого. А Гатлинг, вероятно, не позволяет. Дополнительную информацию см. здесь.

Суть запроса GET заключается в том, что вы просите сервер ПОЛУЧИТЬ вам некоторые данные. Как только вы отправляете тело запроса, вы подразумеваете, что некоторые данные необходимо создать или изменить на сервере. Вот почему существует несколько методов запроса, и не все является GET.

Если вы хотите отправить данные в запросе GET, вам нужно будет использовать параметры запроса, заголовки, файлы cookie, данные сеанса ... и, если вам нужно, чтобы это было скрыто, зашифруйте его.

Если вы застряли с необходимостью отправлять тело в запрос GET, вам нужно переоценить, как разработано ваше приложение ...


N.B. Если я неправильно понял и вы действительно хотите вернуть тело из запроса GET, дайте мне знать, и я удалю этот ответ, поскольку он больше не применяется.

person James Whiteley    schedule 14.10.2019
comment
Нет, Вы поняли вопрос, Но именно так разработали API разработчики - person Yashwanth; 16.10.2019
comment
Думаю, именно с такими вещами вы сталкиваетесь, когда идете против условностей. Возможно, вы могли бы получить свой запрос Gatling для POST данных в конечную точку, предназначенную только для тестирования, которая затем перенаправляет на маршрут GET с телом из запроса POST, но в противном случае я беспокоюсь, что нужно изменить дизайн (отправка информации для входа в POST-запрос, вероятно, будет вашим лучшим выбором) ... удачи вам в этом. - person James Whiteley; 16.10.2019
comment
Или вы можете сохранить фиктивное имя пользователя / пароль в конфигурации своего приложения и переопределить его в своей производственной среде? Это также защищает его от вашего кода / репо. - person James Whiteley; 16.10.2019