400 неверный запрос: в XML-документе (1, 1254) есть сообщение об ошибке с неверным номером строки - PullRequest
0 голосов
/ 28 апреля 2018

Я отправляю запрос на внешний API из моего приложения, используя HttpWebRequest и HttpWebResponse.

Всякий раз, когда в запросе XML возникает ошибка из-за неправильных значений, переданных в узлах XML, возникает ответ об ошибке 400 Bad request и сообщение об ошибке «В документе XML есть ошибка (51, 14)». Проблема заключается в том, что в XML-запросе возникает ошибка, в XML-ответе должно отображаться сообщение об ошибке с правильным номером строки. но я получаю сообщение об ошибке с неправильным номером строки, и это всегда «Ошибка в XML-документе (1, 1254)». На самом деле в строке 1 ошибки нет. Из-за этой проблемы у меня нет шансов указать на ошибку при устранении неполадок.

Можете ли вы помочь, как получить ответ с правильным номером строки в XML.

Ниже приведен мой существующий код в vb для отправки запроса в API.

Dim Wreq As HttpWebRequest
Dim MyURI As String = String.Empty
Dim bytes() As Byte
Try
MyURI = p_strURL
Wreq = HttpWebRequest.Create(MyURI)
Wreq.Method = "POST"
bytes = System.Text.Encoding.UTF8.GetBytes(pi_strRequestXML)
Wreq.ContentLength = bytes.Length 'pi_strRequestXML.Length
Wreq.ContentType = "application/x-www-form-urlencoded"
Wreq.KeepAlive = False
Wreq.Headers.Add("Authorization", "bearer" + " " + strAccessToken)
Using OutputStream As StreamWriter = New StreamWriter(Wreq.GetRequestStream())
OutputStream.Write(pi_strRequestXML)
End Using

Using Wres As HttpWebResponse = Wreq.GetResponse()
Using loResponseStream As StreamReader = New StreamReader(Wres.GetResponseStream())
oResponse = loResponseStream.ReadToEnd()
End Using
End Using
Return oResponse
Catch e As WebException
Throw
Catch objSysEx As Exception
Throw
Finally

End Try

Спасибо

1 Ответ

0 голосов
/ 18 мая 2018

Наконец-то я смог найти и решить эту проблему. Проблема была в запросе XML, который я пытался отправить. XML-запрос не был правильно отформатирован, поэтому он показывал неправильные номера строк в случае ошибки в XML. Решением для этого было форматирование XML запроса с правильными отступами. Ниже приведен код, который я использовал для создания хорошо отформатированного XML.

Using sw As New StringWriterWithEncoding(Encoding.UTF8)
    Using tw As New XmlTextWriter(sw)
     'tw.Settings.Encoding = Encoding.UTF8
      tw.Formatting = Xml.Formatting.Indented
      tw.Indentation = 4
      Dim docu As New XmlDocument
      docu.LoadXml(strXML)
      docu.Save(tw)
      strProfileXML = Convert.ToString(sw)
   End Using
End Using

в коде выше, StringWriterWithEncoding - это функция, которая используется для создания форматированного XML с кодировкой UTF-8. если не использовать эту функцию, то XML будет создан с UTF-16

Ниже приведена функция, используемая для установки кодировки для XML

Private NotInheritable Class StringWriterWithEncoding
        Inherits StringWriter
        Private ReadOnly m_encoding As Encoding
        Public Sub New(encoding As Encoding)
            m_encoding = encoding
        End Sub
        Public Overloads Overrides ReadOnly Property Encoding() As Encoding
            Get
                Return m_encoding
            End Get
        End Property
    End Class
...