vb.net HttpWebRequest с данными JSON не выполняется, но работает при кодировании в URL - PullRequest
0 голосов
/ 21 октября 2018

Я пытаюсь создать httpwebrequest в vb.net для POST для suitecrm, но каждый раз получаю неверный логин.Проблема, по-видимому, связана с самим содержимым JSON, потому что он прекрасно работает, если я сделаю его частью URL-адреса.

Сначала я создаю объект newtonsoft JObject:

Dim jobjReq = New Newtonsoft.Json.Linq.JObject(New Newtonsoft.Json.Linq.JProperty(
    "user_auth",
    New Newtonsoft.Json.Linq.JObject(
    New Newtonsoft.Json.Linq.JProperty("user_name", username),
    New Newtonsoft.Json.Linq.JProperty("password", Security.HashStringMD5(password))
    ))
)
Dim jobjReq2 = New Newtonsoft.Json.Linq.JObject(New Newtonsoft.Json.Linq.JProperty("rest_data", jobjReq))

Эторезультирующий JSON, который создается

{
  "rest_data": {
    "user_auth": {
      "user_name": "XXXXXX",
      "password": "XXXXXXXXXXXXXXXXX"
    }
  }
}

и передается этой функции:

Public Sub New(urlString As String, method As String, jsonObject As Newtonsoft.Json.Linq.JObject)
    Dim uri As New Uri(urlString)
    httpRequest = DirectCast(System.Net.WebRequest.Create(uri), System.Net.HttpWebRequest)
    Try
        With httpRequest
            .Method = method
            .KeepAlive = True
            .UserAgent = "Mozilla/5.0 (iPhone; U; CPU like Mac OS X; en) AppleWebKit/420+ (KHTML, like Gecko) Version/3.0 Mobile/1C25 Safari/419.3"
            .ContentType = "application/json"
            Dim stringReq = Newtonsoft.Json.JsonConvert.SerializeObject(jsonObject)
            Dim byteData As Byte() = System.Text.Encoding.UTF8.GetBytes(stringReq)
            .ContentLength = byteData.Length
            Dim postreqstream As System.IO.Stream = .GetRequestStream()
            postreqstream.Write(byteData, 0, byteData.Length)
            postreqstream.Close()
        End With
    Catch exception As System.Net.WebException
        MsgBox(exception.Status.ToString & vbLf & exception.Message.ToString & vbLf)
    End Try

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

Тем не менее, если я сериализую JObject и соединю его с URL-адресом следующим образом: http://XXX.XXX.XXX.XXX/SuiteCRM/service/v4_1/rest.php?method=login&input_type=JSON&response_type=JSON&rest_data={"user_auth":{"user_name":"XXXXX","password":"XXXXXXXXXXXX"}} Он работает просто отлично.

Я отлично справляюсь со вторым способом и могу отлично публиковать и получать записи, за исключением того, что теперь мне нужно опубликовать большую запись, и я превышаю ограничение длины URL

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

...