2016-02-09 1 views
2

Я использую службу отдыха, чтобы получить некоторые данные json. В качестве тестового жгута они дали мне URL-адрес, и если я перейду к URL-адресу в браузере, у меня есть форма, и я могу поместить некоторый json в текстовое поле, а затем отправить форму и вернуть результат json на перезагрузку страницы ,Использование C# Restsharp, как я могу реплицировать сообщение формы?

Я сейчас пытаюсь повторить это программно с помощью RestSharp в C#, но я бегу на вопрос, где результаты от вызова 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); 

, если я смотрю на response.Content в отладчике (перед любым десериализации) я вижу HTML строку веб-страницы, что я пошел с формой, чтобы опубликовать (что-то вроде это)

<html> 
<body> 
<form method='POST'> 
<table> 
<tr> 
<td>Enter the JSON:</td> 
<td> 
<textarea name="json_input" cols="80" rows="30"> 
</textarea> 
</td> 
</tr> 
<tr><td colspan='2'><input type='Submit' value='submit'></td></tr> 
</table> 
</form> 
</body> 
</html> 

Может кто-то посоветовать, что я здесь отсутствует, как я ожидал, чтобы получить тот же результат JSon назад в response.Content, что я вижу после отправки формы в браузере

+0

Что такое 'url', когда вы публикуете' form' с данными в тестовом жгуте? –

+0

Если вы можете поделиться URL-адресом и образцом json, мы сможем помочь. –

+0

Пожалуйста, убедитесь, что API-метод POST (не GET или что-то еще) – Thakur

ответ

3

form имеет текстовое поле с именем json_input, которое будет использоваться в качестве параметра запроса.

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

И ваш метод AddBody указывается вы отправляете запрос с fieldtype и value параметров.

Попробуйте заменить метод AddBody следующим:

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

//OR 

request.AddParameter("json_input", 
        "{ fieldtype : \"name\", value : \"joe\"}"); 
-1

Попробуйте это:

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); 
+0

это похоже на то, что мой текущий код в вопросе – leora

+0

Во-первых, я бы удостоверился, что api работает с помощью Postman. – JohnWrensby

0

Убедитесь, чтобы создать модель, основанную на том, что ожидает, что метод контроллера 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); 

Убедитесь, что вы отправляете правильный URI для API.

Продолжайте проверять полученный HTML-код и посмотреть, не дает ли он вам никаких ошибок.

Надеюсь, это поможет.

1

Как видно из HTML кода , то URL действия формы будет ждать следующих полей формы:

  • json_input

И в вашем коде вы звоните request.AddBody(new { ... }), что делает следующее:

  • Как вы установили RequestFormat в DataFormat.Json, сериализатор, который будет использоваться по умолчанию, - JsonSerializer.
  • Контент-тип заголовок настроен на «application/json».
  • new { ... } будет сериализовать в строку JSON и AddBody() вызов преобразуется в вызов, чтобы AddParameter() с использованием в качестве параметра имени «приложения/JSON», в качестве параметра значение JSON строку, и в качестве параметра типаParameterType.RequestBody.

Использование Fiddler2 вы можете увидеть POST сделал код:

code fiddler

Как показано на рисунке, тело запроса {"fieldtype":"name", "value":"joe"}, это может работает, если сервер ожидает поля формы fieldtype и значение; но ожидает тело запроса, подобное этому json_input={ "fieldtype": "name", "value": "joe" } (декодировано для большей ясности). На следующем рисунке вы можете увидеть POST используя HTML:

html fiddler

Кроме того, тип добавленного параметра является ParameterType.RequestBody, поэтому только первое тело, добавленные с помощью AddBody() функция используется, остальное отбрасывается.

Вы можете решить эту проблему путем создания Parameter под названием «json_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 = 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); 
} 

Использование ParameterType.GetOrPost позволяет добавлять столько параметров (поля формы), как вы хотите.

Как вы можете увидеть в моем коде, я добавил if заявления проверки для HTTPStatusCode возвращенного в ответ, потому что обычно HTTP POST возвращает код 201 Созданы.

Вы можете добавить заявление else, чтобы проверить свойства response.ErrorException и response.ErrorMessage, чтобы узнать, в чем проблема.

Возможно, поскольку POST не очень хорошо сформирован, сервер перенаправляет вас на ту же страницу, чтобы повторить попытку.