【问题标题】:Akka Http Parsing Entity JavaAkka Http 解析实体 Java
【发布时间】:2019-02-08 10:26:09
【问题描述】:

我有一个处理传入 http 请求的代码,如下所示

public Function < HttpRequest, HttpResponse > handleRequest() {
  return new Function < HttpRequest, HttpResponse > () {

    private static final long serialVersionUID = 1 L;

    @Override
    public HttpResponse apply(HttpRequest request) throws Exception {
      System.out.print(request);

      return HttpResponse.create()
        .withEntity(ContentTypes.TEXT_PLAIN_UTF8, "Success")
        .withStatus(StatusCodes.OK);
    }
  }
}

在控制台上我得到这样的结果。

HttpRequest(HttpMethod(POST),http://localhost:8081/,List(Host: localhost:8081, Connection: keep-alive, Authorization: Basic YTph, Postman-Token: 1e3189b0-f320-5926-a781-a9c05e5cbd6a, Cache-Control: no-cache, Origin: chrome-extension://fhbjgbiflinjbdggehcddcbncdddomop, User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36, Accept: */*, Accept-Encoding: gzip, deflate, br, Accept-Language: en-US, en;q=0.9, Timeout-Access: <function1>),HttpEntity.Strict(application/json,{
	"name" : "John Doe"
}),HttpProtocol(HTTP/1.1))

所以我想把 Json 变成这样的字符串变量

{"name" : "John Doe"}

【问题讨论】:

    标签: java http akka akka-http


    【解决方案1】:

    你需要将HttpEntity 变成Strict 并消耗它的所有身体。

    import akka.actor.ActorSystem;
    import akka.http.javadsl.ConnectHttp;
    import akka.http.javadsl.Http;
    import akka.http.javadsl.IncomingConnection;
    import akka.http.javadsl.ServerBinding;
    import akka.http.javadsl.model.*;
    import akka.japi.function.Function;
    import akka.stream.ActorMaterializer;
    import akka.stream.javadsl.Sink;
    import akka.stream.javadsl.Source;
    import akka.util.ByteString;
    import scala.concurrent.duration.FiniteDuration;
    
    import java.util.concurrent.CompletionStage;
    import java.util.concurrent.TimeUnit;
    
    public class JavaHttpRequest {
    
        public static void main(String[] args) {
            final ActorSystem system = ActorSystem.create();
            final ActorMaterializer materializer = ActorMaterializer.create(system);
    
            Source<IncomingConnection, CompletionStage<ServerBinding>> serverSource =
                    Http.get(system).bind(ConnectHttp.toHost("localhost", 8080));
    
    
            serverSource.to(Sink.foreach(connection -> {
                System.out.println("Accepted new connection from " + connection.remoteAddress());
    
                connection.handleWithSyncHandler(handleRequest(materializer), materializer);
            })).run(materializer);
        }
    
        private static Function<HttpRequest, HttpResponse> handleRequest(ActorMaterializer materializer) {
            return request -> {
                try {
                    System.out.print(getString(materializer, request));
                } catch (Exception e) {
                    e.printStackTrace();
                }
    
                return HttpResponse.create()
                        .withEntity(ContentTypes.TEXT_PLAIN_UTF8, "Success")
                        .withStatus(StatusCodes.OK);
            };
        }
    
        private static String getString(ActorMaterializer materializer, HttpRequest request) throws Exception {
            final CompletionStage<HttpEntity.Strict> strictEntity = request.entity()
                    .toStrict(FiniteDuration.create(3, TimeUnit.SECONDS).toMillis(), materializer);
    
            final CompletionStage<String> stringStage = strictEntity
                    .thenCompose(strict ->
                            strict.getDataBytes()
                                    .runFold(ByteString.empty(), ByteString::concat, materializer)
                                    .thenApply(ByteString::utf8String)
                    );
    
            return stringStage.toCompletableFuture().get();
        }
    
    }
    

    在发送http请求时

    curl -X POST \
      http://localhost:8080/hello/json \
      -H 'Content-Type: application/json' \
      -d '{"test": "hello"}'
    

    打印{"test": "hello"}

    【讨论】:

    • 您好,感谢您的回答,jsonStringStage 不会完成。所以在 stringStage.toCompletableFuture().get(); 得到 nullPointerException;
    • 我会检查是否有问题
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-06
    • 2015-08-30
    • 2016-07-13
    • 1970-01-01
    • 2023-03-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多