无法访问带有JSON.Net的Web of Trust(WoT)API

时间:2013-11-06 19:43:09

标签: c# json json.net

我是JSON&的新手我正在使用VS 2013 / C#。这是请求和代码的代码。响应。很简单,没有?

Request request = new Request();
        //request.hosts = ListOfURLs();
        request.hosts = "www.cnn.com/www.cisco.com/www.microsoft.com/";
        request.callback = "process";
        request.key = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";

        string output = JsonConvert.SerializeObject(request);
      //string test = "hosts=www.cnn.com/www.cisco.com/www.microsoft.com/&callback=process&key=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
        try
        {

            var httpWebRequest = (HttpWebRequest)     WebRequest.Create("http://api.mywot.com/0.4/public_link_json2?);
            httpWebRequest.ContentType = "application/json";
            httpWebRequest.Method = "POST";

            using (var streamWriter = new StreamWriter(httpWebRequest.GetRequestStream()))
           {
                string json = output;

                streamWriter.Write(json);
           }
            var httpResponse = (HttpWebResponse) httpWebRequest.GetResponse();
            using (var streamReader = new StreamReader(httpResponse.GetResponseStream()))
            {
                var responseText = streamReader.ReadToEnd();
            }
        }
        catch (WebException e)
        {
            MessageBox.Show(e.ToString());
        }
        //response = true.
        //no response = false
        return true;
    }

当我运行此操作时,我收到405错误,指示方法不允许。

在我看来,这里至少存在两个可能的问题:(1)WoT API(www.mywot.com/wiki/API)需要一个带身体的GET请求,& httpWebRequest不允许httpWebRequest.Method中的GET;或(2)序列化字符串未正确序列化。

注意:在下面我必须删除前导“http://”,因为我没有足够的代表来发布超过2个链接。

应该看起来像: api.mywot.com/0.4/public_link_json2?hosts=www.cnn.com/www.cisco.com/www.microsoft.com/&callback=process&key=xxxxxxxxxxxxxx

但看起来像: api.mywot.com/0.4/public_link_json2?{"hosts":"www.cnn.com/www.cisco.com/www.microsoft.com/","callback":"process","key":"xxxxxxxxxxxxxxxxxxx “}。

如果我浏览到:api.mywot.com/0.4/public_link_json2?hosts = www.cnn.com / www.cisco.com / www.microsoft.com /& callback = process& key = xxxxxxxxxxxxxx;我得到了预期的回应。

如果我浏览:api.mywot.com/0.4/public_link_json2?{"hosts":"www.cnn.com/www.cisco.com/www.microsoft.com/","callback":"process ”, “重点”: “xxxxxxxxxxxxxxxxxxx”};我得到403拒绝错误。

如果我硬编码请求&像下面一样发送GET:

var httpWebRequest =(HttpWebRequest)WebRequest.Create(“api.mywot.com/0.4/public_link_json2?+”test“);它也按预期工作。

我很感激任何这方面的帮助&希望我把问题弄清楚了。 THX。

1 个答案:

答案 0 :(得分:0)

在我看来问题就是你在URL中发送JSON。根据您引用的API doc,API需要常规的URL编码参数(而不是JSON),并且它会在响应正文中返回 JSON:

  

请求

     

API由许多接口组成,所有接口都使用对api.mywot.com的普通HTTP GET请求进行调用,如果成功则返回XML或JSON格式的响应。 HTTP状态代码用于返回错误信息,参数使用标准URL约定传递。请求格式如下:

     

http://api.mywot.com/version/interface?param1=value1&param2=value2

您不应该序列化您的请求;你应该反序列化响应。上面的所有测试都证实了这一点。