dnibbo Ответов: 0

HTTP плохой запрос (400)


Хорошо, используя приложение .NET, я отправляю веб-запросы к API, который плохо поддерживается; не буду упоминать Microsoft по имени, но это их!

Когда я публикую действительные данные, все хорошо, и я получаю HTTP-созданный ответ, как и ожидалось, yippee...

Однако, когда я отправляю неверные данные, я не получаю ответ обратно; вместо этого он выдает исключение HTTP Error 400 Bad request без каких-либо других сообщений. И когда я говорю "неверные данные", это может быть неверная дата или что-то еще, а не искаженный запрос.

Я попытался поймать исключение и webwexception и изучил трассировку стека, но не могу понять причину сбоя Post.
Если я попробую тот же пост в Postman я действительно вижу причину неудачи;

"error": {
    "code":"BadRequest",
    "message":"Cannot convert a value to target type 'Edm.Decimal' because of conflict between input format string/number and parameter 'IEEE754Compatible' false/true.  CorrelationId:  6fcac78c-7c2a-41c0-95fa-f1eb9908ca8b."}}


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

Любая помощь будет очень признательна.

Что я уже пробовал:

Ловить и анализировать исключение; гуглить везде.

dnibbo

На самом деле вышеизложенное было плохим примером, так как JSON, который я опубликовал, был недействительным.
Однако, если я попытаюсь создать одну и ту же запись дважды, я все равно получу плохую ошибку запроса с приведенным ниже в Postman (все еще не могу поймать в коде)

    
"error": {
   "code": "Unknown",
   "message": "The record already exists.  CorrelationId:  862fae85-f342-43a4-96e7-191f0fae561c."
    }
}


Это просто выглядит так, как будто API выдает исключение Bad Request, если запрос не проходит проверку, но я просто не вижу, как поймать это в приложении .NET.

F-ES Sitecore

- Я должен быть в состоянии поймать это в коде, чтобы я мог определить, что не так с данными."

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

dnibbo

Спасибо, но в этом-то и проблема, я не могу поймать его, HTTP POST выдает исключение, и исключение не содержит ошибки.
Код работает просто отлично, это API, который возвращает плохой запрос, когда он не проходит проверку, это не искаженный запрос и не ошибка кодирования, а плохой API.
Как уже было сказано, мой вопрос заключается в том, как почтальон получает ошибку, когда она недоступна в системе .Трассировка сетевого стека?
Код размещен ниже, но я уверен, что проблема не в этом.

jimmson

Ошибки 4XX-это ошибки на стороне клиента. Так что код был бы весьма полезен, чтобы помочь вам.

dnibbo

Спасибо Джимсону, но почтальон видит ошибку "запись уже существует".
Только сервер будет знать, если запись уже существует, так что это сервер, а не клиент, который решил, что запрос был плохим.

dnibbo

Код приведен ниже, в первый раз, когда я отправляю запрос, он работает, последующие сообщения терпят неудачу, так как запись уже существует.

 
Dim wrResult As HttpWebResponse 
Try  
'   post customer details  
Dim sURL As String = _baseURL & "Customer"
Dim WebRequest As WebRequest = HttpWebRequest.Create(sURL)
WebRequest.ContentType = "application/json"
WebRequest.Credentials = GetCredential(sURL)
WebRequest.PreAuthenticate = True
WebRequest.Method = "POST"
Dim sJson As New StringBuilder
sJson.Append("{")
sJson.Append("""No"": ""XXX"",")
sJson.Append("""Name"": ""FRED""")
sJson.Append("}")
Dim postData As Byte()
Dim utf As New UTF8Encoding
postData = utf.GetBytes(sJson.ToString)
WebRequest.ContentLength = sJson.Length
Using stream = WebRequest.GetRequestStream()
   stream.Write(postData, 0, postData.Length)  
End Using  
wrResult = WebRequest.GetResponse()  
' CODE DOES NOT GET HERE ON FAILING REQUEST  
If Not wrResult.StatusCode = HttpStatusCode.Created Then      
    Throw New Exception("Customer XXX not created in Dynamics.")  
End If  
wrResult.Close()
Catch wex As WebException  
' BAD REQUEST WEB EXCEPTION CAUGHT HERE BUT ERROR MESSAGE NOT EXPOSED aNYWHERE  ???? 
End Try

0 Ответов