Первый раз создаю службу REST, вызываю с Android

#java #c# #android #asp.net #rest

#java #c# #Android #asp.net #rest

Вопрос:

Недавно я начал изучать программирование на Android и как создать веб-службу restful. Я сделал простую игру yahtzee для Android и, чтобы расширить свои знания на обеих платформах, я хотел реализовать систему с двумя игроками, используя restful service.

Я создал службу в asp.net MVC с приведенным ниже кодом, который возвращает запрос get на url/games/2:

 <Game>
   <Id>2</Id>
   <p1>100</p1>
    <p2>99</p2>
    <turn>1</turn>
</Game>
 

Все, что я хочу сделать, это иметь возможность создать новую игру, вызвав Post, а затем использовать Get, чтобы проверить, наступила ли ваша очередь, а затем, когда вы закончите свой ход, используя Put для обновления игры, изменения вашего счета и хода, чтобы другие игроки получили запрос, сообщив своему клиенту, что этоих очередь. Я знаю, что это очень просто для функциональности 2 плеера, но это именно то, что я пытаюсь сделать, изучая этот процесс. У меня есть игровой объект в Android, но я не уверен, как поступить. Направление, над которым я работаю в данный момент, — HttpClient, а post выглядит примерно так:

 HttpPost httpPost = new HttpPost("url/games")
 

Но я не вижу, как передать параметр. Мой метод Post в моем сервисе принимает игровой объект в качестве параметра. Если бы кто-нибудь мог дать мне какой-нибудь совет, я был бы вам очень признателен.

Модель, Игра.cs:

 namespace YahtzTest.Models
{
    public class Game
    {
        public int Id { get; set; }
        public int turn { get; set; }
        public int p1 { get; set; }
        public int p2 { get; set; }
    }
}
 

Контроллер, GamesController.cs:

     namespace YahtzTest.Controllers
{
    public class GamesController : ApiController
    {
        static readonly IGameRepository repository = new GameRepository();

        public IEnumerable<Game> GetAllGames()
        {
            return repository.GetAll();
        }

        public Game GetGame(int id)
        {
            Game item = repository.Get(id);
            if (item == null)
            {
                throw new HttpResponseException(HttpStatusCode.NotFound);
            }
            return item;
        }

        public HttpResponseMessage PostGame(Game item)
        {
            item = repository.Add(item);
            var response = Request.CreateResponse<Game>(HttpStatusCode.Created, item);

            string uri = Url.Link("DefaultApi", new { id = item.Id });
            response.Headers.Location = new Uri(uri);
            return response;
        }

        public void PutGame(int id, Game game)
        {
            game.Id = id;
            if (!repository.Update(game))
            {
                throw new HttpResponseException(HttpStatusCode.NotFound);
            }
        }

        public void DeleteGame(int id)
        {
            Game item = repository.Get(id);
            if (item == null)
            {
                throw new HttpResponseException(HttpStatusCode.NotFound);
            }

            repository.Remove(id);
        }

    }
}
 

И еще пару файлов, которые я включил в учебное пособие для хранения моих игр, GameRepository.cs и IGameRepository.cs:

     namespace YahtzTest.Models
{
    interface IGameRepository
    {
        IEnumerable<Game> GetAll();
        Game Get(int id);
        Game Add(Game item);
        void Remove(int id);
        bool Update(Game item);
    }
}


    namespace YahtzTest.Models
{
    public class GameRepository : IGameRepository
    {
        private List<Game> games = new List<Game>();
        private int _nextId = 1;

        public GameRepository()
        {
            Add(new Game { turn = 0, p1 = 0, p2 = 0 });
            Add(new Game { turn = 1, p1 = 100, p2 = 99 });
            Add(new Game { turn = 0, p1 = 45, p2 = 75 });
        }



        public IEnumerable<Game> GetAll()
        {
            return games;
        }

        public Game Get(int id)
        {
            return games.Find(p => p.Id == id);
        }

        public Game Add(Game item)
        {
            if (item == null)
            {
                throw new ArgumentNullException("item");
            }
            item.Id = _nextId  ;
            games.Add(item);
            return item;
        }

        public void Remove(int id)
        {
            games.RemoveAll(p => p.Id == id);
        }

        public bool Update(Game item)
        {
            if (item == null)
            {
                throw new ArgumentNullException("item");
            }
            int index = games.FindIndex(p => p.Id == item.Id);
            if (index == -1)
            {
                return false;
            }
            games.RemoveAt(index);
            games.Add(item);
            return true;
        }
    }
}
 

Ответ №1:

По сути, вы пишете строку в POST. И на стороне вашего сервера, когда onPostReceived вам нужно воссоздать свой объект из строки. Я не знаю, как вы хотите отправить свои данные (Content-Type), посмотрите один

Если вы хотите опубликовать объект на своем сервере, вы можете сделать это следующим образом: (пример JSON)

         HttpClient httpClient = HttpHelper.getHttpClient();
        HttpPost httppost = new HttpPost("yourServerAddress");
        httppost.setHeader("Accept", "application/json; charset=utf-8");
        httppost.setHeader("Content-type", "application/json; charset=utf-8");

        // StringEntity
        String inStr = yourObject.toString();
        StringEntity se = new StringEntity(inStr, HTTP.UTF_8);

        // Params
        HttpParams params = new BasicHttpParams();
        params.setParameter(CoreProtocolPNames.HTTP_ELEMENT_CHARSET, HTTP.UTF_8);
        httppost.setParams(params);         
        httppost.setEntity(se);

        // Fire and read response
        HttpResponse response = httpclient.execute(httppost);

        // read answer
        String content = null;
        InputStream stream = null;
        try {
            if (response != null) {
                stream = response.getEntity().getContent();
                InputStreamReader reader = new InputStreamReader(stream, HTTP.UTF_8);
                BufferedReader buffer = new BufferedReader(reader);
                StringBuilder sb = new StringBuilder();
                String cur;
                while ((cur = buffer.readLine()) != null) {
                    sb.append(cur);
                }
                //here's your whole response from your server if you provide any
                content = sb.toString();
            }
        } finally {
            if (stream != null) {
                stream.close();
            }
        }           

    } catch (Exception e) {
        e.printStackTrace();
    }