量角器:如何使用标题和正文调用Rest API POST

时间:2016-06-16 16:34:11

标签: protractor

在运行我的e2e测试之前,我已经设置了一些步骤,我必须在执行测试之前创建用户。我使用Protractor的Request API来进行REST API POST调用,但我不确定如何在请求中传递数据(正文)和标题。我的请求应如下所示:

URL : 'rest/users', Headers : {'Content-Type' : 'application/json'}, body: {"userName": "user1", "domain": "1", "password": "password1", "userID": "1"}

我正在尝试做这样的事情:

var request = require('request');

function createuser(url){
    console.log("complete url = ", browser.baseUrl+url);
    request({
        method: 'POST',
        uri: browser.baseUrl+url,
        multipart: [
            {'Content-Type': 'application/json'},
            {body: {
                'userName': 'test3',
                'tenantKey': '0',
                'password': 'Test3',
                 'userID': '3'}
            }
        ],
        function(error, response, body) {
            if (error) {
                return console.error('User Creation failed:', error);
            }
            console.log('User Creation successful!  Server responded with:', body);
         }
     })
};
createuser('rest/1.0/dev/users');

它抛出以下错误(我不确定我做错了什么):

Error: Body attribute missing in multipart.
Stack:
Error: Body attribute missing in multipart.
    at C:\code\ui\dgui\node_modules\request\lib\multipart.js:35:36
    at Array.forEach (native)
    at Multipart.isChunked (C:\code\ui\dgui\node_modules\request\lib\multipart.js:33:11)
    at Multipart.onRequest (C:\code\ui\dgui\node_modules\request\lib\multipart.js:104:22)
    at Request.multipart (C:\code\ui\dgui\node_modules\request\request.js:1176:19)
    at Request.init (C:\code\ui\dgui\node_modules\request\request.js:424:10)
    at new Request (C:\code\ui\dgui\node_modules\request\request.js:142:8)
    at request (C:\code\ui\dgui\node_modules\request\index.js:55:10)
    at createuser (C:\code\ui\dgui\tests\e2e\TestSuites\_BVT\_CreateNewUsers2.js:36:2)
    at Suite.<anonymous> (C:\code\ui\dgui\tests\e2e\TestSuites\_BVT\_CreateNewUsers2.js:49:3)

3 个答案:

答案 0 :(得分:1)

我能够使用&#39; superagent&#39;来实现这一点,这就是我的使用方式:

CallRestAPI:

var request = require( "superagent" );
var PostUrl = browser.baseUrl + 'rest/1.0/dev/users';

exports.CreateUsers = function(body){
console.log("Executing CreateUsers");
var data = '{' +body + '}';
console.log("Send data in post request = ", data);

 request.post( PostUrl ).set('Content-Type', 'application/json').send(data).end(function(err,res){
     if(err){
            console.log("CreateUsers post error= ", err )
        } else{
            console.log("CreateUsers post response = ", res.status)
        }
 });            
};

将此功能用作:

var Common = require('../.././helpers/CallRestAPI');
Common.CreateUsers('"userName": "test1", "tenantKey": "0", "password": "Test1", "userID": "1"');

答案 1 :(得分:0)

在我的代码中通过请求验证进行管理,例如。访问令牌错误或应用程序没有响应。让它成为更好的方法,因为你的命题总是通过测试可以给出误报的东西。

    exports.authorize = function (login, pass) {
    var action = function () {
        return getToken().then(function (token) {
            var dfd = protractor.promise.defer();
            req.post(getBackendUrl() + '/authorize/authenticate')
                .set('Content-Type', 'application/json').set('RequestId', uuid.v4()).set('Authorization', token)
                .send({"login": login, "pass": pass})
                .end(function (err, res) {
                    if (err) {
                        dfd.reject(res)
                    } else {
                        dfd.fulfill(res.body);
                    }
                });
            return dfd.promise;
        })
    };
    return browser.controlFlow().execute(action);
};

