Получение ошибки 405 http в клиенте для вызова gRPC Web

Я получаю код ошибки http 405 при вызове службы gRPC из клиента отдыха.

Я попытался вызвать метод удаления с помощью клиента gRPC, он работает нормально (т.е. получает 200).

ОТДЫХ КЛИЕНТ

req, err = http.NewRequest("DELETE", fmt.Sprintf("%s%s", *address, "/v1/todo"), nil)
    resp, err = http.DefaultClient.Do(req)
    if err != nil {
        log.Fatalf("failed to call DeleteAll method: %v", err)
    }
    bodyBytes, err = ioutil.ReadAll(resp.Body)
    resp.Body.Close()
    if err != nil {
        body = fmt.Sprintf("failed read Delete response body: %v", err)
    } else {
        body = string(bodyBytes)
    }
    log.Printf("Delete response: Code=%d, Body=%s\n\n", resp.StatusCode, body)

Клиент gRPC

req6 := v1.DeleteAllRequest{
        Api: apiVersion,
    }
    res6, err := c.DeleteAll(ctx, &req6)
    if err != nil {
        log.Fatalf("Delete failed: %v", err)
    }
    log.Printf("Delete all result: <%+v>\n\n", res6)

Ожидается, что функция удаления будет выполнена правильно и получен ответ 200 http.


person Vivek Siddharth    schedule 15.05.2019    source источник
comment
Обычный HTTP-запрос не является допустимым вызовом gRPC (не только методом, но и неверным путем). Вы не должны вручную обрабатывать HTTP-запросы для службы gRPC. Вместо этого используйте клиентские библиотеки gRPC.   -  person Peter    schedule 15.05.2019


Ответы (1)


Текущие браузеры изначально не поддерживают grpc. Поэтому я пытаюсь использовать дополнительный прокси-сервер от envoy (посланник от Lyft), который действует как интерфейс для моей серверной части grpc.

...
static_resources:
cluster:
- name: local_service
    connect_timeout: 0.25s
    type: strict_dns
    lb_policy: round_robin
    load_assignment:
      cluster_name: local_service
      endpoints:
      - lb_endpoints:
        - endpoint:
            address:
              socket_address:
                address: 127.0.0.1
                port_value: 8080
...

Вот как я пишу сервис в своей конфигурации envoy, и более подробную информацию об этом можно найти в репозитории Envoy на Github, у них есть несколько примеров для лучшего понимания процесса.

person JasdeepSingh    schedule 16.05.2019