使用HTTP POST在Android中使用ASP.NET WebApi HTTP服务

使用HTTP POST在Android中使用ASP.NET WebApi HTTP服务,android,asp.net,asp.net-web-api,Android,Asp.net,Asp.net Web Api,我已经用HTTPPOST实现了ASP.NETWebAPI并在Android应用程序中使用。无参数的方法可以完美地调用,但带有参数的方法不能正常工作,而Google Chrome中的高级Rest客户端也可以很好地使用HTTP GET Android中的呼叫方代码: String url = "http://192.168.15.3/api/user" HttpPost postMethod = new HttpPost(url); postMethod.setHeader("Conte

我已经用HTTPPOST实现了ASP.NETWebAPI并在Android应用程序中使用。无参数的方法可以完美地调用,但带有参数的方法不能正常工作,而Google Chrome中的高级Rest客户端也可以很好地使用HTTP GET

Android中的呼叫方代码:

String url = "http://192.168.15.3/api/user"    

HttpPost postMethod = new HttpPost(url);

postMethod.setHeader("Content-Type", "application/json; charset=utf-8");
postMethod.setHeader("Accept", "*/*");
postMethod.setHeader("Accept-Encoding", "gzip, deflate");
postMethod.setHeader("Accept-Language", "en-US,en;q=0.8");

List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
nameValuePairs.add(new BasicNameValuePair("id", "1"));

DefaultHttpClient hc = new DefaultHttpClient();         
HttpResponse response;
postMethod.setEntity(new UrlEncodedFormEntity(nameValuePairs, "UTF-8"));
response = hc.execute(postMethod);
HttpEntity entity = response.getEntity();               
InputStream inStream = entity.getContent();
String result = convertStreamToString(inStream);
Log.e("Result: ", result);              
stringurl=”http://192.168.15.3/api/user"    
HttpPost postMethod=新的HttpPost(url);
setHeader(“内容类型”,“应用程序/json;字符集=utf-8”);
postMethod.setHeader(“接受”,“*/*”);
setHeader(“接受编码”、“gzip、deflate”);
setHeader(“接受语言”,“en-US,en;q=0.8”);
List nameValuePairs=新的ArrayList();
添加(新的BasicNameValuePair(“id”,“1”));
DefaultHttpClient hc=新的DefaultHttpClient();
HttpResponse响应;
setEntity(新的UrlEncodedFormEntity(nameValuePairs,“UTF-8”);
响应=hc.execute(postMethod);
HttpEntity=response.getEntity();
InputStream inStream=entity.getContent();
字符串结果=convertStreamToString(流内);
Log.e(“结果:”,结果);
控制器:

public class UserController : ApiController
{
    UserCredentials[] users = new UserCredentials[] 
    { 
        new UserCredentials { User_ID = "1", User_Name = "testuser", Password = "test", First_Name = "Test", Last_Name = "User",
                              Email = "testuser@dummy.com", Phone ="123456789", Mobile = "123456789", User_Type = "user" }, 
        new UserCredentials { User_ID = "2", User_Name = "testuser2", Password = "test", First_Name = "Test", Last_Name = "User",
                              Email = "testuser2@dummy.com", Phone ="123456789", Mobile = "123456789", User_Type = "user" }
    };

    [AcceptVerbs("POST")]
    public IEnumerable<UserCredentials> GetAllUsers()
    {
        return users;
    }

    [AcceptVerbs("POST")]
    public IHttpActionResult GetUser(string id)
    {
        var user = users.FirstOrDefault((p) => p.User_ID.Equals(id));
        if (user == null)
        {
            return NotFound();
        }
        return Ok(user);
    }
}
公共类用户控制器:ApiController
{
UserCredentials[]用户=新的UserCredentials[]
{ 
新用户凭证{User\u ID=“1”、User\u Name=“testuser”、Password=“test”、First\u Name=“test”、Last\u Name=“User”,
电子邮件=”testuser@dummy.com,Phone=“123456789”,Mobile=“123456789”,User\u Type=“User”},
新用户凭证{User\u ID=“2”、User\u Name=“testuser2”、Password=“test”、First\u Name=“test”、Last\u Name=“User”,
电子邮件=”testuser2@dummy.com,Phone=“123456789”,Mobile=“123456789”,User\u Type=“User”}
};
[接受动词(“POST”)]
公共IEnumerable GetAllUsers()
{
返回用户;
}
[接受动词(“POST”)]
公共IHttpActionResult GetUser(字符串id)
{
var user=users.FirstOrDefault((p)=>p.user_ID.Equals(ID));
if(user==null)
{
返回NotFound();
}
返回Ok(用户);
}
}
错误:
{“Message”:“未找到与请求URI“”匹配的HTTP资源。”,“MessageDetail”:“未在与请求匹配的控制器“用户”上找到任何操作。”}

它正在引发错误,因为您的控制器没有任何匹配的httppost方法。您正试图将数据发布到接受GET请求的方法

WebApi使用基于约定的方法名称。您的方法以“Get”开头,因此它将以以下方式映射请求:

获取所有用户-获取-/api/users 按Id获取用户-Get-/api/users/Id


因此,您可以使用HttpGet请求而不是POST调用它们

您能发布完整的webapi控制器代码吗?@MukeshModhvadiya补充道。我还通过添加[AcceptVerbs(“POST”)]和方法来检查,它在GoogleChrome的高级Rest客户端和POST请求中工作良好。[AcceptVerbs(“POST”)]公共IHttpActionResult GetUser(字符串id){var user=users.FirstOrDefault((p)=>p.user_id.Equals(id));如果(user==null){return NotFound();}返回Ok(user);}它可能不起作用。若您调用post方法并将参数作为查询字符串传递,那个么它可能会起作用。但这根本不合适。我一点也不明白你为什么要发表这样一篇根本不需要的文章。