首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用ServerRequest的Spring Reactive get body JSONObject

使用ServerRequest的Spring Reactive get body JSONObject
EN

Stack Overflow用户
提问于 2018-10-18 17:00:37
回答 3查看 12.8K关注 0票数 9

我是春季反应新手。

我正在尝试使用邮递员从服务器获取请求信息。

首先,邮递员使用post方法将信息发送到服务器。其次,我们一直在服务器端使用相关代码并获取请求信息。

在下面的代码片段中

我想知道是否可以获得ServerRequest函数的JSONObject。

邮递员正文(application/json)

代码语言:javascript
复制
{
    "name": "aaaa",
    "name_order": ["aa", "bb", "cc"],
    "type": "12",
    "query": ""
}

java (RouterFunction)

代码语言:javascript
复制
import com.ntels.io.input.handler.RestInHandler;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.MediaType;
import org.springframework.web.reactive.config.EnableWebFlux;
import org.springframework.web.reactive.config.WebFluxConfigurer;
import org.springframework.web.reactive.function.server.*;

import static org.springframework.web.reactive.function.server.RequestPredicates.GET;
import static org.springframework.web.reactive.function.server.RequestPredicates.POST;
import static org.springframework.web.reactive.function.server.RequestPredicates.PUT;
import static org.springframework.web.reactive.function.server.RequestPredicates.DELETE;

@Configuration
@EnableWebFlux
public class RestConfig implements WebFluxConfigurer {

    @Bean
    public RouterFunction<ServerResponse> routes(RestInHandler restInHandler){
        return RouterFunctions.route(POST("/input/event").
        and(RequestPredicates.accept(MediaType.APPLICATION_JSON)), restInHandler::toRESTInVerticle);
    }
}

java (处理程序)

代码语言:javascript
复制
public Mono<ServerResponse> toRESTInVerticle(ServerRequest serverRequest) {
    String serverRequestUrl = serverRequest.uri().toString();

    System.out.println("RestInHandler test in");
    System.out.println(serverRequest.method());
    System.out.println(serverRequest.headers());
    System.out.println(serverRequest.uri().toString());

    // how can i get the jsonbody using serverrequest

    // testing..

    // Mono<JSONObject> jsonObjectMono = serverRequest.bodyToMono(JSONObject.class);
    // Flux<JSONObject> jsonObjectFlux = serverRequest.bodyToFlux(JSONObject.class);
-> MonoOnErrorResume

    return (Mono<ServerResponse>) ServerResponse.ok();
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-10-19 13:10:45

谢谢。Alexander Terekhov

你的回答对解决这个问题有很大帮助。

我的测试代码。

RouterFunction =与现有代码相同。

处理程序

代码语言:javascript
复制
public Mono<ServerResponse> toRESTInVerticle(ServerRequest serverRequest) {
    String uri = serverRequest.uri().toString();
    String method = serverRequest.methodName();
    String contentType = serverRequest.headers().contentType().get().toString();
    String characterSet = serverRequest.headers().acceptCharset().get(0).toString();
    JSONObject bodyData = serverRequest.bodyToMono(JSONObject.class).toProcessor().peek();

    System.out.println("==========toRESTInVerticle Data Check==========");
    System.out.println(uri);
    System.out.println(method);
    System.out.println(contentType);
    System.out.println(characterSet);
    System.out.println(bodyData);
    System.out.println("======toRESTInVerticle Data Check Complete======");

    return Mono.empty();
}

控制台的结果如下所示:

代码语言:javascript
复制
==========toRESTInVerticle Data Check==========
http://localhost:8082/input/event/check
POST
application/json
UTF-8
{"event_type":"12","event_name_order":["aa","bb","cc"],"event_query":"","event_name":"aaaa","init_value":"","init_value_yn":"N","event_descp":"ddd"}
======toRESTInVerticle Data Check Complete======

祝你编码愉快谢谢。

已更新。

谢谢你。@Zon评论。share现在已弃用-首选share()来共享父订阅,或使用Sink 请同时参考此url。

票数 6
EN

Stack Overflow用户

发布于 2018-10-18 19:02:01

我认为你可以尝试用下面的方式注册一种“回调”:

代码语言:javascript
复制
        return request.bodyToMono(JSONObject.class)
                  .doOnNext(jsonObject -> // testing..)
                  .then(ServerResponse.ok().build());

另外,我注意到您正在将ServerResponse.ok()转换为Mono<ServerResponse>。我认为它不会施展。使用ServerResponse.ok().build()制作Mono<ServerResponse>

票数 5
EN

Stack Overflow用户

发布于 2021-10-06 14:28:21

@oddeveloper我发现Mono.toProcessor()已经被弃用了。

最简单的方法是拥有一个这样的POJO

代码语言:javascript
复制
import java.util.List;
import java.util.Objects;
import java.util.logging.Logger;

public class Person {
    
    private String name;
    
    private List<String> nameOrder;
    
    private String type;
    
    private String query;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public List<String> getNameOrder() {
        return nameOrder;
    }

    public void setNameOrder(List<String> nameOrder) {
        this.nameOrder = nameOrder;
    }

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }

    public String getQuery() {
        return query;
    }

    public void setQuery(String query) {
        this.query = query;
    }
    
    
    @Override
    public String toString() {
        return "Person{" + "name=" + name + ", nameOrder=" + nameOrder + ", type=" + type + ", query=" + query + '}';
    }
}

然后提取Person person = serverRequest.bodyToMono(Person.class).toFuture().get()

get()函数

如果有必要,

会等待此操作完成,然后返回其结果。

@terekhov你的解决方案对我不起作用我不知道为什么

如果这对你不起作用,你必须有一个JSONObject,那么创建一个JSONObjectBodyExtractor,如下所示

代码语言:javascript
复制
import java.nio.charset.StandardCharsets;
import org.json.JSONObject;
import org.reactivestreams.Subscriber;
import org.reactivestreams.Subscription;
import org.springframework.http.ReactiveHttpInputMessage;
import org.springframework.web.reactive.function.BodyExtractor;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.springframework.core.io.buffer.DataBuffer;
import reactor.core.publisher.Mono;

/**
 *
 * @author timot
 * @param <T>
 * @param <M>
 */
public class JSONObjectBodyExtractor<T extends Mono<JSONObject>, M extends ReactiveHttpInputMessage> implements BodyExtractor {

    private static final Logger LOG = Logger.getLogger(JSONObjectBodyExtractor.class.getName());

    @Override
    public Mono<JSONObject> extract(ReactiveHttpInputMessage inputMessage, Context context) {

        return Mono.<JSONObject>create(sink -> {
            inputMessage.getBody().subscribe(new Subscriber() {

                @Override
                public void onSubscribe(Subscription s) {
                    s.request(1);
                }

                @Override
                public void onNext(Object t) {
                    
                    DataBuffer dataBuffer=(DataBuffer) t;
                    
                    sink.success(new JSONObject(dataBuffer.toString(StandardCharsets.UTF_8)));
                }

                @Override
                public void onError(Throwable thrwbl) {
                    LOG.log(Level.SEVERE, "jsonobjectbodyextractor onerror", thrwbl);
                }

                @Override
                public void onComplete() {
                    LOG.log(Level.INFO, "jsonobjectbodyextractor oncomplete");
                }

            });
        });
    }

}

然后在您的反应式处理程序提取中,如下所示

代码语言:javascript
复制
    Mono<JSONObject> jsonObjectMono = (Mono<JSONObject>) request.body(jsonObjectBodyExtractor);
JSONObject jsonObject=jsonObjectMono.toFuture().get();
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52870517

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档