#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?