Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用C#Restsharp,如何复制表单帖子?_Javascript_C#_Jquery_Json_Restsharp - Fatal编程技术网

Javascript 使用C#Restsharp,如何复制表单帖子?

Javascript 使用C#Restsharp,如何复制表单帖子?,javascript,c#,jquery,json,restsharp,Javascript,C#,Jquery,Json,Restsharp,我正在使用rest服务获取一些json数据。作为测试工具,他们给了我一个url,如果我在浏览器中找到url,我有一个表单,我可以在文本区域中放置一些json,然后提交表单,我会在页面上重新加载json结果 我现在正试图通过在C#中使用RestSharp以编程方式复制这一点,但我遇到了一个问题,调用的结果是我要访问的页面的html(而不是json结果) 这是我的密码: var client = new RestClient {BaseUrl = new Uri("http://myhost.com

我正在使用rest服务获取一些json数据。作为测试工具,他们给了我一个url,如果我在浏览器中找到url,我有一个表单,我可以在文本区域中放置一些json,然后提交表单,我会在页面上重新加载json结果

我现在正试图通过在C#中使用RestSharp以编程方式复制这一点,但我遇到了一个问题,调用的结果是我要访问的页面的html(而不是json结果)

这是我的密码:

var client = new RestClient {BaseUrl = new Uri("http://myhost.com:22333") };        

var request = new RestRequest { Method = Method.POST, Resource = "/site/api", RequestFormat = DataFormat.Json };

 request.AddBody(new
        {
            fieldtype = "name", value = "joe"
        });
        request.AddHeader("accept", "application/json");

        client.Authenticator = new NtlmAuthenticator();
        var response = client.Execute(request);
        var jsonDto = new JsonDeserializer().Deserialize<ResultObj>(response);
