如何将两个不同的对象传递给邮递员中的 POST 请求以测试 RESTful API?

Posted

技术标签:

【中文标题】如何将两个不同的对象传递给邮递员中的 POST 请求以测试 RESTful API?【英文标题】:How to pass two different objects to a POST request in postman to test 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;

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

https://it.mathworks.com/help/thingspeak/bulkwritejsondata.html Post Multiple JSON Objects Simultaneously with Express and Postman

这是我要测试的 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 对象以及如何传递它?

【问题讨论】:

【参考方案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 哦,所以请求正文是正确的。服务器代码有问题,也许其他响应会帮助您。

以上是关于如何将两个不同的对象传递给邮递员中的 POST 请求以测试 RESTful API?的主要内容,如果未能解决你的问题,请参考以下文章

如何将json POST数据作为对象传递给Web API方法?

将嵌套对象传递给 POST 请求 [重复]

如何将类型的对象作为参数传递给Web Api Get / Post方法

如何将 javascript 对象传递给 C# MVC 4 控制器

将两个对象传递给mvc中的视图[重复]

如何使用 Retrofit 将参数传递给 POST 请求,然后序列化请求?