Java 角度2+;Vert.x:HTTP请求的发送-接收主体

Java 角度2+;Vert.x:HTTP请求的发送-接收主体,java,angular,typescript,http-post,vert.x,Java,Angular,Typescript,Http Post,Vert.x,我使用Vert.x framework服务器端和Angular 2(v6.0.9)客户端制作了一个简单的REST应用程序。我要做的是让服务器显示接收到的数据。但是,我不知道如何检索HTTP请求主体:routingContext.getBodyAsString()和routingContext.getBodyAsJson()都返回null。作为临时解决方案,我使用getParam(“data”)方法通过路径参数显示了所有发送的数据。我做错了什么 服务器代码 package test.post;

我使用Vert.x framework服务器端和Angular 2(v6.0.9)客户端制作了一个简单的REST应用程序。我要做的是让服务器显示接收到的数据。但是,我不知道如何检索HTTP请求主体:
routingContext.getBodyAsString()
routingContext.getBodyAsJson()
都返回null。作为临时解决方案,我使用
getParam(“data”)
方法通过路径参数显示了所有发送的数据。我做错了什么

服务器代码

package test.post;

import java.util.HashSet;
import java.util.Set;

import io.vertx.core.AbstractVerticle;
import io.vertx.core.Vertx;
import io.vertx.core.http.HttpMethod;
import io.vertx.core.json.Json;
import io.vertx.ext.web.Router;
import io.vertx.ext.web.RoutingContext;
import io.vertx.ext.web.handler.CorsHandler;
import io.vertx.ext.web.handler.StaticHandler;

public class Server extends AbstractVerticle {

    @Override
    public void start() throws Exception {
        Router router = Router.router(vertx);

        Set<String> allowedHeaders = new HashSet<>();
        allowedHeaders.add("x-requested-with");
        allowedHeaders.add("Access-Control-Allow-Origin");
        allowedHeaders.add("origin");
        allowedHeaders.add("Content-Type");
        allowedHeaders.add("accept");
        allowedHeaders.add("X-PINGARUNER");

        Set<HttpMethod> allowedMethods = new HashSet<>();
        allowedMethods.add(HttpMethod.GET);
        allowedMethods.add(HttpMethod.POST);
        allowedMethods.add(HttpMethod.OPTIONS);
        allowedMethods.add(HttpMethod.DELETE);
        allowedMethods.add(HttpMethod.PATCH);
        allowedMethods.add(HttpMethod.PUT);

        router.route().handler(CorsHandler.create("*").allowedHeaders(allowedHeaders).allowedMethods(allowedMethods));

        router.post("/test/post/handler/:data").handler(this::receive);

        // Serve the static pages
        router.route().handler(StaticHandler.create());

        vertx.createHttpServer().requestHandler(router::accept).listen(8080);
        System.out.println("Service running");
    }

    private void receive(RoutingContext routingContext) {
        System.out.println("received post request");
        System.out.println(routingContext.getBodyAsString());
        System.out.println(routingContext.getBodyAsJson());
        System.out.println(routingContext.request().getParam("data"));
        routingContext.response().putHeader("Content-Type", "application/json").end(Json.encodePrettily("ok"));
    }

