Как читать JSON данные из приложения Android в C# Служба отдыха - PullRequest
0 голосов
/ 25 апреля 2020

Я довольно новичок в разработке android и работе со службами REST, чтобы разрешить связь между приложениями и базами данных на моем сервере.

Я работал над приложением, которое извлекает информацию, относящуюся к зарегистрированным заявкам в нашей системе. Мое приложение android может успешно использовать службу REST для получения данных из моей базы данных, однако мне очень трудно заставить мою службу REST принимать данные в формате JSON из моего приложения для обновления существующего билета или создания новый.

Моя служба REST написана на C#

Ниже приведен пример моего запроса GET, который отлично работает, потому что есть несколько параметров и они не соответствуют длине, принятой URL:

    [OperationContract]
    [WebInvoke(Method = "GET",
        ResponseFormat = WebMessageFormat.Json,
        BodyStyle = WebMessageBodyStyle.Bare,
        UriTemplate = "incidentAgent/{agent}/{incID}")] //PASS A 0 incID IF SELECTING ALL
    Stream AgentIncidentListing(string agent, string incID);

Это мой android код приложения для генерации строки JSON и отправки запроса POST в мой веб-сервис:

public void updateIncidents(View v){
    Thread thread = new Thread(new Runnable() {
        @Override
        public void run() {
            try {

                //Declare and initialize text views from the layout
                TextView tvidIncidents = (TextView) findViewById(R.id.tvIncidentID);
                TextView tvResolution = (TextView)findViewById(R.id.tvResolution );
                TextView tvJobCardNo = (TextView)findViewById(R.id.tvJobCardNo );
                TextView tvActualHours = (TextView)findViewById(R.id.tvActualHours );
                TextView tvBudgetHours = (TextView)findViewById(R.id.tvBudgetHours );
                TextView tvTaskDesc = (TextView)findViewById(R.id.tvTaskDesc );
                TextView tvOutline = (TextView)findViewById(R.id.tvOutline );
                TextView tvProject = (TextView)findViewById(R.id.tvProject );
                TextView tvIncidentType = (TextView)findViewById(R.id.tvIncidentType );
                TextView tvStatus = (TextView)findViewById(R.id.tvStatus );
                TextView tvCustomer = (TextView)findViewById(R.id.tvCustomer );
                TextView tvIncidentNumber = (TextView)findViewById(R.id.tvIncidentNumber );
                TextView tvDueBy = (TextView)findViewById(R.id.tvDueDate);

                URL url = new URL(updateURI);
                HttpURLConnection conn = (HttpURLConnection) url.openConnection();
                conn.setRequestMethod("POST");
                conn.setRequestProperty("Content-Type", "application/json;charset=UTF-8");
                conn.setRequestProperty("Accept","application/json");
                conn.setDoOutput(true);
                conn.setDoInput(true);

                JSONObject jsonParam = new JSONObject();
                jsonParam.put("iIncidentStatusID", tvStatus.getText());
                jsonParam.put("iDebtorID", tvCustomer.getText());
                jsonParam.put("cOutline", tvOutline.getText());
                jsonParam.put("iIncidentTypeID", tvIncidentType.getText());
                jsonParam.put("iProjectID", tvProject.getText());
                jsonParam.put("ufINCBHours", tvBudgetHours.getText());
                jsonParam.put("ufINCAH", tvActualHours.getText());
                jsonParam.put("ucINCJN", tvJobCardNo.getText());
                jsonParam.put("ucINCTaskDescription", tvTaskDesc.getText());
                jsonParam.put("ucINCResolution", tvResolution.getText());
                jsonParam.put("dDueBy", tvDueBy.getText());
                jsonParam.put("idIncidents", tvidIncidents.getText());
                Log.i("JSON", jsonParam.toString());
                DataOutputStream os = new DataOutputStream(conn.getOutputStream());
                //os.writeBytes(URLEncoder.encode(jsonParam.toString(), "UTF-8"));
                os.writeBytes(jsonParam.toString());

                os.flush();
                os.close();

                Log.i("STATUS", String.valueOf(conn.getResponseCode()));
                Log.i("MSG" , conn.getResponseMessage());

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

    thread.start();
}

Проблема, которую я ' у меня есть абсолютно никакого понятия о том, как обрабатывать этот запрос POST на моем REST-сервисе. это то, что у меня есть до сих пор:

        [OperationContract]
    [WebInvoke(Method = "POST",
     ResponseFormat = WebMessageFormat.Json,
     RequestFormat = WebMessageFormat.Json,
     BodyStyle = WebMessageBodyStyle.Bare,

     UriTemplate = "updateIncData")]

    void UpdateJsonIncident(RequestData rData);

Класс RequestData:

 public class RequestData
{
    [DataMember]
    public string details { get; set; }
}

Я хочу иметь возможность читать строку JSON, возвращаемую моим android app и назначьте соответствующие значения моему оператору вставки или обновления в функции UpdateJsonIncident (), чтобы соответствующим образом повлиять на мою базу данных.

Я пробовал много вещей, но не могу заставить это работать. После того, как я сижу за моим столом 2-й день (в настоящее время 11 часов подряд), я чувствую, что просьба о помощи здесь - мое последнее средство и надеюсь, что кто-то может помочь мне.

1 Ответ

0 голосов
/ 26 апреля 2020

Итак, наконец-то сделали прорыв. Оказалось, что все, что мне нужно было сделать, это следующее:

1) Я создал класс с именем "IncidentData" примерно так:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.Web;

namespace xxxxx.Classes
{
    [DataContract]

    public class IncidentData
    {
        [DataMember]
        public string idIncidents { get; set; }
        [DataMember]
        public string IncidentStatus { get; set; }
        [DataMember]
        public string Name { get; set; }
        [DataMember]
        public string cOurRef { get; set; }
        [DataMember]
        public string cOutline { get; set; }
        [DataMember]
        public string IncidentType { get; set; }
        [DataMember]
        public string Project { get; set; }
        [DataMember]
        public string BudgetedHours { get; set; }
        [DataMember]
        public string ActualHours { get; set; }
        [DataMember]
        public string JobCardNumber { get; set; }
        [DataMember]
        public string TaskDescription { get; set; }
        [DataMember]
        public string Resolution { get; set; }
        [DataMember]
        public string dDueBy { get; set; }
    }
}

2) Изменил свой контракт на операции следующим образом:

    [OperationContract]
    [WebInvoke(Method = "POST",
     ResponseFormat = WebMessageFormat.Json,
     RequestFormat = WebMessageFormat.Json,
     BodyStyle = WebMessageBodyStyle.Bare,
     UriTemplate = "/UpdateJsonIncident")]

    bool UpdateJsonIncident(IncidentData incident);

3) Теперь все, что мне нужно сделать, чтобы получить доступ к моим данным в функции UpdateJsonIncident, выглядит следующим образом:

        public bool UpdateJsonIncident(IncidentData incident) {

         string xxx = incident.cOutline // etc...
    }

Надеюсь, это поможет сэкономить кому-то еще много времени, если они сталкиваются с той же проблемой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...