Javascript-форум (https://javascript.ru/forum/)
-   Angular.js (https://javascript.ru/forum/angular/)
-   -   Отправка x-www-form-urlencoded GET запроса (https://javascript.ru/forum/angular/48594-otpravka-x-www-form-urlencoded-get-zaprosa.html)

Shitbox2 09.07.2014 17:25

Отправка x-www-form-urlencoded GET запроса
 
Нужно, чтобы GET-параметры передавались в виде x-www-form-urlencoded
{ a: { b: 1, c: 2 }, d: [ 3, 4, { e: 5 } ] }
->
"a[b]=1&a[c]=2&d[]=3&d[]=4&d[2][e]=5"

C POST параметрам и все понятно, но GET-параметры, во-первых, не отображаются в transformRequest, во-вторых, (даже если менять их в requestInterceptor) они автоматом склеиваются из объекта параметров, т.е. собранная строка будет разбита по символам.

nerv_ 09.07.2014 18:09

Если ты используешь $resource они именно так и будут передаваться.

Shitbox2 09.07.2014 19:03

Точно? Использую ресурс. Не передаются. Преобразуются в json, как написано в документации

nerv_ 09.07.2014 19:38

Не точно :D Забыл, что у меня все запросы как x-www-form-urlencoded отправляются)

Shitbox2 10.07.2014 12:24

Т.е. везде проставляешь этот заголовок?) В каком месте это делаешь?

nerv_ 10.07.2014 15:08

'use strict';

// GLOBAL CONFIG

angular


    .module('ng')


    .config(function($httpProvider) {
        $httpProvider.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded;charset=utf-8';
        $httpProvider.defaults.transformRequest.unshift(function(data) {
            return angular.isObject(data) ? Object.toQueryString(data) : data;
        });
    });

Shitbox2 10.07.2014 15:40

Это для POST, а для GET?

Tek 10.07.2014 16:06

$http.defaults.headers.common
- для всех запросов

nerv_ 10.07.2014 20:46

Это же надо, был уверен, что у меня для всех (common) стоит, скопировал, даже не посмотрел :)

Tek, спс. Полез править в проекты =)

Shitbox2, у меня такой враппер есть
/**
 * Sends request to the server
 * @param {Object} options
 * @param {Object} data
 * @returns {Promise}
 * @private
 */
Server.prototype._request = function(options, data) {
    var prop = options.method === 'GET' ? 'params' : 'data';
    options[prop] = data;
    return $http(options);
};

Т.е. когда GET, то params, POST - data
https://docs.angularjs.org/api/ng/service/$http#usage

Shitbox2 11.07.2014 12:46

У меня все же не работает. Проблемы две:

1) ['Content-Type'] = 'application/x-www-form-urlencoded;charset=utf-8' работает только глобально, при установке $http.defaults.headers.common. А мне надо для конкретного ресурса настроить.

2) В любом случае это не работает с GET-параметрами. Даже в документации написано:
Цитата:

params – {Object.<string|Object>} – Map of strings or objects which will be turned to ?key1=value1&key2=value2 after the url. If the value is not a string, it will be JSONified.
Но нигде не сказано, что они могут урлэнкодится...


Часовой пояс GMT +3, время: 01:39.