Commit 1a3f8353 authored by 0Tyler's avatar 0Tyler

gateway:DeviceService:addfilter & gateway:PrivacyService:addfilter

parent 0ce4516b
This diff is collapsed.
...@@ -108,7 +108,7 @@ public class DefaultData implements ApplicationRunner { ...@@ -108,7 +108,7 @@ public class DefaultData implements ApplicationRunner {
.build(); .build();
Document document = documentService.add(new MockMultipartFile("file", "test.txt", Document document = documentService.add(new MockMultipartFile("file", "test.txt",
"text/plain", "testFileStirng".getBytes())) "text/plain", "This is fake IOT Device testing file.".getBytes()))
.orElse(Document.builder().build()); .orElse(Document.builder().build());
PrivacyPolicyReport oxygenPrivacyPolicyReport = PrivacyPolicyReport.builder() PrivacyPolicyReport oxygenPrivacyPolicyReport = PrivacyPolicyReport.builder()
...@@ -240,7 +240,7 @@ public class DefaultData implements ApplicationRunner { ...@@ -240,7 +240,7 @@ public class DefaultData implements ApplicationRunner {
.build(); .build();
document = documentService.add(new MockMultipartFile("file", "test.txt", document = documentService.add(new MockMultipartFile("file", "test.txt",
"text/plain", "testFileStirng".getBytes())) "text/plain", "This is fake IOT Device testing file.".getBytes()))
.orElse(Document.builder().build()); .orElse(Document.builder().build());
PrivacyPolicyReport sensorPrivacyPolicyReport = PrivacyPolicyReport.builder() PrivacyPolicyReport sensorPrivacyPolicyReport = PrivacyPolicyReport.builder()
......
...@@ -5,6 +5,7 @@ import edu.prlab.tyler.iotgateway.cloud.pojo.privacy.PrivacyPolicyReport; ...@@ -5,6 +5,7 @@ import edu.prlab.tyler.iotgateway.cloud.pojo.privacy.PrivacyPolicyReport;
import edu.prlab.tyler.iotgateway.cloud.services.DeviceService; import edu.prlab.tyler.iotgateway.cloud.services.DeviceService;
import edu.prlab.tyler.iotgateway.cloud.services.PrivacyPolicyReportService; import edu.prlab.tyler.iotgateway.cloud.services.PrivacyPolicyReportService;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.CacheControl;
import org.springframework.http.ResponseEntity; import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import java.util.Optional; import java.util.Optional;
...@@ -22,13 +23,15 @@ public class DeviceController { ...@@ -22,13 +23,15 @@ public class DeviceController {
this.privacyPolicyReportService = privacyPolicyReportService; this.privacyPolicyReportService = privacyPolicyReportService;
} }
//新增裝置
@PostMapping("/device") @PostMapping("/device")
public ResponseEntity<Device> addDevice(@RequestBody Device device) { public ResponseEntity<Device> addDevice(@RequestBody Device device) {
return deviceService.add(device) return deviceService.add(device)
.map(ResponseEntity::ok) .map(ResponseEntity::ok)
.orElseGet(()->ResponseEntity.noContent().build()); .orElseGet(()->ResponseEntity.noContent().cacheControl(CacheControl.noCache()).build());
} }
//讀取裝置
@GetMapping("/device/{udn}") @GetMapping("/device/{udn}")
public ResponseEntity<Device> readDevice(@PathVariable(value = "udn",required = false) String udn) { public ResponseEntity<Device> readDevice(@PathVariable(value = "udn",required = false) String udn) {
return deviceService.readByUDN(udn) return deviceService.readByUDN(udn)
...@@ -36,6 +39,7 @@ public class DeviceController { ...@@ -36,6 +39,7 @@ public class DeviceController {
.orElseGet(()->ResponseEntity.noContent().build()); .orElseGet(()->ResponseEntity.noContent().build());
} }
//讀取所有裝置
@GetMapping("/device") @GetMapping("/device")
public ResponseEntity<Iterable<Device>> readDevices() { public ResponseEntity<Iterable<Device>> readDevices() {
return Optional.of(deviceService.readll()) return Optional.of(deviceService.readll())
...@@ -43,6 +47,7 @@ public class DeviceController { ...@@ -43,6 +47,7 @@ public class DeviceController {
.orElseGet(()->ResponseEntity.noContent().build()); .orElseGet(()->ResponseEntity.noContent().build());
} }
//新增PrivacyPolicyReport
@PostMapping("/privacy") @PostMapping("/privacy")
public ResponseEntity<PrivacyPolicyReport> addPrivacyPolicyReport(@RequestBody PrivacyPolicyReport privacyPolicy) { public ResponseEntity<PrivacyPolicyReport> addPrivacyPolicyReport(@RequestBody PrivacyPolicyReport privacyPolicy) {
return privacyPolicyReportService.add(privacyPolicy) return privacyPolicyReportService.add(privacyPolicy)
...@@ -50,6 +55,7 @@ public class DeviceController { ...@@ -50,6 +55,7 @@ public class DeviceController {
.orElseGet(()->ResponseEntity.noContent().build()); .orElseGet(()->ResponseEntity.noContent().build());
} }
//透過UDN讀取PrivacyPolicyReport
@GetMapping("/privacy/{UDN}") @GetMapping("/privacy/{UDN}")
public ResponseEntity<PrivacyPolicyReport> readPrivacyPolicyReportByDevice(@PathVariable(value = "UDN") String UDN) { public ResponseEntity<PrivacyPolicyReport> readPrivacyPolicyReportByDevice(@PathVariable(value = "UDN") String UDN) {
return privacyPolicyReportService.readByDevice(UDN) return privacyPolicyReportService.readByDevice(UDN)
......
...@@ -25,6 +25,7 @@ public class DocumentController { ...@@ -25,6 +25,7 @@ public class DocumentController {
this.privacyPolicyReportService = privacyPolicyReportService; this.privacyPolicyReportService = privacyPolicyReportService;
} }
//上傳檔案
@PostMapping @PostMapping
public ResponseEntity<Document> uploadFile(@RequestPart MultipartFile file) throws IOException { public ResponseEntity<Document> uploadFile(@RequestPart MultipartFile file) throws IOException {
return documentService.add(file) return documentService.add(file)
...@@ -32,11 +33,12 @@ public class DocumentController { ...@@ -32,11 +33,12 @@ public class DocumentController {
.orElseGet(() -> ResponseEntity.noContent().build()); .orElseGet(() -> ResponseEntity.noContent().build());
} }
//透過裝置ID取得檔案
@GetMapping("/{udn}") @GetMapping("/{udn}")
public ResponseEntity<ByteArrayResource> findFile(@PathVariable String udn) { public ResponseEntity<ByteArrayResource> findFile(@PathVariable String udn) {
return privacyPolicyReportService.readByDevice(udn) return privacyPolicyReportService.readByDevice(udn)
.map(privacyReport->privacyReport.getDocument().getId()) .map(privacyReport -> privacyReport.getDocument().getId())
.flatMap(id->documentService.readFile(id)) .flatMap(id -> documentService.readFile(id))
.map(document -> ResponseEntity.ok() .map(document -> ResponseEntity.ok()
.contentType(MediaType.parseMediaType(document.getFileType())) .contentType(MediaType.parseMediaType(document.getFileType()))
.header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename* = UTF-8''" + CodeTools.encode(document.getFileName())) .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename* = UTF-8''" + CodeTools.encode(document.getFileName()))
......
...@@ -17,6 +17,7 @@ public class GatewayController { ...@@ -17,6 +17,7 @@ public class GatewayController {
this.service = service; this.service = service;
} }
//表達隱私偏好
@PostMapping("/choice") @PostMapping("/choice")
public ResponseEntity<PrivacyChoice> setPrivacyChoice(@RequestBody PrivacyChoice privacyChoice) { public ResponseEntity<PrivacyChoice> setPrivacyChoice(@RequestBody PrivacyChoice privacyChoice) {
return service.add(privacyChoice) return service.add(privacyChoice)
...@@ -24,6 +25,7 @@ public class GatewayController { ...@@ -24,6 +25,7 @@ public class GatewayController {
.orElseGet(() -> ResponseEntity.noContent().build()); .orElseGet(() -> ResponseEntity.noContent().build());
} }
//取得所有隱私偏好紀錄
@GetMapping("/choice") @GetMapping("/choice")
public ResponseEntity<Iterable<PrivacyChoice>> readPrivacyChoice() { public ResponseEntity<Iterable<PrivacyChoice>> readPrivacyChoice() {
return Optional.of(service.readll()) return Optional.of(service.readll())
...@@ -31,10 +33,12 @@ public class GatewayController { ...@@ -31,10 +33,12 @@ public class GatewayController {
.orElseGet(() -> ResponseEntity.noContent().build()); .orElseGet(() -> ResponseEntity.noContent().build());
} }
//透過裝置取得所有隱私偏好
@GetMapping("/choice/{udn}") @GetMapping("/choice/{udn}")
public ResponseEntity<Iterable<PrivacyChoice>> readPrivacyChoiceByDevice(@PathVariable String udn) { public ResponseEntity<Iterable<PrivacyChoice>> readPrivacyChoiceByDevice(@PathVariable String udn) {
return Optional.ofNullable(service.readPrivacyChoiceByDevice(udn)) return Optional.ofNullable(service.readPrivacyChoiceByDevice(udn))
.map(ResponseEntity::ok) .map(ResponseEntity::ok)
.orElseGet(() -> ResponseEntity.noContent().build()); .orElseGet(() -> ResponseEntity.noContent().build());
} }
} }
\ No newline at end of file
...@@ -2,6 +2,7 @@ package edu.prlab.tyler.iotgateway.cloud.util; ...@@ -2,6 +2,7 @@ package edu.prlab.tyler.iotgateway.cloud.util;
import java.io.UnsupportedEncodingException; import java.io.UnsupportedEncodingException;
import java.net.URLEncoder; import java.net.URLEncoder;
import java.util.function.Function;
public class CodeTools { public class CodeTools {
private CodeTools() { private CodeTools() {
...@@ -15,5 +16,5 @@ public class CodeTools { ...@@ -15,5 +16,5 @@ public class CodeTools {
return "Error: " + e.getMessage(); return "Error: " + e.getMessage();
} }
} }
} }
...@@ -7,7 +7,6 @@ import org.junit.FixMethodOrder; ...@@ -7,7 +7,6 @@ import org.junit.FixMethodOrder;
import org.junit.Test; import org.junit.Test;
import org.junit.runners.MethodSorters; import org.junit.runners.MethodSorters;
import org.web3j.protocol.core.methods.response.TransactionReceipt; import org.web3j.protocol.core.methods.response.TransactionReceipt;
import org.web3j.protocol.core.methods.response.Web3ClientVersion;
import org.web3j.protocol.http.HttpService; import org.web3j.protocol.http.HttpService;
import org.web3j.quorum.Quorum; import org.web3j.quorum.Quorum;
import org.web3j.tx.ClientTransactionManager; import org.web3j.tx.ClientTransactionManager;
...@@ -29,8 +28,8 @@ public class ContractTester { ...@@ -29,8 +28,8 @@ public class ContractTester {
DefaultGasProvider.GAS_LIMIT DefaultGasProvider.GAS_LIMIT
); );
private String deviceContractAddress; private static String deviceContractAddress;
private String gateWayContractAddress; private static String gatewayContractAddress;
@BeforeClass @BeforeClass
public static void setUp() { public static void setUp() {
...@@ -41,32 +40,34 @@ public class ContractTester { ...@@ -41,32 +40,34 @@ public class ContractTester {
// Credentials credentials = Credentials.create(privateKey); // Credentials credentials = Credentials.create(privateKey);
Quorum quorum = Quorum.build(new HttpService(rpcUrl)); Quorum quorum = Quorum.build(new HttpService(rpcUrl));
Web3ClientVersion web3ClientVersion = quorum.web3ClientVersion().sendAsync().get();
String clientVersion = web3ClientVersion.getWeb3ClientVersion();
Assert.assertNotNull(clientVersion);
String userAddress = quorum.ethAccounts().send().getAccounts().get(quorum.ethAccounts().send().getAccounts().size() - 1); String userAddress = quorum.ethAccounts().send().getAccounts().get(quorum.ethAccounts().send().getAccounts().size() - 1);
Assert.assertNotNull(userAddress); Assert.assertNotNull(userAddress);
ClientTransactionManager manager = new ClientTransactionManager(quorum, userAddress); ClientTransactionManager manager = new ClientTransactionManager(quorum, userAddress);
//Device //部屬裝置合約
DeviceContract deviceContract = DeviceContract.deploy(quorum, manager, DEFAULT_GAS_PROVIDER).send(); DeviceContract deviceContract = DeviceContract.deploy(quorum, manager, DEFAULT_GAS_PROVIDER).send();
deviceContractAddress = deviceContract.getContractAddress(); deviceContractAddress = deviceContract.getContractAddress();
Assert.assertNotNull(deviceContract); Assert.assertNotNull(deviceContract);
Assert.assertNotNull(deviceContractAddress); Assert.assertNotNull(deviceContractAddress);
System.out.println("device 合約位置:" + deviceContractAddress);
//設定裝置資訊
TransactionReceipt receipt; TransactionReceipt receipt;
receipt = deviceContract.setdeviceinfo("testdevice").send(); receipt = deviceContract.setdeviceinfo("testdevice").send();
Assert.assertNotNull(receipt); Assert.assertNotNull(receipt);
//設定隱私政策
receipt = deviceContract.setpp("testpp").send(); receipt = deviceContract.setpp("testpp").send();
Assert.assertNotNull(receipt); Assert.assertNotNull(receipt);
//取得裝置資訊
String deviceInfo = deviceContract.deviceInfo().send(); String deviceInfo = deviceContract.deviceInfo().send();
Assert.assertNotNull(deviceInfo); Assert.assertNotNull(deviceInfo);
System.out.println(deviceInfo); System.out.println(deviceInfo);
//取得隱私政策
String privacyPolicy = deviceContract.privacypolicy().send(); String privacyPolicy = deviceContract.privacypolicy().send();
Assert.assertNotNull(privacyPolicy); Assert.assertNotNull(privacyPolicy);
System.out.println(privacyPolicy); System.out.println(privacyPolicy);
...@@ -97,4 +98,31 @@ public class ContractTester { ...@@ -97,4 +98,31 @@ public class ContractTester {
// System.out.println("binded : " + bindedString); // System.out.println("binded : " + bindedString);
} }
@Test
public void test2Contract() throws Exception {
Quorum quorum = Quorum.build(new HttpService(rpcUrl));
String userAddress = quorum.ethAccounts().send().getAccounts().get(quorum.ethAccounts().send().getAccounts().size() - 1);
Assert.assertNotNull(userAddress);
ClientTransactionManager manager = new ClientTransactionManager(quorum, userAddress);
GatewayContract gatewayContract = GatewayContract.deploy(quorum, manager, DEFAULT_GAS_PROVIDER).send();
gatewayContractAddress = gatewayContract.getContractAddress();
Assert.assertNotNull(gatewayContract);
Assert.assertNotNull(gatewayContractAddress);
System.out.println("gateway 合約位置:" + gatewayContractAddress);
//根據合約地址取得合約實體
DeviceContract deviceContract = DeviceContract.load(deviceContractAddress, quorum, manager, DEFAULT_GAS_PROVIDER);
//設定Buyer
TransactionReceipt receipt = deviceContract.setBuyer(gatewayContract.getContractAddress()).send();
Assert.assertNotNull(receipt);
System.out.println(receipt);
receipt = gatewayContract.bindRequest(deviceContractAddress).send();
Assert.assertNotNull(receipt);
System.out.println(receipt);
}
} }
...@@ -60,12 +60,11 @@ public class GatewayController { ...@@ -60,12 +60,11 @@ public class GatewayController {
.orElseGet(() -> ResponseEntity.noContent().build()); .orElseGet(() -> ResponseEntity.noContent().build());
} }
// TODO // TODO 針對使用者取得隱私選擇列表
//根據使用者取得在此gateway上該使用者的隱私選擇列表(根據時間排序), //根據使用者取得在此gateway上該使用者的隱私選擇列表
//暫時從DB撈,無特定使用者 @GetMapping("/choice/{account}")
@GetMapping("/choice") public ResponseEntity<Iterable<PrivacyChoiceResponse>> readPrivacyChoiceRecordsByUser(@PathVariable String account) {
public ResponseEntity<Iterable<PrivacyChoiceResponse>> readPrivacyChoiceRecordsByUser() { return privacyService.getPrivacyPolicyChoicesByAccount(account)
return privacyService.getPrivacyPolicyChoices()
.map(ResponseEntity::ok) .map(ResponseEntity::ok)
.orElseGet(() -> ResponseEntity.noContent().build()); .orElseGet(() -> ResponseEntity.noContent().build());
} }
......
...@@ -6,4 +6,5 @@ import org.springframework.stereotype.Repository; ...@@ -6,4 +6,5 @@ import org.springframework.stereotype.Repository;
@Repository @Repository
public interface DeviceIndexRepository extends CrudRepository<DeviceIndex, String> { public interface DeviceIndexRepository extends CrudRepository<DeviceIndex, String> {
boolean findByUdnContains(String udn);
} }
package edu.prlab.tyler.iotgateway.gateway.services; package edu.prlab.tyler.iotgateway.gateway.services;
import edu.prlab.tyler.iotgateway.cloud.pojo.device.Device; import edu.prlab.tyler.iotgateway.cloud.pojo.device.Device;
import edu.prlab.tyler.iotgateway.gateway.pojo.DeviceIndex;
import edu.prlab.tyler.iotgateway.gateway.repositories.DeviceIndexRepository; import edu.prlab.tyler.iotgateway.gateway.repositories.DeviceIndexRepository;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.util.Optional; import java.util.Optional;
import java.util.stream.Collectors;
import java.util.stream.StreamSupport;
@Service @Service
public class DeviceService { public class DeviceService {
...@@ -21,11 +24,16 @@ public class DeviceService { ...@@ -21,11 +24,16 @@ public class DeviceService {
//TODO bind and read from blockchain //TODO bind and read from blockchain
public Optional<Device> bindDeviceAndGateway(String udn) { public Optional<Device> bindDeviceAndGateway(String udn) {
return remoteService.readDevice(udn); return Optional.of(deviceIndexRepository.save(DeviceIndex.builder()
.udn(udn).build()))
.flatMap(deviceIndex -> remoteService.readDevice(udn));
} }
public Optional<Iterable<Device>> readDevices() { public Optional<Iterable<Device>> readDevices() {
return remoteService.readDevices(); return remoteService.readDevices()
.map(devices -> StreamSupport.stream(devices.spliterator(), false)
.filter(device -> deviceIndexRepository.existsById(device.getUdn()))
.collect(Collectors.toList()));
} }
} }
\ No newline at end of file
...@@ -5,6 +5,7 @@ import edu.prlab.tyler.iotgateway.cloud.pojo.privacy.PrivacyPolicyReport; ...@@ -5,6 +5,7 @@ import edu.prlab.tyler.iotgateway.cloud.pojo.privacy.PrivacyPolicyReport;
import edu.prlab.tyler.iotgateway.gateway.model.PrivacyChoiceResponse; import edu.prlab.tyler.iotgateway.gateway.model.PrivacyChoiceResponse;
import edu.prlab.tyler.iotgateway.gateway.pojo.PrivacyChoiceIndex; import edu.prlab.tyler.iotgateway.gateway.pojo.PrivacyChoiceIndex;
import edu.prlab.tyler.iotgateway.gateway.repositories.PrivacyChoiceIndexRepository; import edu.prlab.tyler.iotgateway.gateway.repositories.PrivacyChoiceIndexRepository;
import edu.prlab.tyler.iotgateway.gateway.repositories.UserRepository;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
...@@ -16,11 +17,14 @@ import java.util.stream.StreamSupport; ...@@ -16,11 +17,14 @@ import java.util.stream.StreamSupport;
@Service @Service
public class PrivacyService { public class PrivacyService {
private PrivacyChoiceIndexRepository privacyChoiceIndexRepository; private PrivacyChoiceIndexRepository privacyChoiceIndexRepository;
private UserRepository userRepository;
private RemoteService remoteService; private RemoteService remoteService;
@Autowired @Autowired
public PrivacyService(PrivacyChoiceIndexRepository privacyChoiceIndexRepository, RemoteService remoteService) { public PrivacyService(PrivacyChoiceIndexRepository privacyChoiceIndexRepository, RemoteService remoteService,
UserRepository userRepository) {
this.privacyChoiceIndexRepository = privacyChoiceIndexRepository; this.privacyChoiceIndexRepository = privacyChoiceIndexRepository;
this.userRepository = userRepository;
this.remoteService = remoteService; this.remoteService = remoteService;
} }
...@@ -48,9 +52,10 @@ public class PrivacyService { ...@@ -48,9 +52,10 @@ public class PrivacyService {
// new ParameterizedTypeReference<Iterable<PrivacyChoice>>() { }).getBody()); // new ParameterizedTypeReference<Iterable<PrivacyChoice>>() { }).getBody());
// } // }
public Optional<Iterable<PrivacyChoiceResponse>> getPrivacyPolicyChoices() { public Optional<Iterable<PrivacyChoiceResponse>> getPrivacyPolicyChoicesByAccount(String account) {
return remoteService.readPrivacyChoices() return remoteService.readPrivacyChoices()
.map(choices -> StreamSupport.stream(choices.spliterator(), false) .map(choices -> StreamSupport.stream(choices.spliterator(), false)
.filter(privacyChoice -> privacyChoice.getPrivacyContent().getUser().getAccount().equals(account))
.map(choice -> privacyChoiceIndexRepository.findById(choice.getId()) .map(choice -> privacyChoiceIndexRepository.findById(choice.getId())
.map(choiceIndex -> PrivacyChoiceResponse.builder() .map(choiceIndex -> PrivacyChoiceResponse.builder()
.id(choiceIndex.getId()) .id(choiceIndex.getId())
......
...@@ -57,18 +57,6 @@ public class GatewayHttpApiTest { ...@@ -57,18 +57,6 @@ public class GatewayHttpApiTest {
.andReturn(); .andReturn();
Assert.assertNotNull(result); Assert.assertNotNull(result);
//取得裝置清單
result = mvc.perform(MockMvcRequestBuilders
.get("/device")
.accept(MediaType.APPLICATION_JSON_UTF8))
.andDo(print())
.andExpect(status().isOk())
.andReturn();
Iterable<Device> devices = mapper.readValue(result.getResponse().getContentAsString(),
new TypeReference<Iterable<Device>>() {
});
Assert.assertNotNull(devices);
//綁定裝置 //綁定裝置
result = mvc.perform(MockMvcRequestBuilders result = mvc.perform(MockMvcRequestBuilders
.post("/device/" + "a1252c49-4188-4e6d-a32e-66604c664fb8") .post("/device/" + "a1252c49-4188-4e6d-a32e-66604c664fb8")
...@@ -81,6 +69,18 @@ public class GatewayHttpApiTest { ...@@ -81,6 +69,18 @@ public class GatewayHttpApiTest {
Device device= mapper.readValue(result.getResponse().getContentAsString(), Device.class); Device device= mapper.readValue(result.getResponse().getContentAsString(), Device.class);
Assert.assertNotNull(device); Assert.assertNotNull(device);
//取得裝置清單
result = mvc.perform(MockMvcRequestBuilders
.get("/device")
.accept(MediaType.APPLICATION_JSON_UTF8))
.andDo(print())
.andExpect(status().isOk())
.andReturn();
Iterable<Device> devices = mapper.readValue(result.getResponse().getContentAsString(),
new TypeReference<Iterable<Device>>() {
});
Assert.assertNotNull(devices);
//拿取隱私政策 //拿取隱私政策
result = mvc.perform(MockMvcRequestBuilders result = mvc.perform(MockMvcRequestBuilders
.get("/privacy/" + "a1252c49-4188-4e6d-a32e-66604c664fb8") .get("/privacy/" + "a1252c49-4188-4e6d-a32e-66604c664fb8")
...@@ -117,15 +117,7 @@ public class GatewayHttpApiTest { ...@@ -117,15 +117,7 @@ public class GatewayHttpApiTest {
//取得所有隱私偏好 //取得所有隱私偏好
result = mvc.perform(MockMvcRequestBuilders result = mvc.perform(MockMvcRequestBuilders
.get("/choice") .get("/choice"+"/test1")
.accept(MediaType.APPLICATION_JSON_UTF8))
.andDo(print())
.andExpect(status().isOk())
.andReturn();
Assert.assertNotNull(result);
result = mvc.perform(MockMvcRequestBuilders
.get("/choice")
.accept(MediaType.APPLICATION_JSON_UTF8)) .accept(MediaType.APPLICATION_JSON_UTF8))
.andDo(print()) .andDo(print())
.andExpect(status().isOk()) .andExpect(status().isOk())
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment