使用scala处理HTTP响应的最佳实践
我有ServerA公开客户端的API方法,如下所示:
def methodExposed()= Action.async(json) { req => val reqAsModel = request.body.extractOpt[ClientRequestModel] reqAsModel match { case Some(clientRequest) => myApiService .doSomething(clientRequest.someList) .map(res => ???) case None => Future.successful(BadRequest("could not extract request")) } } 所以,我有一个客户端请求的case类,如果我不能从请求体中提取它,那么我返回一个带有消息的BadRequest,否则我调用内部apiService来执行这个请求的一些操作. doSomething执行对ServerB的API调用,可以返回3个可能的响应: > 200状态 doSomething看起来像这样: def doSomething(list: List[String]) = { wSClient.url(url).withHeaders(("Content-Type","application/json")).post(write(list)).map { response => response.status match { case Status.BAD_REQUEST => parse(response.body).extract[ServiceBResponse] case Status.INTERNAL_SERVER_ERROR => val ex = new RuntimeException(s"ServiceB Failed with status: ${response.status} body: ${response.body}") throw ex } } } 现在我有两个问题: >由于200返回没有正文,400有一个正文,我不知道什么应该是doSomething的返回类型 解决方法
如果400是常见的预期错误,我认为类型Future [要么[Your400CaseClass,Unit]]才有意义.就methodExposed如何将结果返回给客户端而言,取决于您的业务逻辑:
>客户应该被告知的基础400件事情是什么?如果doSomething遇到400时,methodExposed应该向客户端返回500 如果doSomething返回500(或更一般地,任何意外的http代码),则应该抛出异常(使用Future.failed). (最后,我希望你没有使用500来传递’正常’错误,如验证/身份验证错误.5xx代码只应用于异常和不可恢复的错误.我知道的大多数http客户端会在5xx时立即抛出异常遇到了,这意味着用户将无法处理它) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |