PostAsyn c API дает плохой шлюз - PullRequest
0 голосов
/ 10 июля 2020

Я вызываю сторонний POST API из моего собственного API (снова МЕТОД POST). У стороннего API есть ключ безопасности, и он отлично работает с инструментом POSTMAN. Однако, когда я пытаюсь вызвать через код, я получаю сообщение об ошибке «Плохой шлюз». Ниже приведен код, который я пробовал.

 public static async Task<string> GetDetailsfromThirdParty(string kszstrng)
    {
       
        string contentstring = string.Empty;
        using (var client = new HttpClient())
        {               

            string baseURL = "https://abcde.kz.in/b2/vhsearch-all";              
            string prms = kszstrng;// input parameters to API, in JSON Format- this is JSON String.
            
            try
            {
                using (var httpClient = new HttpClient())
                {
                    httpClient.DefaultRequestHeaders.Accept.Clear();
                    httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
                    httpClient.DefaultRequestHeaders.Add("key", "value");
                    client.DefaultRequestHeaders.TryAddWithoutValidation("Content-Type", "application/json");

                    byte[] messageBytes = System.Text.Encoding.UTF8.GetBytes(prms);
                    var content = new ByteArrayContent(messageBytes);
                    content.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("application/json");   
                    var response = await httpClient.PostAsync(baseURL, content).ConfigureAwait(false);                       
                    var result = await response.Content.ReadAsStringAsync().ConfigureAwait(false);
                    contentstring = result;                        

                  
                }
            }
            catch (Exception ex)
                {
                string msg = ex.Message.ToString();
                
                }
            return contentstring;
        }
    }

Я получаю ошибку в этой строке:

var response = await httpClient.PostAsync(baseURL, content).ConfigureAwait(false);       

При попытке выполнить я получаю следующую ошибку: Плохой шлюз

Не можете выяснить, в чем проблема? Нет блокировки сети / Fireawall. Я также прошел перекрестную проверку с Системной командой.

Пожалуйста, предложите любую проблему с кодом.

Ответы [ 2 ]

0 голосов
/ 12 июля 2020

Проблема решена. При формировании объекта в JSON String присутствовали открывающая и закрывающая угловые скобки ([,]). Несмотря на то, что это происходит автоматически при преобразовании в строку JSON, эта строка не была принята поставщиком. Я удалил его и работает отлично. Спасибо всем за поддержку.

0 голосов
/ 10 июля 2020

Прежде всего, я рекомендую вам не объявлять HttpClient в операторе using, поскольку это может вызвать исчерпание ресурсов сокета (поскольку соединения останутся открытыми).

(см. docs для подробностей)

Go для stati c HttpClient (или используйте IHttpClientFactory, если ваш проект. net Core).

Я не могу проверить ваш code, поскольку я не могу получить доступ к этому api.

Но попробуйте, используя более чистый подход:

// static HttpClient
private static readonly HttpClient _HttpClient = new HttpClient();

// Can be used to set the baseUrl of the HttpClient from outside
public static void SetBaseUrl(Uri baseUrl)
{
    _HttpClient.BaseAddress = baseUrl;
}

public static async Task<string> GetDetailsfromThirdParty(string kszstrng)
{
    string contentstring = string.Empty;

    string baseURL = "https://abcde.kz.in/b2/vhsearch-all";
    string prms = kszstrng; // input parameters to API, in JSON Format- this is JSON String.

    try
    {
        // Be aware of which headers you wanna clean if using the static HttpClient
        _HttpClient.DefaultRequestHeaders.Accept.Clear();
        _HttpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
        _HttpClient.DefaultRequestHeaders.Add("key", "value");
        _HttpClient.DefaultRequestHeaders.TryAddWithoutValidation("Content-Type", "application/json");

        byte[] messageBytes = Encoding.UTF8.GetBytes(prms);
        var content = new ByteArrayContent(messageBytes);
        content.Headers.ContentType = new MediaTypeHeaderValue("application/json");

        var response = await _HttpClient.PostAsync(baseURL, content).ConfigureAwait(false);

        if (response.IsSuccessStatusCode)
        {
            var result = await response.Content.ReadAsStringAsync().ConfigureAwait(false);
            contentstring = result;
        }
    }
    catch (Exception ex)
    {
        // your exception handling
    }

    return contentstring;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...