2016-06-29 10 views
0

Mein Spray Rest Service ruft andere Akteure (Übergabe RequestContext im Konstruktor), um Geschäftslogik durchzuführen (similar to this approach). Ich habe einen Anwendungsfall, wo ich JSON-Text aus einer Datei lesen und den Inhalt zurückgeben muss. Ich möchte, dass der Inhaltstyp JSON ist. Wie setze ich den Inhaltstyp explizit mit requestcontext auf json.Scala Spray Rest API Rückgabe Json Inhaltstyp mit RequestContext

Im folgenden Codeausschnitt muss requestContext den String (Json) mit dem Json-Inhaltstyp zurückgeben. requestContext.complete ("{\" Name \ ": \" John \ "}")

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

danke für die Hilfe.

Antwort

1

Wenn Sie Ihre Antwort ein application/json machen müssen, sollten Sie so etwas wie verwenden:

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

Sie benötigen ein voll HttpResponse Objekt anstelle einer einfachen Zeichenfolge zurückzukehren. Ich empfehle Ihnen, dies zu tun:

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

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

Sie auch nur die HttpEntity zurückkehren konnten, da sie eine definierte ToResponseMarshaller hat die here gefunden werden kann. Verwenden Sie es wie folgt:

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

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

ich nicht empfehlen verwenden Sie String-Interpolation Ihre JSON zurück, da dies macht es schwierig, die Antwortstruktur zu ändern. Ich empfehle Ihnen, die spray-json Bibliothek zu verwenden, die bereits eine ToReponseMarshaller definiert hat, die here gefunden werden kann. Die Funktionalität ist dokumentiert here. Ihr Code würde etwa so aussehen:

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

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