【问题标题】:How to pass two different objects to a POST request in postman to test RESTful API?如何将两个不同的对象传递给邮递员中的 POST 请求以测试 RESTful API?
【发布时间】:2019-10-12 20:51:48
【问题描述】:

这实际上是一个两部分的问题,一个是如何传递两个 JSON 对象,另一个是如何从两个不同的类创建对象并将该对象传递给 POST 方法。

我正在尝试通过在邮递员中传递两个不同的对象来测试 RESTful API 的 POST 方法。我只能用一个对象成功测试 POST 方法,但是当我尝试将两个不同的对象发送到两个不同对象的 POST 方法时,邮递员说是错误的请求。

这是我的两个实体类:第一个是 Cleint 类:

import lombok.Data;
import org.zevgma.api.entities.user.User;

import javax.persistence.*;
import java.util.Date;

@Data
@Entity
@Table(name = "client")
public class Client {

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "user_pk_generator")
    @SequenceGenerator(name = "user_pk_generator", sequenceName = "users_user_id_seq", allocationSize = 1)
    @Column(name = "id", unique = true, nullable = false,  columnDefinition = "serial")
    private int id;

    @Column(name = "name", nullable = false)
    private String name;

    @Column(nullable = false)
    private String email;

    @Column(nullable = false)
    private Date userDateCreate;

 }

第二个是关于ClientAddress的:

import lombok.Data;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

@Data
@Entity
public class ClientAddress {
    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE)
    private int streetID;
    private String streetName;
    private int streetNumber;
}

我在 Stackoverflow 和 youtube 中尝试了使用 JSON 对象或 JSON 嵌套线程的不同 POST 请求,但找不到我的解决方案。 特别是我已经尝试过这些线程的说明:

这是我要测试的 RESTful API 的 POST 方法:

@PostMapping(value = "/api/employees", consumes = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<String> createClient(@RequestBody Client client,
                                           @RequestBody ClientAddress clientAddress){
    clientService.save(client);
    clientAddressService.save(clientAddress);
    return new ResponseEntity<>(client.getName() + " and "+ clientAddress.getStreetName() + " successfully added",
            HttpStatus.OK);
}

到目前为止,我已经尝试过使用这个 JSON 对象:

[
{
     "name": "Bilbo",
      "email": "bilbo@gmail.com"
    },
		
  {
     "streetName": "Central Street",
     "streetNumber": "31"
   }
]

[
	{
		"client":{
               "name": "Bilbo",
                "email": "bilbo@gmail.com"
              },
		
		"clientAddress":{
                      "streetName": "Central Street",
                      "streetNumber": "31"
                     }
	  }
]

通过预请求脚本:

 //Pre-request Script
 var client = {
     "name": "Bilbo",
     "email": "bilbo@mail.com"
 }

var address = {
    "streetName": "New Street",
    "streetNumber": "3"
}

pm.environment.set("client", JSON.stringify(client));
pm.environment.set("address", JSON.stringify(address));

//Body
[
{{client}},{{address}}	
]

现在问题的第二部分:如果我想从上面提到的两个类 Client 和 ClientAddress 创建一个新对象 ClientData 并将这个 ClientData 对象传递给一个 POST 方法,该怎么做。

这是 ClientData 类:

导入 lombok.Data;

@Data
public class ClientData {

    private Client client;
    private ClientAddress address;
}

这是我要传递 ClientData 对象的 POST 方法:

  @PostMapping(value = "/api/employees", consumes = MediaType.APPLICATION_JSON_VALUE)
    public ResponseEntity<String> createClient(@RequestBody ClientData clientData){
               Client client = clientData.getClient();
                clientService.save(client);
            ClientAddress clientAddress = clientData.getAddress();
            clientAddressService.save(clientAddress);

        return new ResponseEntity<>(client.getName() + " and "+ clientAddress.getStreetName() + " successfully added",
                HttpStatus.OK);
    }

要在邮递员中测试方法,我应该创建这些复杂的 ClientData JSON 对象以及如何传递它?

【问题讨论】:

    标签: json rest spring-boot postman


    【解决方案1】:

    您的 ClientData 类是

    @Data
    public class ClientData {
    
        private Client client;
        private ClientAddress address;
    }
    

    所以你请求的有效载荷应该是这样的

        {
            "client":{
                   "name": "Bilbo",
                    "email": "bilbo@gmail.com"
                  },
    
            "address":{
                          "streetName": "Central Street",
                          "streetNumber": "31"
                         }
          }
    

    通知地址而不是clientAddress。 此外,您不需要将它作为数组传递它只是一个 json 对象(不是 [])

    【讨论】:

      【解决方案2】:

      而不是在正文中这样做:

      [{{client}}, {{address}}]
      

      用这个替换它:

      {{requestBody}}
      

      现在,将完整的主体存储在环境变量中。 删除客户端和地址的单独变量,只使用一个变量。

      因此,请将您的预请求脚本更新为如下内容:

      pm.environment.set("requestBody", JSON.stringify([client, address]));
      

      【讨论】:

      • 如果这没有帮助,然后打开 Postman 控制台(查看 > Postman 控制台),现在发送请求并分享作为请求发出的 RequestBody 的屏幕截图。
      • 不幸的是没有用。请点击此链接获取输出截图:imgur.com/a/WejRrR6
      • 哦,所以请求正文是正确的。服务器代码有问题,也许其他响应会帮助您。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-09-15
      • 1970-01-01
      • 2022-10-06
      • 1970-01-01
      • 2016-12-20
      • 2017-12-30
      • 2020-09-17
      相关资源
      最近更新 更多