Почему угловой ответ HttpClient равен нулю?

#java #angular #spring-boot #httpclient #angular7

#java #угловой #весенняя загрузка #httpclient #angular7

Вопрос:

Мои среды:

  • Магазин RestController: весенняя загрузка
    • на локальном хосте laptopn ubuntu 18:04
  • ShopService: угловой HttpClient
    • на настольном ПК с локальным хостом Windows 10

Проблема:

Мой запрос get через HttpClient получил ответ null. Но если я использую postman или в браузере, я получил ожидаемое тело ответа.

Угловой код:

 const BASE_URL = 'http://pc01:8081/shopsystem/shops';
const  SHOP_NAME = 'Muster Shop';

@Injectable({
  providedIn: 'root'
})
export class ShopService {

  shop$: Shop;
  address$: Address;
  owner$: Owner;

  //header = new HttpHeaders({ 'Content-Type': 'application/json' });

  constructor(private http: HttpClient) { }

  public getShop(): Observable<Shop>{
    return this.http.get<Shop>(BASE_URL   '/'   SHOP_NAME);
  }
  

Заголовок ответа:

введите описание изображения здесь

Ответ:

введите описание изображения здесь

Запрос на postman:

введите описание изображения здесь

Контроллер загрузки Spring:

введите описание изображения здесь

Я уже пробовал использовать Observable с any и HttpHeaders с application / json, но тот же ответ.

Другое дело: если мой контроллер загрузки Spring возвращает список, я получаю тело ответа с содержимым.

Вопрос:

Почему я получил нулевое или пустое тело в моем запросе HttpClient?

Как я могу это решить?

Спасибо

Комментарии:

1. покажите свой метод Get в контроллере загрузки spring

2. Спасибо за быстрый ответ. Я отредактировал свой вопрос с помощью контроллера загрузки spring

3. Вы пытались настроить его без пробела в uri? Измените muster shop на musterShop и посмотрите, получаете ли вы все еще значение null

4. Я получил 404, как и ожидалось от серверной части. URL-адрес запроса: pc01:8081/shopsystem/shops/MusterShop Метод запроса: ПОЛУЧИТЬ код состояния: 404

5. Я полагаю, что это ваш аддон, который все усложняет. Выключите его и посмотрите, что произойдет. Запустите приложения на том же компьютере и посмотрите, что произойдет. Правильно включите Cors при загрузке spring и посмотрите, что произойдет. Похоже, вам нужно выполнить некоторую отладку.

Ответ №1:

Ваш Angular HttpClient кодирует пробел в переменной path, поэтому он поступает в RestController как Muster Shop .

Затем вы пытаетесь найти запись с таким точным именем, которого не существует.

Вы должны декодировать @PathVariable , прежде чем отправлять его в свой запрос в качестве сборщика.

Комментарии:

1. Но Spring Boot декодирует его автоматически, я вижу это в своем журнале загрузки spring. Если мой запрос от HttpClient достигает моей весенней загрузки, он вызывает ожидаемую службу и возвращает ожидаемый ответ.

Ответ №2:

добавьте аннотацию @CrossOrigin в свой класс контроллера

 @CrossOrigin
@RestController
@RequiredArgsConstructor
@RequestMapping("/api/v1")
public class UserController {

    private final FileStorageService fileStorageService;
    private final GameService service;


    @GetMapping("{id}")
    public GameDTO getUserbyID(@PathVariable Long id) {
        log.info("get {} at {}", service.getUserbyID(id), Calendar.getInstance().getTime());
        return service.getUserbyID(id);
    }

  

Комментарии:

1. Более подробный ответ включал бы пример кода с рекомендуемым исправлением.