如何使用 Scala 在具有请求正文的 REST API 上执行 GET 请求?
Posted
技术标签:
【中文标题】如何使用 Scala 在具有请求正文的 REST API 上执行 GET 请求?【英文标题】:How to do a GET Request on a REST API which has request Body using Scala? 【发布时间】: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 正文
【问题讨论】:
【参考方案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)...祝你好运。 或者您可以在您的应用配置中存储一个虚拟用户名/密码并在您的生产环境中覆盖它?这也将它排除在您的代码/存储库之外。以上是关于如何使用 Scala 在具有请求正文的 REST API 上执行 GET 请求?的主要内容,如果未能解决你的问题,请参考以下文章
使用 Visual Studio 2017 负载测试测试具有不同请求主体的 REST API
Spring Data Rest:如何使用请求正文发送多部分文件
如何在请求正文 Spring Boot Rest Controller 中指定订单验证