端点授权为两者返回200状态代码 - 有效和无效凭证,因此在特定测试中,它可以通过简单的茉莉花来区分,如:

        var Initialize = require('..initialize');
        var successResponse = {status: 'success'};
        expect(Initialize.authorize('some_login', 'some_password')).toEqual(successResponse);

答案 2 :(得分:0)

var request = require('request');

var options = {
    method: 'POST',
    url: 'https://sbx-office-api.b2bcloud.com/rmi/v1/books/list?type=fetchall',
    headers: {
        'Accept': 'application/json, text/plain, */*',
        'Authorization': 'Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsImtpZCI6IlFrTTFRemt6UlVJNE5UazNSVVJGTUVVNU5rTXlNVVpFT0RJek5EQTNPRFkyTVVaRVFrVXdSZyJ9.eyJodHRwczovL21hcnZlbC5zaGFycC5jb20vdGVuYW50aWQiOiJkNTA4Yjc3NC01NjBlLTRlNTktYTk3Yy1mODQxYjhmYjVkN2QiLCJodHRwczovL21hcnZlbC5zaGFycC5jb20vY29ubmVjdGlvbiI6InNoYXJwc29mdHdhcmVkZXYtd2FhZCIsImh0dHBzOi8vbWFydmVsLnNoYXJwLmNvbS9lbWFpbCI6InJhbWVzaHRAU2hhcnBzb2Z0d2FyZWRldi5vbm1pY3Jvc29mdC5jb20iLCJodHRwczovL21hcnZlbC5zaGFycC5jb20vbmFtZSI6IlJhbWVzaCBUIiwiaHR0cHM6Ly9tYXJ2ZWwuc2hhcnAuY29tL3JvbGUiOiJCQSB1c2VyIiwiaXNzIjoiaHR0cHM6Ly9zYnguYXV0aDAuY29tLyIsInN1YiI6IndhYWR8VGVFbVNzNGpnRGpXeTRVX0ItWlo4SDRobFZielVUdzM4djNmb2MzNXVzWSIsImF1ZCI6WyJodHRwczovL3NieC5hdXRoMC5jb20vYXBpL3YyLyIsImh0dHBzOi8vc2J4LmF1dGgwLmNvbS91c2VyaW5mbyJdLCJpYXQiOjE1NjY5NzY4MzIsImV4cCI6MTU2Njk4NDAzMiwiYXpwIjoiQW1zeU9UbHI3akg5eFU5azZlem15ODJNZDV4NDUyZFIiLCJzY29wZSI6Im9wZW5pZCBwcm9maWxlIn0.D5MoBVJ2lWZ7b3FCZtMQkmdMxJot8SCR1-Oso-wponPtF2y6kLxKK5dUftI_yzydvaJsZ9mwjVvZIAHESlrwkjVizYGXTFchjasT81hMZtJgt6iW8sA7Nu5qx7MVsc2z7UAS0mGhV2a_NEvZaYQ1A0dC19wG2A6bNJIMNEy46oJXlUe8nxb1ezkh4CkO3jUnVIPBo4rney_uwcXj-wc5hiE3a6m7jeHphyy70zDBFD_YRiizZaXzI-LTPGvhuRb7UtfcZuOomQqOuH6xebaoe3OzX9aA7CfWCHIJDhjQJwC-5BR5HQ9k7FCae3L4pWfmUVUOTZEFViJtxazLxOjM_w',
        'Content-Type':'application/json',
        'Sec-Fetch-Mode': 'cors',
        'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.87 Safari/537.36'
    },
    body: '{ "headers":{"normalizedNames":{},"lazyUpdate":null}}'
};


it('Should reach testsite', done => {

        request(options, function (error, response, body) {
            console.log('error:', error);
            console.log('statusCode:', response && response.statusCode);
            console.log('body:', body);
            done();
    });
});