Hôm nay có bạn hỏi về việc lưu cả 1 list vào trong environment, mình cũng viết 1 bài ngắn nói về việc này.
Mình sử dụng luôn api test của Postman: https://postman-echo.com/post
Body là:
{ "book": [ { "category": "reference", "author": "Nigel Rees", "title": "Sayings of the Century", "price": 8.95 }, { "category": "fiction", "author": "Evelyn Waugh", "title": "Sword of Honour", "price": 12.99 }, { "category": "fiction", "author": "Herman Melville", "title": "Moby Dick", "isbn": "0-553-21311-3", "price": 8.99 }, { "category": "fiction", "author": "J. R. R. Tolkien", "title": "The Lord of the Rings", "isbn": "0-395-19395-8", "price": 22.99 } ] }
Nội dung bài viết
I. Cách save array
Nhiệm vụ bây giờ là: Save toàn bộ author vào 1 array, sau đó save array vào environment
var jsonData = pm.response.json(); // Get list books from response var books = jsonData.json.book; // Only for debug console.log(books); // Get list of authors, then save to environment var authors = _.map(books, 'author'); // Need convert to String before save to environment pm.environment.set("authors", JSON.stringify(authors)); // Only for debug for (i = 0; i < authors.length; i++){ console.log(authors[i]); }
- Lưu ý: để save object hoặc array vào trong environment, bạn cần phải
JSON.stringify()
cái object hoặc array đó trước.
Và đây là kết quả
- Console log
- Environment
II. Cách dùng array đã save
- Nếu bạn muốn sử dụng 1 phần tử của array đã được lưu lại ở trong những request tiếp theo. Ví dụ như muốn “lấy random phần tử author”
Bạn sẽ code như sau:
Pre-Request tab:
let authors = JSON.parse(pm.environment.get('authors')); let index = _.random(authors.length - 1); pm.variables.set("author", authors[index]);
- Vì “authors” được lưu trong environment sẽ ở dạng String, chứ ko phải array, nên sau khi get value ra, thì ta phải dùng
JSON.parse()
để cho nó trở lại là array, rồi save vào 1 biến nào đó. - Muốn get 1 phần trong array, ta phải biết vị trí (index) của phần tử đó. Do đó, để lấy được 1 phần tử random thì ta cũng cho index random luôn. Tuy nhiên, nó chỉ được phép random trong khoảng từ
0 --> [array length] - 1
mà thôi. Nếu ngoài khoảng đó, nó sẽ bị lỗi ArrayIndexOutOfBound, có nghĩa là access vào 1 vị trí nằm ngoài array. - Save biến đó vào vùng tạm
variables
vì ta không cần keep track biến đó theo thời gian, ta chỉ cần lưu tạm, để bên body có thể lấy được value
Hi anh Giang,
Cho em hỏi trường hợp này :
Ví dụ em save 1 variable là 1 array động (mảng này được response từ api A)
Mảng này có 10 phần tử.
Em muốn tạo request cho api B với 10 phần tử đó theo tuần tự, nếu phải tạo 10 requests thì sẽ mất time.
VD :
a = {1,2,3,4,5,6,7,8,9,10}
url/post/id[a]
Liệu có cách nào chỉ tạo 1 request nhưng run tất cả các thành phần trong mảng luôn không?
Cám ơn anh.
Hi bạn, bạn có thể sử dụng postman.setNextRequest(‘request_name’).
Muốn rõ hơn bạn có thể follow theo bài này. https://ambertests.com/2019/01/28/postman-how-to-dynamic-iteration-within-a-collection/ .Tuy nhiên, cái chức năng này chỉ chạy trong runner, ko debug được trực tiếp đâu.
Nếu bạn muốn tìm hiểu code thì mình gửi file script, bạn import vào postman mà xem. https://gist.github.com/giang-nguyen-niteco/8bbd41869d1e217a185474fe0b5c7843
Cho e hỏi chút về cách set vulue save vào environment.
Trong response của header, em muốn set ra được value nó nó mà không được,
ví dụ như : set-cookie, nó có 2 key như thế, e chỉ lấy được 1 key, còn 1 key không lấy để lưu được.
Xin lỗi, anh ko hiểu em đang gặp vấn đề gì nữa, đọc không hiểu.
Ví dụ Header của response trả về có 2 key cùng có tên là Set-cookie.
Mỗi 1 key lại có 1 value khác nhau, giờ em muốn lấy value của key : Set-cookie đó luuw vào environment để làm value cho API khác.
và em dùng theo hàm Test này ”
var cookie = null;
pm.test(“Collect redirect location”, function () {
pm.response.to.have.header(“Set-Cookie”);
cookie = pm.response.headers.get(“Set-Cookie”);
if (cookie !== undefined) {
pm.environment.set(“redirURL”, cookie);
}
});
Nó không lấy được giá trị em mong muốn ạ.
okay anh hiểu ý em rồi, tuy nhiên anh cần response để biết là em có đang extract đúng ko.
Hi anh, em có 1 mảng kiểu này
[ {“id”:”27489494″,
“name”:”abc”},
{“id”:”27489989494″,
“name”:”ab5c”},
{“id”:”2748379494″,
“name”:”a3bc”},
{“id”:”27487489494″,
“name”:”a2bc”}]
em muốn set riêng từng id theo name vào environment thì làm như nào ạ, value động có thể thay đổi.
Hi em, “từng id theo name” –> save id khi name == giá trị nào đó ah?
Nếu đúng muốn như thế, em có thể tham khảo ví dụ: https://gist.github.com/lucas-nguyen-17/6bd24593f95bbf9d2880af6d7233f335
Hi anh. Khi reponse trả về mảng 2 chiều. Em muốn get mảng đó lên phần Test trong postman thì em thực hiện câu lệnh nào ạ? Em cám ơn
Em gửi thêm mẫu response và data mà em muốn lấy, anh sẽ dễ hình dung hơn.
Hi anh Giang,
Em có 1 response data như này:
{
“status”: 200,
“error”: “OK”,
“soaErrorCode”: null,
“soaErrorDesc”: null,
“clientMessageId”: “467994f519”,
“path”: “/current-account/query”,
“data”: [
{
“accountInfos”: [
{
“customerId”: “1234”,
“customerName”: “CUSTOMER.1234”,
“accountNumber”: “5083025030912”,
“accountType”: [
“1”
],
“accountCurrency”: “VND”,
“postingRestricts”: [],
“productInfos”: [
{
“type”: “Category”,
“id”: “1001”,
“name”: “Current Accounts”,
“shortName”: “Current Account”
}
],
“jointHolders”: [],
“delegateHandovers”: [],
}
],
“errorCode”: “000”,
“errorDesc”: “Succeed”,
“clientMessageId”: “1111d92-7e98-4ed4-9e0d-a”,
“additionalInfos”: null
}
]
}
Em muốn lấy giá trị customerId em viết script như này thì giá trị lấy ra lại = null
var responseData = pm.response.json().data;
pm.environment.set(“customerId”,responseData[0].accountInfos[0].customerId);
Anh có thể chỉ ra lỗi sai giúp em với ạ.
Em cảm ơn
a nghĩ là path để extract của em đúng rồi, nếu có gì sai thì cái response kia sai, ko đúng chuẩn json.
"delegateHandovers": [],
–> ko được có dấu,
trước}
Nếu vẫn lỗi, ping anh qua skype: nguyen_duy_giang nhé
Em đã lấy được giá trị rồi ạ. Em cảm ơn anh. Do em set biến ở mock enviroment và dùng ở collection khác nên không lấy được. Em chuyển thành pm.globals.set(“customerId”,responseData[0].accountInfos[0].customerId);
là được ạ.