java - Akka Http解析实体Java

标签 java http akka akka-http

我有一段代码可以按如下方式处理传入的 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"}

最佳答案

您需要将 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"}

关于java - Akka Http解析实体Java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54590360/

相关文章:

scala - 协议(protocol)切换是否成功

java - AKKA 中如何读取配置

java - 添加 admob 横幅广告时出现 RecyclerView ClassCastException

java - 将 Informix-4GL 程序中的 SQL 查询 "SELECT UNIQUE 1..."转换为 Java 代码

rest - 当 PUT 是空操作时,HTTP 服务器应该返回 200 吗?

apache - 为什么http ://localhost redirect to my default virtual host once I setup virtual hosts in Apache?

java - Akka http 使用 java - 从 RequestEntity 获取字符串

java - 通过 Java 中对象的深(与浅)大小限制缓存?

java - 如何将 Json 字符串转换为 Java 对象?

swift - 更新用http加载的注释