    public static void main(String[] args) {
        Vertx vertx = Vertx.vertx();
        Server service = new Server();
        vertx.deployVerticle(service);
    }
}
package test.post;
导入java.util.HashSet;
导入java.util.Set;
导入io.vertx.core.AbstractVerticle;
导入io.vertx.core.vertx;
导入io.vertx.core.http.HttpMethod;
导入io.vertx.core.json.json;
导入io.vertx.ext.web.Router;
导入io.vertx.ext.web.RoutingContext;
导入io.vertx.ext.web.handler.CorsHandler;
导入io.vertx.ext.web.handler.StaticHandler;
公共类服务器扩展了AbstractVerticle{
@凌驾
public void start()引发异常{
路由器=路由器。路由器(vertx);
Set allowedHeaders=new HashSet();
allowedHeaders.添加(“x-request-with”);
allowedHeaders.add(“访问控制允许来源”);
允许的标题。添加(“来源”);
allowedHeaders.add(“内容类型”);
允许的标题。添加(“接受”);
允许的标题。添加(“X-PINGARUNER”);
Set allowedMethods=new HashSet();
allowedMethods.add(HttpMethod.GET);
allowedMethods.add(HttpMethod.POST);
allowedMethods.add(HttpMethod.OPTIONS);
allowedMethods.add(HttpMethod.DELETE);
添加(HttpMethod.PATCH);
allowedMethods.add(HttpMethod.PUT);
route()处理程序(CorsHandler.create(“*”).allowedHeaders(allowedHeaders.allowedMethods(allowedMethods));
router.post(“/test/post/handler/:data”).handler(this::receive);
//为静态页面提供服务
route().handler(StaticHandler.create());
createHttpServer().requestHandler(路由器::接受).listen(8080);
System.out.println(“服务运行”);
}
专用void接收(RoutingContext RoutingContext){
System.out.println(“收到的post请求”);
System.out.println(routingContext.getBodyAsString());
System.out.println(routingContext.getBodyAsJson());
System.out.println(routingContext.request().getParam(“数据”);
routingContext.response().putHeader(“内容类型”,“应用程序/json”).end(json.encodeprettly(“确定”));
}
公共静态void main(字符串[]args){
Vertx Vertx=Vertx.Vertx();
服务器服务=新服务器();
垂直部署垂直(服务);
}
}
客户端app.component.ts代码

import { Component } from '@angular/core';
import { RequestService } from './request.service';

@Component({
  selector: 'app-root',
  template: `
    <h2>Click to send post request</h2>
    <button type="submit" (click)=makePostRequest()>Send Post Request</button>
    `,
  styleUrls: ['./app.component.css']
})
export class AppComponent {

  constructor(private requestService: RequestService) { }

  makePostRequest() {
    this.requestService.sendRequest().subscribe(response => console.log(response));
  }
}
从'@angular/core'导入{Component};
从“/request.service”导入{RequestService};
@组成部分({
选择器:'应用程序根',
模板:`
单击以发送post请求
发送邮寄请求
`,
样式URL:['./app.component.css']
})
导出类AppComponent{
构造函数(私有请求服务:请求服务){}
makePostRequest(){
subscribe(response=>console.log(response));
}
}
客户端请求.service.ts代码

import { Injectable } from '@angular/core';
import { HttpClient, HttpHeaders } from "@angular/common/http";
import { catchError, tap } from 'rxjs/operators';
import { Observable, of } from 'rxjs';

export class User {
  email: string;
  password: string;
  address: string;
  username: string;
}

@Injectable({
  providedIn: 'root'
})
export class RequestService {

  constructor(private http: HttpClient) { }

  sendRequest(): Observable<any> {
    let user = new User();
    user.username = 'Admin';
    user.email = 'admin@gmail.com';
    user.password = 'admin';
    user.address = 'somewhere';

    console.log(user);

    let url = 'http://127.0.0.1:8080/test/post/handler/' + JSON.stringify(user);
    let headers = new HttpHeaders({ 'Content-Type': 'application/json' });
    let options: { headers, responseType: 'json' };
    return this.http.post(url, JSON.stringify(user), options).pipe(
      tap(response => console.log(response))
    );
  }
}
从'@angular/core'导入{Injectable};
从“@angular/common/http”导入{HttpClient,HttpHeaders};
从“rxjs/operators”导入{catchError,tap};
从'rxjs'导入{可观察的};
导出类用户{
电子邮件:字符串;
密码:字符串;
地址:字符串;
用户名:字符串;
}
@注射的({
providedIn:'根'
})
导出类请求服务{
构造函数(私有http:HttpClient){}
sendRequest():可观察{
让用户=新用户();
user.username='Admin';
user.email=admin@gmail.com';
user.password='admin';
user.address='某处';
console.log(用户);
让url为空http://127.0.0.1:8080/test/post/handler/'+JSON.stringify(用户);
let headers=new-HttpHeaders({'Content-Type':'application/json'});
let选项:{headers,responseType:'json'};
返回this.http.post(url,JSON.stringify(用户),options)(
点击(响应=>console.log(响应))
);
}
}

您需要启用正文处理程序才能读取请求正文,例如:

router.route("/test/post*").handler(BodyHandler.create());
router.post("/test/post/handler/:data").handler(this::receive);
或在全球范围内启用:

router.route().handler(BodyHandler.create())

您需要启用正文处理程序才能读取请求正文,例如:

router.route("/test/post*").handler(BodyHandler.create());
router.post("/test/post/handler/:data").handler(this::receive);
或在全球范围内启用:

router.route().handler(BodyHandler.create())