将JSON curl转换为C#

时间:2013-03-28 15:47:19

标签: c# curl solr httpwebrequest

我有以下卷曲代码:

curl 'localhost:8983/solr/sessions/update?commit=true' -H 'Content-type:application/json' -d '[{"Session_SessionId":"da7007e9-fe7a-4bdf-b9e4-1a55034cf08f","Session_HasComments":{"set":true}}]'

我正在尝试转换为C#,但每次都出错,所以不确定我的代码是否正确...

这是我到目前为止所拥有的:

        string path = "http://localhost:8983/solr/sessions/update?commit=true";
        var httpWebRequest = (HttpWebRequest)WebRequest.Create(path);
        httpWebRequest.ContentType = "application/json";
        httpWebRequest.Method = "POST";

        using (var streamWriter = new StreamWriter(httpWebRequest.GetRequestStream()))
        {
            string json = "{\"Session_SessionId\":\"" + sessionId + "\"," +
                          "\"" + fieldName + "\":{\"set\":\"" + fieldValue + "\"}}";

            streamWriter.Write(json);
            streamWriter.Flush();
            streamWriter.Close();

            var httpResponse = (HttpWebResponse)httpWebRequest.GetResponse();
            using (var streamReader = new StreamReader(httpResponse.GetResponseStream()))
            {
                var result = streamReader.ReadToEnd();
            }
        }

这一行似乎总是出错()

var httpResponse = (HttpWebResponse)httpWebRequest.GetResponse();

我得到的错误是:

The remote server returned an error: (400) Bad Request.","StackTrace":"   at System.Net.HttpWebRequest.GetResponse()

有什么想法吗?提前谢谢!

戴夫

5 个答案:

答案 0 :(得分:1)

也许是因为您删除了要传输到请求中的JSON内容中的方括号?尝试将[]添加回数据的开头/结尾。虽然“BadRequest”通常是非常严格的错误,告诉您您的HTTP请求格式错误,但您的服务器实际上也可能会返回该代码以用于其他情况 - 例如缺少会话ID - 这可能发生在此处。

注意差异:

-d '[{"Session_SessionId":"da70.....
    ^ bracket

string json = "{\"Session_SessionId\":\"" + sessionId + "\"," + ....
               ^ no bracket

在数据结尾处也是如此 但是,当然,这只是猜测。 :)

答案 1 :(得分:0)

服务器无法理解您的请求。你检查了json变量的输出吗?我相信JSON字符串没有正确生成。

为什么不使用JavaScriptSerializer.Serialize创建JSON字符串。

答案 2 :(得分:0)

您使用带有JSON对象的更新处理程序需要遵循Update JSON - Update Commands

中列出的JSON格式

答案 3 :(得分:0)

正如另一位用户建议您的JSON输出与CURL不匹配。请尝试以下操作,而不是键入文本。

var data = new[]
{
    new
    {
        Session_SessionId = "da7007e9-fe7a-4bdf-b9e4-1a55034cf08f",
        Session_HasComments = new {set = true}
    }
};

var json = new System.Web.Script.Serialization.JavaScriptSerializer().Serialize(data);

此外,您正在使用using关键字来编写数据,并尝试在块内部处理响应 - 它可能确实有所作为,但可能值得在此块之外移动它。

最后,您可能需要将数据编码为字节数组。

以下是实施上述建议的代码。

string path = "http://localhost:8983/solr/sessions/update?commit=true";
var httpWebRequest = (HttpWebRequest)WebRequest.Create(path);
httpWebRequest.ContentType = "application/json";
httpWebRequest.Method = "POST";

var data = new[]
{
    new
    {
        Session_SessionId = "da7007e9-fe7a-4bdf-b9e4-1a55034cf08f",
        Session_HasComments = new {set = true}
    }
};

string json = new System.Web.Script.Serialization.JavaScriptSerializer().Serialize(data);
byte[] byteData = new System.Text.ASCIIEncoding().GetBytes(json);

httpWebRequest.ContentLength = byteData.Length;
using (Stream stream = httpWebRequest.GetRequestStream())
{
   stream.Write(byteData,0,byteData.Length);
}

HttpWebResponse resp = (HttpWebResponse)httpWebRequest.GetResponse();
string respStr = new StreamReader(resp.GetResponseStream()).ReadToEnd();

Console.WriteLine("Response : " + respStr);

答案 4 :(得分:0)

戴夫,它适合我。

你缺少方括号。只需用以下内容替换相应的行:

string json =“[{\”Session_SessionId \“:\”“+ sessionId +”\“,”+                           “\”“+ fieldName +”\“:{\”set \“:\”“+ fieldValue +”\“}}]”;