コード例 #1
0
        public virtual async Task <GetPriceResponseDto> GetPrice(
            GetPriceRequestDto requestDto,
            CancellationToken cancellationToken
            )
        {
            var request = new HttpRequestMessage(HttpMethod.Post, ApiInfo.RemoteServiceUri)
            {
                Content = new StringContent(JsonSerializer.Serialize(requestDto),
                                            Encoding.UTF8, APPLICATION_JSON)
            };


            var response = await HttpClient.Send(request, cancellationToken);

            return(JsonSerializer.Deserialize <GetPriceResponseDto>(await response.Content.ReadAsStreamAsync()));
        }
コード例 #2
0
        private GetPriceRequestRemoteDto GetPriceLocalRequestToRemoteRequest(
            GetPriceRequestDto request
            )
        {
            if (request.Addresses is null)
            {
                throw new AlopeykException("Addresses must have value for GetPrice()");
            }

            if (request.Addresses.Origin is null || request.Addresses.Destinations is null ||
                !request.Addresses.Destinations.Any())
            {
                throw new AlopeykException("Addresses must have origin and at least one destination for GetPrice()");
            }

            return(new GetPriceRequestRemoteDto
            {
                transport_type = TransportTypeToString(request.TransportType),
                cached = request.Cashed,
                has_return = request.HasReturn,
                //optimized = request.Optimized,
                addresses = request.Addresses.Destinations.Select(
                    dst => new GetPriceAddressRequestRemoteDto
                {
                    type = "destination",
                    lng = dst.Longitude,
                    lat = dst.Latitude,
                }
                    ).Prepend(new GetPriceAddressRequestRemoteDto
                {
                    type = "origin",
                    lng = request.Addresses.Origin.Longitude,
                    lat = request.Addresses.Origin.Latitude,
                }).ToArray()
            });
        }
コード例 #3
0
        public virtual async Task <BaseResponseDto <GetPriceResponseDto> > GetPrice(
            GetPriceRequestDto request,
            CancellationToken cancellationToken
            )
        {
            if (request is null)
            {
                throw new ArgumentNullException(nameof(request));
            }

            var payload     = GetPriceLocalRequestToRemoteRequest(request);
            var payloadJson = JsonSerializer.Serialize(payload);

            var path = GetPriceV2EndpointPath;

            var retryContext = await RetryHandler.BeginTry(cancellationToken);

            HttpResponseMessage response = null;
            bool retry = false;

            var content = new StringContent(payloadJson, Encoding.UTF8, ApplicationJsonMime);

            path = CreatePath(path);

            do
            {
                try
                {
                    response = await Send(
                        new HttpRequestMessage(HttpMethod.Post, path)
                    {
                        Content = content
                    },
                        cancellationToken
                        );

                    if (!response.IsSuccessStatusCode)
                    {
                        return(await ThrowOnInvalidStatusCode <GetPriceResponseDto>(response));
                    }

                    await RetryHandler.EndTry(retryContext, cancellationToken);
                }
                catch (Exception ex)
                {
                    retry = await RetryHandler.CatchException(retryContext, ex, cancellationToken);
                }
            } while (retry);

            if (response is null)
            {
                throw new InvalidOperationException();
            }

            var responseStream = await response.Content.ReadAsStreamAsync();

            var result = JsonSerializer.Deserialize <RemoteBaseResponseDto <GetPriceResponseRemoteDto> >(responseStream);

            if (result is null)
            {
                throw new AlopeykException("Object was empty in alopeyk's response.");
            }

            var obj = result.@object;

            var output = new BaseResponseDto <GetPriceResponseDto>
            {
                Status  = FormatStatusCode(result.status),
                Message = result.message,
                Object  = obj is null
                    ? null
                    : GetPriceRemoteResponseToLocalResponse(obj)
            };

            BindBaseResponse(output, response);

            return(output);
        }