С# Не удается опубликовать данные с помощью HttpRequestMessage и получить статус 400

Я пробовал несколько разных способов, которыми я не могу заставить pipeId публиковать (получать 400), см. код ниже:

{
                client.BaseAddress = new Uri(_serviceConfig.DataGapsBaseUrl);
                var request = new HttpRequestMessage(HttpMethod.Post, "/piper/jobs");

                var jsonContent = new StringContent(JsonConvert.SerializeObject(new
                {
                    pipelineId = _serviceConfig.DataPipelineId
                }), Encoding.UTF8, "application/json");
                
                request.Content = jsonContent;

                var token = await GetToken();
                client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token.ToString());

                var result = await client.SendAsync(request);

                var json = JsonConvert.DeserializeObject<JToken>(result.Content.ReadAsStringAsync().Result);
                var jobId = json["id"].ToString();
                return jobId;
            }
        }

Когда я использую Postman те же действия, что и выше, я получаю статус 200 и результаты:

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
69
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

поскольку вы используете асинхронное ожидание, используйте его везде, и этот синтаксис более распространен.

using HttpClient client = new HttpClient { BaseAddress = new Uri(baseUri) };

client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token.ToString());

var jsonContent = new StringContent(JsonConvert.SerializeObject(new
                {
                    pipelineId = _serviceConfig.DataPipelineId
                }), Encoding.UTF8, "application/json");

 var response = await client.PostAsync(uri, jsonContent);

 var json = await response.Content.ReadAsStringAsync();

var jObj = JObject.Parse(json);
var createTime =  (string) jObj["createTime"]; //I can't see Id in Postman

Результат возвращается нулевым и получает статус 400. Проблема выше этого блока кода.

Chaka 31.03.2023 20:37

Запрос.Содержимое = jsonContent; // значение, установленное в jsonContent, не приходит

Chaka 31.03.2023 20:38

В основном, тело сообщения туда не попадает

Chaka 31.03.2023 20:39

"{\"status\":400,\"message\":\"BAD_REQUEST\",\"details\":[\"‌​GDP400000: запрос недействителен или не может быть обслужен иным образом.\"]}"

Chaka 01.04.2023 01:08

{Метод: POST, RequestUri: 'dataopspoc.ops.afsaousc.us:6055/piper/jobs', версия: 1.1, содержимое: System.Net.Http.StringContent, заголовки: { Авторизация: Bearer eyMi0yM2RhZjk0MjgY2x1c3RlciIsInZpZXctcGlwZWx pbmUiLCJlZGl0LXR‌​lbXBsYXRlIiwiZGF Запрос -Context: appId=cid-v1:08afd478-a5bc-46b5-91cb-7afaf94e6679 Идентификатор запроса: |a746c32fcd6a1f20429f2e84170a8fcf.63f53df6cb3ea999. traceparent: 00-a746c32fcd6a1f20429f2e84170a8fcf-63f53df6cb3ea999-00 Content-Type: application/json; charset=utf-8 Длина содержимого: 53 }}

Chaka 01.04.2023 01:10

@Chaka Код, который я разместил, использовался сотни раз и никогда не подводил. Вам лучше использовать отладчик, чтобы проверить значение _serviceConfig.DataPipelineId и опубликовать код действия piper/jobs, если это возможно.

Serge 01.04.2023 01:22

Вы дали мне хороший код. JSON, который я передал, был неверным. Еще раз спасибо за помощь.

Chaka 01.04.2023 05:03

Для начинающих:

  • Вы забыли сериализовать StringContent
var jsonContent = new StringContent(JsonConvert.SerializeObject(new
                {
                    pipelineId = _serviceConfig.DataPipelineId
                }), Encoding.UTF8, "application/json");

Измените следующее, используя await aswell, чтобы предотвратить блокировку потока

var json = JsonConvert.DeserializeObject<JToken>(await result.Content.ReadAsStringAsync());

Обратите внимание, что если ваш клиент является одноэлементным, и вы устанавливаете аутентификацию из асинхронного контекста, он может быть перезаписан другим вызовом, либо заново создать клиент, либо, возможно, установить авторизацию в HttpRequestMessage:

var request = new HttpRequestMessage(HttpMethod.Post, "/piper/jobs");
request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", token.ToString()

"{\"status\":400,\"message\":\"BAD_REQUEST\",\"details\":[\"‌​GDP400000: запрос недействителен или не может быть обслужен иным образом.\"]}"

Chaka 01.04.2023 01:07

{Метод: POST, RequestUri: 'dataopspoc.ops.afsaousc.us:6055/piper/jobs', версия: 1.1, содержимое: System.Net.Http.StringContent, заголовки: { Авторизация: Bearer eyJraWQiOiIxNDA2ZGQ3MC0zOWQ4LTRjOGItYjI1Mi0yM2Rh Zjk0Mjg0NTMi‌LCJhbGciOiJSUzI1NiJ9‌​ .eyJzdWIiOiJjZGlzcG9, sbGluZ3N2YyIsImF1ZCI, 6ImRhdGFvcHNzdWl0ZS1, jbGktY2xpZW50IiwidXN, lci1hdXRob3JpdGllcyI, 6WyJ2aWV3LX RlbXBsYXR‌​lIiwiZWRpdC1waXBlbGl‌​b3ea999-00 Content-Type: application/json; charset=utf-8 Длина содержимого: 53 }}

Chaka 01.04.2023 01:08

Извините, ребята, моя вина, мне нужно отправить это:

{"pipelineId":"zxxzxzxzxz18","входы":{"Batch_Id":9999}}

Нужно было выяснить, как передать двойные кавычки, и это решило проблему.

Другие вопросы по теме