2016-06-29 83 views
0

我的噴支倉服務調用其他參與者(在構造函數中傳遞RequestContext)以執行業務邏輯(similar to this approach)。我有一個用例,我需要從文件中讀取json文本並返回內容。我想要的內容類型是JSON。如何使用requestcontext顯式地將內容類型設置爲json。scala Spray Rest API使用RequestContext返回Json內容類型

在requestContext下面的代碼片段需要返回帶有Json內容類型的字符串(Json)。 requestContext.complete( 「{\」 名稱\ 「:\」 約翰\ 「}」)

package com.christophergagne.sprayapidemo 

import akka.actor.{Actor, ActorRef} 
import akka.event.Logging 
import akka.io.IO 

import spray.routing.RequestContext 
import spray.httpx.SprayJsonSupport 
import spray.client.pipelining._ 

import scala.util.{ Success, Failure } 

object TimezoneService { 
    case class Process(long: Double, lat: Double, timestamp: String) 
} 

class TimezoneService(requestContext: RequestContext) extends Actor { 

    import TimezoneService._ 

    implicit val system = context.system 
    import system.dispatcher 
    val log = Logging(system, getClass) 

    def receive = { 
    case Process(long,lat,timestamp) => 
     process(long,lat,timestamp) 
     context.stop(self) 
    } 

    def process(long: Double, lat: Double, timestamp: String) = { 

    log.info("Requesting timezone long: {}, lat: {}, timestamp: {}", long, lat, timestamp) 

    import TimezoneJsonProtocol._ 
    import SprayJsonSupport._ 
    val pipeline = sendReceive ~> unmarshal[GoogleTimezoneApiResult[Timezone]] 

    val responseFuture = pipeline { 
     Get(s"https://maps.googleapis.com/maps/api/timezone/json?location=$long,$lat&timestamp=$timestamp&sensor=false") 
    } 
    responseFuture onComplete { 
     case Success(GoogleTimezoneApiResult(_, _, timeZoneName)) => 
     log.info("The timezone is: {} m", timeZoneName) 
     ***requestContext.complete("{\"name\":\"John\"}")*** 

     case Failure(error) => 
     requestContext.complete(error) 
    } 
    } 
} 

謝謝你的幫助。

回答

1

如果你需要讓你的回覆中application/json,你應該使用類似:

respondWithMediaType(MediaTypes.`application/json`) { 
    complete { ... 
    } 
} 
1

你需要返回一個完整的HttpResponse對象,而不是一個簡單的字符串。我建議你這樣做:

import spray.routing.RequestContext 
import spray.http._ 

requestContext.complete(HttpResponse(StatusCodes.OK, HttpEntity(ContentType(MediaTypes.`application/json`), "{\"name\":\"John\"}"))) 

你也可以只返回HttpEntity,因爲它有一個定義ToResponseMarshaller可以發現here。使用它像這樣:

import spray.routing.RequestContext 
import spray.http._ 

requestContext.complete(HttpEntity(ContentType(MediaTypes.`application/json`), "{\"name\":\"John\"}")) 

,我不建議你使用字符串插值來回報您的JSON,因爲這使得它很難改變響應結構。我建議您使用spray-json庫,該庫已定義了ToReponseMarshaller,可以找到它here。該功能記錄在here。你的代碼看起來像這樣:

import spray.routing.RequestContext 
import spray.httpx.marshalling._ 
import spray.json._ 
import spray.httpx.SprayJsonSupport._ 

requestContext.complete(JsObject("name" -> JsString("John")))