Moll ie оплата `Неавторизованный запрос` при обращении к URL с использованием C#, но работает на почтальоне - PullRequest
1 голос
/ 21 января 2020

Moll ie Ошибка платежа при отправке запроса в https://api.mollie.com/v2/payments

с использованием HttpClient класса в System.Net.Http

Moll ie запрос платежа с использованием v2/payments API работает нормально через Postman, но получая unauthorized ошибку запроса в c# код

ниже кода

HttpClient _httpClient = new HttpClient();

public HttpRequestMessage CreateHttpRequest(HttpMethod method, string relativeUri, HttpContent content = null)
{
    HttpRequestMessage httpRequest = new HttpRequestMessage(method, new Uri(new Uri(ApiEndPoint), relativeUri));
    httpRequest.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
    httpRequest.Headers.Authorization = new AuthenticationHeaderValue("Bearer", this._apiKey);
    httpRequest.Content = content;

    return httpRequest;
}

public HttpResponseMessage SendHttpRequestAsync(HttpMethod httpMethod, string relativeUri, object data = null)
{
    HttpRequestMessage httpRequest = this.CreateHttpRequest(httpMethod, relativeUri);
    if (data != null)
    {       
        var content = new StringContent(new JavaScriptSerializer().Serialize(data), Encoding.UTF8, "application/json");
        httpRequest.Content = content;
    }

    HttpResponseMessage response = _httpClient.GetAsync(httpRequest.RequestUri.AbsoluteUri).Result;
    var json = Newtonsoft.Json.JsonConvert.SerializeObject(response);
    if (response.IsSuccessStatusCode)
    {
        //here main logic
    }

    return response;
}

Сообщение от Moll ie сервер Mollie message

{
  "Version": {
    "Major": 1,
    "Minor": 1,
    "Build": -1,
    "Revision": -1,
    "MajorRevision": -1,
    "MinorRevision": -1
  },
  "Content": {
    "Headers": [
      {
        "Key": "Content-Length",
        "Value": [
          "209"
        ]
      },
      {
        "Key": "Content-Type",
        "Value": [
          "application/hal+json"
        ]
      }
    ]
  },
  "StatusCode": 401,
  "ReasonPhrase": "Unauthorized Request",
  "Headers": [
    {
      "Key": "X-Content-Type-Options",
      "Value": [
        "nosniff"
      ]
    },
    {
      "Key": "Strict-Transport-Security",
      "Value": [
        "max-age=31536000; includeSubDomains; preload"
      ]
    },
    {
      "Key": "Date",
      "Value": [
        "Tue, 21 Jan 2020 06:11:41 GMT"
      ]
    },
    {
      "Key": "Server",
      "Value": [
        "nginx"
      ]
    },
    {
      "Key": "WWW-Authenticate",
      "Value": [
        "Basic realm=\"Mollie API Key\""
      ]
    }
  ],
  "RequestMessage": {
    "Version": {
      "Major": 1,
      "Minor": 1,
      "Build": -1,
      "Revision": -1,
      "MajorRevision": -1,
      "MinorRevision": -1
    },
    "Content": null,
    "Method": {
      "Method": "GET"
    },
    "RequestUri": "https://api.mollie.com/v2/payments",
    "Headers": [],
    "Properties": {}
  },
  "IsSuccessStatusCode": false
}

Но основные проблемы заключается в том, что Test_api работает в почтальоне при обращении к URL

Postman image

Ответы [ 3 ]

0 голосов
/ 21 января 2020

Попробуйте, как это будет работать:

using(var httpClient = new HttpClient()) {
 httpClient.SetBearerToken(tokenValue);
 var serData = JsonConvert.SerializeObject(modelData);
 var httpRequestContentData = new StringContent(serData, Encoding.UTF8, "application/json");
 using(var result = httpClient.PostAsync(url, httpRequestContentData).Result) {
  if ((int) result.StatusCode == (int) HttpStatusCode.OK) {
   // Go Ahead 
  }

 }
}
0 голосов
/ 21 января 2020

Что касается вашего случая, вы должны добавить Bearer в заголовок для _httpclient:

_httpClient.DefaultRequestHeaders.Authorization =new AuthenticationHeaderValue("Bearer", this._apiKey);

Теперь, так как вы отправляете тело запроса на GET запрос, который несколько нетрадиционная конструкция, попадающая в серую область спецификации HTTP - конечный результат заключается в том, что многие старые программные продукты либо вообще не могут обработать такой запрос, либо явно отклонят его, поскольку считают, что он искажен.

. NET Framework не поддерживает это из коробки (вы получите ProtocolViolationException). Вы можете установить System.Net.Http.WinHttpHandler и использовать его вместо значения по умолчанию HttpClientHandler при создании клиента:

var handler = new WinHttpHandler();
HttpClient _httpClient = new HttpClient(handler);
//Same code as in question
0 голосов
/ 21 января 2020

Вызов _httpClient.GetAsync(Uri) создает совершенно новый объект HttpRequestMessage для внутреннего использования, вместо использования вашего объекта, настроенного с заголовком Authorization:.

Используйте _httpClient.SendAsync(httpRequest) вместо того, чтобы фактически использовать ваш объект.

...