var client=new RestClient{BaseUrl=new Uri(“http://myhost.com:22333") };        
var request=new RestRequest{Method=Method.POST,Resource=“/site/api”,RequestFormat=DataFormat.Json};
request.AddBody(新的
{
fieldtype=“name”,value=“joe”
});
AddHeader(“接受”、“应用程序/json”);
client.Authenticator=new NtlmAuthenticator();
var response=client.Execute(请求);
var jsonDto=new jsondserializer()。反序列化(响应);
如果我查看调试器中的response.Content(在任何反序列化之前),我会看到一个网页的html字符串,该字符串与要发布的表单一起出现(类似于下面的内容)


输入JSON:
有人能告诉我这里遗漏了什么,因为我希望得到相同的json结果作为响应。我在浏览器中提交表单后看到的内容请尝试以下操作:

var client = new RestClient {"http://myhost.com:22333/site/api"};        

var request = new RestRequest {  RequestFormat = DataFormat.Json };

 request.AddBody(new
        {
            fieldtype = "name", value = "joe"
        });

        client.Authenticator = new NtlmAuthenticator();
        var response = client.Post(request);
        if (response.StatusCode == HttpStatusCode.OK)
        {
            var jsonDto = new JsonDeserializer().Deserialize<ResultObj>(response);
var client=new RestClient{”http://myhost.com:22333/site/api"};        
var request=new RestRequest{RequestFormat=DataFormat.Json};
request.AddBody(新的
{
fieldtype=“name”,value=“joe”
});
client.Authenticator=new NtlmAuthenticator();
var响应=client.Post(请求);
if(response.StatusCode==HttpStatusCode.OK)
{
var jsonDto=new jsondserializer()。反序列化(响应);

表单
有一个名为
json\u input
的文本字段,将用作请求参数

<textarea name="json_input" cols="80" rows="30">

确保根据API控制器方法的期望创建模型。 我使用您提供的信息创建了一个示例,您需要将所有表单字段添加到模型中

//Model for the data you are sending
public class TestModel
{
    public string Name { get; set; }
}

//define client, request and model
var client = new RestClient {BaseUrl = new Uri("http://myhost.com:22333") };        
var request = new RestRequest { Method = Method.POST, Resource = "/site/api", RequestFormat = DataFormat.Json };
var testModel = new TestModel() { Name = "joe" };

//serialize model as json and add it to the request
var json = request.JsonSerializer.Serialize(testModel);
request.AddParameter("application/json; charset=utf-8", json, ParameterType.RequestBody);

//execute request
IRestResponse response = client.Execute(request);
确保您正在发布到API的正确URI

继续检查您收到的HTML,看看它是否给您任何错误

希望这有帮助。

如HTML代码所示,表单的操作URL将等待以下表单字段:

  • json_输入
在代码中调用
request.AddBody(new{…})
,执行以下操作:

request.AddBody(new { json_input = "{ fieldtype : \"name\", value : \"joe\"}" });

//OR

request.AddParameter("json_input",
                    "{ fieldtype : \"name\", value : \"joe\"}");
  • 当您将
    RequestFormat
    设置为
    DataFormat.Json
    时,默认情况下使用的序列化程序是
    JsonSerializer
  • 内容类型标题设置为“application/json”
  • new{…}
    将被序列化为一个json字符串,并且
    AddBody()
    调用被转换为对
    AddParameter()
    的调用,使用参数名“application/json”、参数值json字符串和参数类型
    ParameterType.RequestBody
使用Fiddler2您可以看到由您的代码生成的帖子:

如图所示,请求主体是
{“fieldtype”:“name”,“value”:“joe”}
,如果服务器需要表单字段fieldtype和value,这可能会起作用;但是需要像这样的请求主体
json\u input={“fieldtype”:“name”,“value”:“joe”}
(为清晰起见,进行了解码)。在下一幅图中,您可以看到使用HTML的帖子:

另外,添加的参数类型为
ParameterType.RequestBody
,因此仅使用使用
AddBody()
函数添加的第一个主体,其余主体将被丢弃

您可以通过创建一个名为“json\U input”的
参数
并将其传递给函数
AddParameter()
,来解决此问题:

var client=new RestClient{BaseUrl=new Uri(“http://myhost.com:22333") };
var request=new RestRequest{Resource=“/site/api”,RequestFormat=DataFormat.Json};
var param=新参数
{
Type=参数Type.GetOrPost,
Name=“json\u输入”,
值=新
{
fieldtype=“name”,
value=“乔”
}
};
request.AddParameter(param);
client.Authenticator=new NtlmAuthenticator();
var响应=client.Post(请求);
if(response.StatusCode==System.Net.HttpStatusCode.Created)
{
var反序列化器=新的JsonDeserializer();
var jsonDto=反序列化程序。反序列化(响应);
}
使用
ParameterType.GetOrPost
可以添加任意数量的参数(表单字段)

正如您在我的代码中所看到的,我添加了一个
if
语句来检查响应中返回的HTTP
StatusCode
,因为通常httppost会返回一个201创建的代码

您可以添加
else
语句来检查属性
response.ErrorException
response.ErrorMessage
,以查看问题所在


也许,由于帖子的格式不正确,服务器会将您重定向到同一页面重试。

当您在测试工具中发布带有数据的
表单时,
url
是什么?如果您可以共享url和示例json,我们将能够提供帮助。请确保API方法是POST(而不是GET或其他)请检查/api之外是否需要其他路径,例如站点/api/customers@GuruprasadRao-这似乎与我当前的问题代码做了相同的事情
//Model for the data you are sending
public class TestModel
{
    public string Name { get; set; }
}

//define client, request and model
var client = new RestClient {BaseUrl = new Uri("http://myhost.com:22333") };        
var request = new RestRequest { Method = Method.POST, Resource = "/site/api", RequestFormat = DataFormat.Json };
var testModel = new TestModel() { Name = "joe" };

//serialize model as json and add it to the request
var json = request.JsonSerializer.Serialize(testModel);
request.AddParameter("application/json; charset=utf-8", json, ParameterType.RequestBody);

//execute request
IRestResponse response = client.Execute(request);
var client = new RestClient { BaseUrl = new Uri("http://myhost.com:22333") };

var request = new RestRequest { Resource = "/site/api", RequestFormat = DataFormat.Json };

var param = new Parameter
{
    Type = ParameterType.GetOrPost,
    Name = "json_input",
    Value = new
    {
        fieldtype = "name",
        value = "joe"
    }
};

request.AddParameter(param);

client.Authenticator = new NtlmAuthenticator();

var response = client.Post(request);            

if (response.StatusCode == System.Net.HttpStatusCode.Created)
{
    var deserializer = new JsonDeserializer();
    var jsonDto = deserializer.Deserialize<ResultObj>(response);
}