Как установить тело запроса на стороне клиента - PullRequest
0 голосов
/ 29 февраля 2012

Предположим, у меня есть следующий веб-метод с использованием C # и .NET:

[WebInvoke(UriTemplage="/users", Method="POST")]
[OperationContract]
public User AddNewUser(User u);

Ожидается, что при реализации веб-метода POST вы примете тело запроса как часть входящего сообщения HTTP-запроса. Ожидается, что параметр u будет десериализован из тела входящего HTTP-сообщения.

Мой вопрос: как нам установить это тело запроса на стороне клиента? Это должно быть где-то установлено. Это действительно смущает меня.

Кроме того, если я добавил "ResponseFormat = WebMessageFormat.Json" в WebInvoke, как я могу десериализовать возвращенную строку json в объект User?

Спасибо.

Ответы [ 2 ]

1 голос
/ 29 февраля 2012

Ваш вопрос не показывает, что вы пытались.Если вы используете .net на клиенте, вы можете использовать DataContractSerializer для получения сериализованных данных.

Затем можно использовать HttpWebRequest с методом, установленным на POST .Добавьте сериализованные данные в веб-запрос и используйте метод GetResponse ().

В качестве альтернативы вы можете использовать Fiddlr для тестирования вашего веб-сервиса с использованием созданных вами запросов.Это дает вам краткое представление о том, что происходит на сервере.

0 голосов
/ 29 февраля 2012

Чтобы выполнить запрос POST к методу отдыха WCF:

    private string UseHttpWebApproach<T>(string serviceUrl, string resourceUrl, string method, T requestBody)
    {
            string responseMessage = null;                
            var request = WebRequest.Create(string.Concat(serviceUrl, resourceUrl)) as HttpWebRequest;
            if (request != null)
            {
                request.ContentType = "application/json";
                request.Method = method;
            }

            if(method == "POST" && requestBody != null)
            {                   
                byte[] requestBodyBytes = ToByteArrayUsingJsonContractSer(requestBody);                
                request.ContentLength = requestBodyBytes.Length;
                using (Stream postStream = request.GetRequestStream())
                    postStream.Write(requestBodyBytes, 0, requestBodyBytes.Length);
            }

            if (request != null)
            {
                var response = request.GetResponse() as HttpWebResponse;
                if(response.StatusCode == HttpStatusCode.OK)
                {
                    Stream responseStream = response.GetResponseStream();
                    if (responseStream != null)
                    {
                        var reader = new StreamReader(responseStream);

                        responseMessage = reader.ReadToEnd();
                    }
                }
                else
                {
                    responseMessage = response.StatusDescription;
                }
            }
            return responseMessage;
    }

    private static byte[] ToByteArrayUsingJsonContractSer<T> (T requestBody)
    {
        byte[] bytes = null;
        var serializer1 = new DataContractJsonSerializer(typeof(T));
        var ms1 = new MemoryStream();
        serializer1.WriteObject(ms1, requestBody);
        ms1.Position = 0;
        var reader = new StreamReader(ms1);
        bytes = ms1.ToArray();
        return bytes;
    }

Теперь предположим, что ваш пользовательский объект, как показано ниже:

Public Class User
{
    Public int UserId  {get;set;}
    Public string UserName {get;set;}
    Public string Password  {get;set;}
}

Чтобы вызвать вышеуказанный метод, я делаю:

User objUser = new objUser();
objUser.Username = "Test";
objUser.Password = "Test";
UseHttpWebApproach<User>(serviceBaseUrl, "users", "POST", objUser);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...