Параметры ApiController HttpPost

#asp.net #post #model-view-controller

#asp.net #Публикация #модель-представление-контроллер

Вопрос:

Передача HttpPost с параметрами завершается ошибкой в apiconroller.

Он пытается установить связь с Android на веб-сервер. Мне удалось установить связь с Get и Post, у которых не было параметров. Однако, если параметр добавлен при передаче Post, он завершается с ошибкой. Я, конечно, думаю, что проблема в коде веб-сервера. Руководство содержит только информацию о модели. Я хочу обменять строки.

Global.asax.cs

 protected void Application_Start()
        {
            GlobalConfiguration.Configure(WebApiConfig.Register);
            //....
        }

  

WebApiConfig.cs

 public class WebApiConfig
    {
        public const string UrlPrefix = "api";
        public const string UrlPrefixRelative = "~/"   UrlPrefix;

        public static void Register(HttpConfiguration config)
        {
            // Web API configuration and services
            var httpControllerRouteHandler = typeof(HttpControllerRouteHandler).GetField("_instance",
                System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.NonPublic);
            if (httpControllerRouteHandler != null)
            {
                httpControllerRouteHandler.SetValue(null,
                    new Lazy<HttpControllerRouteHandler>(() => new SessionHttpControllerRouteHandler(), true));
            }

            // Web API routes
            config.MapHttpAttributeRoutes();
            config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: UrlPrefix   "/{controller}/{action}/{sn}",
                defaults: new { action = "Index", sn = RouteParameter.Optional }
            );
        }
        public class SessionControllerHandler : HttpControllerHandler, IRequiresSessionState
        {
            public SessionControllerHandler(RouteData routeData) : base(routeData) { }
        }
        public class SessionHttpControllerRouteHandler : HttpControllerRouteHandler
        {
            protected override IHttpHandler GetHttpHandler(RequestContext requestContext)
                => new SessionControllerHandler(requestContext.RouteData);
        }
    }
  

ApiController.cs

 

public class LicenseController : ApiController
    {
        [HttpPost]
        public HttpResponseMessage GetLicense([FromBody]string data)
        {
            return Request.CreateResponse(HttpStatusCode.OK, data);
        }

        [HttpGet]
        public HttpResponseMessage GetLicense2(string data)
        {
            string udid = data;
            string license = AES.Encrypt(udid);
            return Request.CreateResponse(HttpStatusCode.OK, license);
        }

        [HttpPost]
        public HttpResponseMessage GetLicense3()
        {
            return Request.CreateResponse(HttpStatusCode.OK, "ABC");
        }


    }

  

код Android

 new Thread(new Runnable() {
                    @Override
                    public void run() {
                        try{
                        // Defined URL  where to send data
                            URL url = new URL("http://192.1.1.1:80/api/License/GetLicense/");

                            // Send POST data request

                            URLConnection conn = url.openConnection();
                            conn.setDoOutput(true);
                            OutputStreamWriter wr = new OutputStreamWriter(conn.getOutputStream());
                            //wr.write(URLEncoder.encode("data=3434", "UTF-8") );
                            wr.write("data=3434");
                            wr.flush();

                            // Get the server response

                            BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));
                            StringBuilder sb = new StringBuilder();
                            String line = null;

                            // Read Server Response
                            while((line = reader.readLine()) != null)
                            {
                                // Append server response in string
                                sb.append(line   "n");
                            }
                        }
                        catch(Exception ex)
                        {

                        }
                    }
                }).start();
  

Комментарии:

1. Попробуйте wr.write("=3434"); вместо wr.write("data=3434"); просто отправить данные post, перед которыми стоит знак равенства (=)

2. попробовал и преуспел wr.write ("=data=3434") и Public HttpResponseMessage GetLicense([FromBody]string data, string data2); что мне делать? wr.write («=data=343434amp;data2=3232″)»; сбой.

Ответ №1:

Для метода POST веб-api, принимающего один строковый параметр, вы можете сделать:

 [HttpPost]
 public HttpResponseMessage GetLicense([FromBody]string data)
  

А затем отправьте данные от клиента, например:
wr.write("=3434");

Для нескольких параметров post создайте класс модели в Web API:

 public class DataModel {
  public string data1 {get;set;}
  public string data2 {get;set;}
}
  

Обновить тип параметра конечной точки api:

 [HttpPost]
public HttpResponseMessage GetLicense([FromBody]DataModel dataModel)
  

Затем отправьте строку json от клиента с типом содержимого: «application / json»

 {
 "data1": "Data1 contents", 
 "data2":  "Data2 contents"
}
  

Комментарии:

1. Можете ли вы сказать мне, как доставить это на Android?