Сообщение клиента Angular 6 HTTP - неверный запрос

У меня следующая проблема. У меня есть сервер, на котором установлен API, я отправляю запрос конечной точке регистрации, но в ответ я получаю ошибку 400 Bad Request, в которой говорится, что имя, фамилия, адрес электронной почты и т. Д. Должны быть заполнены. Проблема в том, что они заполнены. Я больше скучаю по идеям. Мой код:

import {Component} from '@angular/core';
import {HttpClient, HttpHeaders} from '@angular/common/http';

@Component({
    selector: 'app-root',
    templateUrl: './app.component.html',
    styleUrls: ['./app.component.css']
})

export class AppComponent {
    title = 'Brak tytułu';

    constructor(private http: HttpClient) {
    }

    registerUser() {
        const config = {headers: new HttpHeaders().set('Content-Type', 'application/x-www-form-urlencoded')};
        const user: User = {
            name: 'Pawel',
            surname: 'Tester',
            email: 'tester@wp.pl',
            password: 'loremipsum12',
            password_confirm: 'loremipsum12',
            event_id: 1,
        };

        this.http.post('https://myapiserver', user, config).subscribe((res) => {
                console.log(res);
                console.log(user);
            },
            error => {
                console.log(error);
                console.log(user);
            });
    }
}

interface User {
    name: string;
    surname: string;
    email: string;
    password: string;
    password_confirm: string;
    event_id: number;
}

Этот код работает нормально, но он angularJS

    // User create
$scope.createUser = function()
{
    var create_req = $rootScope.reqDefaults;
        create_req.method = 'POST';
        create_req.url = $rootScope.api+'/admin/user';
        create_req.data = $httpParamSerializerJQLike($scope.current);
        create_req.transformRequest = angular.identity;

    // Users list
    $http(create_req)
        .then(function(response){
            $location.path('/users');
            $.notify({
                title: '<strong>Użytkownik utworzony.</strong>',
                message: $scope.current.name+' '+$scope.current.surname+' (ID: '+response.data.id+')'
            },{
                type: 'success'
            });
            return true;
        }, function(response){
            $rootScope.rspError(response.data);
            return false;
        });
};

Если я отправляю запрос в конечную точку реестра от Почтальона, все работает нормально, мой пользователь зарегистрирован правильно:(Я установил тип контента для application/x-www-form-urlencoded.

4 ответа

Решение

HttpClient от Angular на самом деле очень умен, чтобы выяснить, какой тип контента должен иметь ваш запрос. Просматривая исходный код в этой строке

if (this.body instanceof HttpParams) {
  return 'application/x-www-form-urlencoded;charset=UTF-8';
}

вы увидите, что он установит требуемый заголовок для вас, если вы установите тело как HttpParams, Итак, решение вашей проблемы должно быть:

const body = new HttpParams()
  .set('name', 'foo')
  .set('surname', 'bar')

this.http.post('https://myapiserver', body).subscribe(...);

Не устанавливайте заголовки содержимого, которые по умолчанию будут устанавливать их в JSON, или устанавливайте их для JSON следующим образом: application/json

Однако если ваш API ожидает полезную нагрузку в кодированном виде, вы должны оставить заголовок так же, как он у вас, но измените запрос на отправку данных в кодированном виде следующим образом:

  const body = new HttpParams()
    .set('name', 'Pawel')
    .set('surname', 'Tester');

  this.http.post('https://myapiserver',
    body.toString(),
    config
  );

Это работает для меня

const config = new HttpHeaders().set('Content-Type', 'application/json')
                                .set('Accept', 'application/json')

this.http.post('https://myapiserver', JSON.stringify(user), 
               { headers: config }).subscrib.....

Надеюсь это поможет

РЕДАКТИРОВАТЬ: используя новый HttpClientModule

const formData = new FormData();

// append your data
formData.append('myKey1', 'some value 1');
formData.append('myKey1', 'some value 2');
formData.append('myKey3', true);

this.httpClient.post('https://myapiserver', formData);

НЕ устанавливайте заголовок Content-Type, угловой исправит это для вас! Источник: Как заставить Angular2 POST с помощью x-www-form-urlencoded

Здесь я вижу две основные проблемы: у HttpHeaders отсутствует авторизация:

      const config = {headers: new HttpHeaders().set('Content-Type', 'application/x-www-form-urlencoded');
HttpHeaders().set('Authorization': 'Basic ' + credentials);
HttpHeaders().set('Accept':'*/*')
};

где учетные данные могут быть: const credentials = btoa ("angularUser" + ":" + "пароль"); должен быть определен в CORS серверной части для проверки.

другое дело, тело, должно быть определено следующим образом: let user = new URLSearchParams ();

user.set ('параметр1', 'значение1'); user.set ('параметр2', 'значение2'); ... И если не работает, попробуйте изменить Content-type с application / x-www-form-urlencoded на application / json. По крайней мере, у меня это сработало. Ваше здоровье.

Другие вопросы по тегам