【问题标题】:How to do a GET Request on a REST API which has request Body using Scala?如何使用 Scala 在具有请求正文的 REST API 上执行 GET 请求?
【发布时间】:2020-02-08 18:33:30
【问题描述】:

我是 Scala 编程的新手,实际上我正在使用 Gatling 测试 API 的性能。问题是我们不想在代码中存储密码,所以我们想调用一个返回用户名和密码的 REST API。

这里的 Catch 是请求类型是 GET,但它确实有一个 JSON 正文要发送。 API 的响应实际上取决于我们在请求中发送的 JSON 正文

例如:

网址 - https://www.somesecrets.com/ JSON 正文 -

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

有人可以帮助编写一个允许在 GET 请求中发送 Body 的 Scala 代码

这是我已经尝试过的一些代码


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 正文

【问题讨论】:

    标签: scala http get gatling


    【解决方案1】:

    您不能将正文添加到 GET 请求。 GET 请求在 URL 中包含所有必需的数据,而 POST 请求在消息正文中提供从客户端(浏览器)到服务器的附加数据。

    这是一个如何使用 scala 执行 POST 请求的示例:

    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)
    }
    

    【讨论】:

    • 不幸的是,我必须执行一个包含 JSON 正文的 GET 请求,但感谢您让我知道如何执行 POST。
    【解决方案2】:

    您不能将请求正文添加到 GET 请求。好吧,从技术上讲,你可以,但这并不意味着什么。而且很多 HTTP 客户端不允许你这样做。加特林可能不允许你这样做。 See more on that here.

    GET 请求的意义在于您要求服务器获取一些数据。一旦您发送请求正文,您就暗示需要在服务器上创建或修改某些数据。这就是为什么有多种请求方法,并不是所有的都是 GET。

    如果您想在 GET 请求中发送数据,您需要使用查询参数、标头、cookie、会话数据...如果您需要隐藏这些,请对其进行加密。

    如果您不得不向 GET 请求发送正文,您需要重新评估您的应用程序的设计方式...


    注意如果我误解了,并且您确实想从 GET 请求中返回正文,请告诉我,我将删除此答案,因为它不再适用。

    【讨论】:

    • 不,你理解了这个问题,但这就是开发人员开发 API 的方式
    • 我想这就是你在违背约定时遇到的那种东西。也许您可以让您的 Gatling 请求将数据发布到仅测试端点,然后从 POST 请求中重定向到带有正文的 GET 路由,但否则我担心重新设计是为了(sending login information in a POST request would probably be your best bet)...祝你好运。
    • 或者您可以在您的应用配置中存储一个虚拟用户名/密码并在您的生产环境中覆盖它?这也将它排除在您的代码/存储库之外。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-19
    • 2016-08-24
    • 1970-01-01
    • 2019-01-15
    • 2017-04-14
    相关资源
    最近更新 更多