2015-09-07 69 views
2

我有这个问题发送HTTP POST来点网的WebAPI

正与获取

我想送一个HTTP POST

这里是我的机器人类,并请求方法

public static String readUrl(String url, ArrayList<NameValuePair> params) { 
    try { 
     HttpClient client = new DefaultHttpClient(); 
     HttpPost method = new HttpPost(url); 

     if (params != null) { 
      method.setEntity(new UrlEncodedFormEntity(params)); 

     } 

     HttpResponse response = client.execute(method); 

     InputStream inputStream = response.getEntity().getContent(); 
     String result = convertInputStreamToString(inputStream); 

     return result; 
    } 
    catch (ClientProtocolException e) { 
     e.printStackTrace(); 
    } 
    catch (IOException e) { 
     e.printStackTrace(); 
    } 

    return null; 
} 

和第是为请求码

       ArrayList<NameValuePair> params = new ArrayList<NameValuePair>(); 
           params.add(new BasicNameValuePair("region","1")); 
           params.add(new BasicNameValuePair("area","1")); 
           params.add(new BasicNameValuePair("sector","1")); 
           params.add(new BasicNameValuePair("address",edtReqAddres.getText().toString())); 
           params.add(new BasicNameValuePair("mobile",edtMobileNumber.getText().toString())); 

           params.add(new BasicNameValuePair("username","test")); 
           params.add(new BasicNameValuePair("message", edtSubject.getText().toString())); 
           params.add(new BasicNameValuePair("compid","0")); 
           params.add(new BasicNameValuePair("geo","1")); 


           text = webservice.readUrl("http://192.168.1.102:81/api/products", params); 

而且这是我的结果 :(

{ “消息”: “没有HTTP资源发现,请求URI 'http://192.168.1.102:81/api/products' 相匹配。”}

这是我的WebAPI(DOTNET的)

[System.Web.Http.AcceptVerbs("GET", "POST")] 
    public string GetProductById(int region, int area, int sector, string address, string mobile, string username, string message, int compid, string geo) 
    { 
     fddService.mobService service=new mobService(); 
     return service.NewMessage(region, area, sector, address, mobile, "", message, compid, ""); 
    } 
+0

尚未配置您的服务器来处理'/ API/products'请求。 – Breavyn

+0

嗯我是新的web api你是什么意思@ColinGillespie请解释更多 –

+0

我可以通过获取@ColinGillespie –

回答

0

找到更多的信息,所以最后我到了答案 在客户端你应该这一行添加到您的代码来设置defult内容类型

httpPost.addHeader("Content-type", "application/x-www-form-urlencoded"); 

后端服务器(的WebAPI)应该创建一个模型视图发送PARAMS和也在增加[FromBody]输入begining PARAMS这样

public string postreq([FromBody] RequestViewModel model) 
{ 
    fddService.mobService service = new mobService(); 
    if (model.geo == "1") 
     return service.NewMessage(Convert.ToInt32(model.region), Convert.ToInt32(model.area), 
      Convert.ToInt32(model.sector), model.address, model.mobile, "", model.message, Convert.ToInt32(model.compid), ""); 
    else 
     return service.NewMessage(Convert.ToInt32(model.region), Convert.ToInt32(model.area), 
      Convert.ToInt32(model.sector), model.address, model.mobile, "", model.message, Convert.ToInt32(model.compid), model.geo); 
} 
public class RequestViewModel 
{ 
    public string region { get; set; } 
    public string area { get; set; } 
    public string sector { get; set; } 
    public string address { get; set; } 
    public string mobile { get; set; } 
    public string username { get; set; } 
    public string message { get; set; } 
    public string compid { get; set; } 
    public string geo { get; set; } 
} 

,如果你有这个{"Message":"An error has occurred."}

请确认您的Android客户端正确地将您的参数传递给正确的POST代码。

感谢:地球行星 POST data from Android to Web API returns 404

2

如果您在Visual Studio中使用ASP.NET的WebAPI,你可以添加一个新的Web API控制器类(V2.1),那么你将有以下默认代码:

public class ProductsController : ApiController 
    { 
     // GET api/<controller> 
     public IEnumerable<string> Get() 
     { 
      return new string[] { "value1", "value2" }; 
     } 

    // GET api/<controller>/5 
    public string Get(int id) 
    { 
     return "value"; 
    } 

    // POST api/<controller> 
    public void Post([FromBody]string value) 
    { 
    } 

    // PUT api/<controller>/5 
    public void Put(int id, [FromBody]string value) 
    { 
    } 

    // DELETE api/<controller>/5 
    public void Delete(int id) 
    { 
    } 
} 

然后,让我们假设你有一个DTO类如产品,你可以定制你的Web API,如下所示:

 // POST: api/Products 
     [ResponseType(typeof(Product))] 
     public async Task<IHttpActionResult> PostProduct(Product product) 
     { 
      if (!ModelState.IsValid) 
      { 
       return BadRequest(ModelState); 
      } 

      db.Products.Add(product); 
      await db.SaveChangesAsync(); 

      return CreatedAtRoute("DefaultApi", new { id = product.Id }, product); 
     } 

您将在Learn About ASP.NET Web API

+0

这是完美@BNK非常感谢 –

+0

但你知道我想让我的方法只接受发布请求@BNK [FromBody]足够了吗? –

+0

'Post'已经是POST了,FromBody只是POST的一个主体:) – BNK