2015-03-16 5 views
0

У нас есть клиентский api-вызов, который требует, чтобы сообщение отправлялось как данные формы. Когда мы запускаем вызов через расширение Postman от Chrome, он успешно запускается, когда мы указываем данные формы, и возвращает ошибку, если мы укажем x-www-form-urlencoded. Это ожидается.request.post продолжает переопределять контент-тип как тип содержимого: application/x-www-form-urlencoded при задании данных формы

Однако при попытке запустить в node.js с помощью пакета запросов npm для обработки сообщения мы продолжаем получать сообщение об ошибке из api, которое, к сожалению, не дает нам сведений о том, что не так. Но мы видим, что объект заголовка запроса выглядит следующим образом, когда он выходит:

_header: «POST/API/клиент/купон/добавить HTTP/1.1 \ г \ nAuthorization: Basic [Auth строка отредактированный] \ r \ nhost: beta1.client.com \ r \ ncontent-type: application/x-www-form-urlencoded \ r \ ncontent-length: 172 \ r \ nConnection: keep-alive \ r \ n \ r \ п»,

Наш Node.js код выглядит следующим образом:

//Create the coupon 
    var coupon = { code: "abcde1234"), 
    discount: "33", 
    type: "percent" 
    } 

    var request = require('request'); 
    request.post(
    { 
     url: "https://beta1.client.com/api/coupon/add", 
     headers: { 
     "authorization": auth, 
     "content-disposition": "form-data; name='data'" 
     }, 
     form: coupon 
    }, 

    function (error, response, body) { 
     if (!error && response.statusCode == 200) { 
     console.log(body) 
     } 
    } 
); 

Что мне интересно, почему заголовок типа содержимого продолжает читать «application/x-www-form-urlencoded», когда мы предоставили контент-расположение «форм-данных». Мне кажется, что если бы я мог удалить атрибут заголовка содержимого, он должен работать, но как это сделать?

Любые идеи были бы оценены.

ответ

1

Причина, почему она обновляет заголовок Content-Type к application/x-www-form-urlencoded потому, что вы используете form в своем запросе POST.

request.post({ 
    url: "https://beta1.client.com/api/coupon/add", 
    headers: { 
    "authorization": auth, 
    "content-disposition": "form-data; name='data'" 
    }, 
    form: coupon 
}, function (error, response, body) { 
    ... 
}); 

Для того, чтобы справиться с этим, вам нужно добавить содержимое в body, как указано ниже.

request.post({ 
    url: "https://beta1.client.com/api/coupon/add", 
    headers: { 
    "authorization": auth, 
    "content-disposition": "form-data; name='data'" 
    }, 
    body: coupon 
}, function (error, response, body) { 
    ... 
}); 
+0

gah - конечно! Спасибо за ответ. – Gatmando

+0

Добро пожаловать :) – dShringi

1

В конце концов мы пошли с пакетом форм-данных здесь: https://www.npmjs.com/package/form-data

Наш код теперь выглядит следующим образом:

//create coupon json and stringify it 
    var coupon = { 
     coupon: { 
     code: couponCode, 
     discount: discountPercentage, 
     type: 'percent', 
     product: productId, 
     times: 1, 
     expires: couponExpiresDt 
     } 
    }; 
    var couponString = JSON.stringify(coupon); 

    //create form-data object to be posted to client api 
    var FormData = require('form-data'); 
    var couponForm = new FormData(); 
    couponForm.append('data', couponString); 

    //create submission options for the post 
    var submitOptions = { 
     hostname:config.client_api_host, 
     path:'/api/2/coupon/add', 
     auth:auth, 
     protocol:'https:' 
    }; 

    //submit the coupon/add post request 
    couponForm.submit(submitOptions, function(err, res) { 
     res.resume(); 

     if (err) { 
     callback(err); 
     } else if (res.statusCode != 200) { 
     callback(new Error('API createDiscount post response error:', res.statusCode)); 
     } else { 
     logger.log('info', "coupon code " + couponCode + " has apparently been created"); 
     callback(null, {coupon_code: couponCode, expires: couponExpiresDt}); 
     } 
    });