XML экранированные символы - PullRequest
2 голосов
/ 11 ноября 2010

Я пытаюсь отправить запрос POST для добавления некоторого содержимого в окно API. Правила таковы, что формат тела должен быть XML (значения должны быть XML-экранированными), HTTP-метод (post), требуется аутентификация (да), запрос содержимого (тип контента: «application / xml»

<entries?
  <entry tag="some_tag">
   <value>XML-escaped-entry belongs here</value>
  </entry>
  <entry tag="some_tag">
   <value>XML-escaped-entry belongs here</value>
....
...

 </entries>

Я отправляю запрос следующим образом и получаю ошибку 400 неверных запросов. Это сработало, когда я ввел одно значение для ввода.

 For i As Integer = 0 To searchItems.Count - (1000 - max)
                data = data + "<entries><entry><value>" & searchItems.Item(i) & "</value></entry></entries>" & vbNewLine
            Next
            If uri.Scheme = uri.UriSchemeHttps Then
                Dim request As HttpWebRequest = HttpWebRequest.Create(uri)
                request.Method = method__1
                request.ContentLength = data.Length
                request.ContentType = "application/xml"
                request.Credentials = New System.Net.NetworkCredential("xxx@xxx.com", "xxxxxx")
                Dim writer As New StreamWriter(request.GetRequestStream)
                writer.Write(data)
                writer.Close()
                Dim oResponse As HttpWebResponse = request.GetResponse()
                Dim reader As New StreamReader(oResponse.GetResponseStream())
                Dim tmp As String = reader.ReadToEnd()
                oResponse.Close()
            End If

дополнительные правила: -Лучшая практика заключается в постепенном добавлении и удалении изменений в ваш список записей вместо удаления / воссоздания всего списка каждый раз, когда необходимо внести изменения. -Новые записи размещаются в верхней части очереди для опроса и обрабатываются в режиме LIFO.

Ответы [ 2 ]

5 голосов
/ 11 ноября 2010

Вам нужно искать и кодировать специальные символы во время цикла.Что-то вроде:

 For i As Integer = 0 To searchItems.Count - (1000 - max)
            data = data + "<entries><entry><value>" & encodeEntry(searchItems.Item(i)) & "</value></entry></entries>" & vbNewLine
 Next

 Private Function encodeEntry(ByVal entry As String) As String
     Dim returnValue As String = entry

     ' Replace the special characters
     returnValue = returnValue.Replace("&", "&amp;")
     returnValue = returnValue.Replace("""", "&quot;")
     returnValue = returnValue.Replace("'", "&apos;")
     returnValue = returnValue.Replace("<", "&lt;")
     returnValue = returnValue.Replace(">", "&gt;")

     ' return the escaped string
     return returnValue
 End Function
3 голосов
/ 11 ноября 2010
  1. Не используйте оператор + для объединения строк, используйте StringBuilder.
  2. Не используйте StringBuilder для построения XML, используйте XmlWriter, это решит вашу проблему с кодировкой.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...