Невозможно сделать асинхронный вызов Post для конечной точки позиционирования Here Maps - PullRequest
0 голосов
/ 08 ноября 2019

При тестировании вызова через Postman и C # WebRequest это работает, но я не могу сделать то же самое, используя HttpClient с вызовом PostAsync или PostJsonAsync.

Ошибка: неподдерживаемый тип носителя, хотя application / json требуется и применяется.

var httpClient = new HttpClient();
httpClient.DefaultRequestHeaders
                    .Accept
                    .Add(new MediaTypeWithQualityHeaderValue("application/json"));

var content = new StringContent(data, Encoding.UTF8, "application/json");
var response = await httpClient.PostAsync("https://pos.api.here.com/positioning/v1/locate?app_id={id}&app_code={code}", content);
return response;

StatusCode: 415, ReasonPhrase: 'Unsupported Media Type', версия: 1.1, Content: System.Net.Http.HttpConnection + HttpConnectionResponseContent, заголовки: {Дата: пт, 08 ноя. 2019 13:38:37 GMT Сервер: nginx-clojure Тип содержимого: application / json Длина содержимого: 114}

WebRequest

HttpWebRequest request = HttpWebRequest.Create(url) as HttpWebRequest;
if (!string.IsNullOrEmpty(data))
{
    request.ContentType =  "application/json";
    request.Method =  "POST";

    using (var streamWriter = new StreamWriter(request.GetRequestStream()))
    {
        streamWriter.Write(data);
        streamWriter.Flush();
        streamWriter.Close();
    }
}

using (HttpWebResponse webresponse = request.GetResponse() as HttpWebResponse)
{
    using (StreamReader reader = new StreamReader(webresponse.GetResponseStream()))
    {
        string response = reader.ReadToEnd();
        return response;
    }
}

1 Ответ

1 голос
/ 08 ноября 2019

Я вижу два различия:

  1. Вы устанавливаете заголовок Accept в своем коде HttpClient, где вы не были в вашем коде WebRequest. Это определяет тип данных, которые вы принимаете. Если этот вызов API не возвращает JSON, то он может просто сказать: «Тогда мне нечего вам сказать». Вы можете попробовать просто удалить всю эту строку.
  2. Content-Type в вашем коде HttpClient будет application/json; charset=utf-8, тогда как в вашем коде WebRequest вы установите значение application/json. Я не понимаю, почему charset заставил бы его подавиться, но если изменение # 1 не сработало, вы можете попробовать установить Content-Type напрямую и посмотреть, будет ли это иметь какое-то значение:
var content = new StringContent("");
content.Headers.ContentType = new MediaTypeHeaderValue("application/json");
...