Android调用WebAPI之传参、文件

Android 客户端调用后台,以前用过 ksoap2 调用 wcf 。

最近把后台改成 WebAPI ,客户端向后台传参数、文件时碰到些问题:

一、传参数

用 JQuery ajax 调用后台方法时,后台方法一般定义成这样:

        [WebMethod]
        [Authorize]
        public string GetCustomList(string CustomerName, string Name, string Loc_Name, string selectStorageState)
        {           
        }

前台这样调用:

            $.ajax({
                type: "POST",
                url: "/Home/GetCustomList",
                data: "{ \"CustomerName\":\"" + $("#CustomerName").val() + "\",\"Name\": \"" + $("#Name").val() + "\",\"Loc_Name\": \"" + $("#Loc_Name").val() + "\",\"selectStorageState\": \"" + $("#selectStorageState").val() + "\" }",
                contentType: "application/json; charset=utf-8",
                dataType: "json",
                success: function (msg) {  
                },
                error: function (xhr, msg) { alert(msg); }
            });

用这种方法传参在 WebAPI 里会报下面的错误:

Can’t bind multiple parameters (‘foo’ and ‘bar’) to the request’s content.

可以有以下方法解决这个报错

1、后台封装成类

WebAPI 后台:

    public class User
    {
        public string user_name { get; set; }
        public string user_password { get; set; }
    }
       [HttpPost]
        public string Login([FromBody]User user)
        {            
        }

Android 前台:

            List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
            nameValuePairs.add(new BasicNameValuePair("user_name", mUserName));
            nameValuePairs.add(new BasicNameValuePair("user_password", mPassword));
            String resultString="";
            try {
                resultString= HttpHelper.invokePost("Login", nameValuePairs);
            } catch (Exception e) {                
            }

2、拼 json

WebAPI 后台

[HttpPost]
[Authorize]
public string GetStockList([FromBody]string jsonString)
{
    JObject jObject = JObject.Parse(jsonString);
    page = Convert.ToInt32(jObject["page"].ToString());
    pageSize = Convert.ToInt32(jObject["pageSize"].ToString());    
}

Android 前台

String jsonString = "{\"page\":\""+sPage+"\",\"pageSize\":\""+sPageSize+"\"}";
List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();        
nameValuePairs.add(new  BasicNameValuePair("", jsonString));
String resultString= HttpHelper.invokePost("GetStockList", nameValuePairs);

二、传文件

WebAPI 后台

        [Authorize]
        public Task<HttpResponseMessage> Add_Img()
        { 
            string root = HttpContext.Current.Server.MapPath("~");
            string tmpRoot = root + "/App_Data";
            var provider = new MultipartFormDataStreamProvider(tmpRoot);
            // Read the form data and return an async task.
            // 读取表单数据,并返回一个async任务
            string sName = "88";
            string nName = "";
            string FilePath = "Uploads/";
            Request.Content.Headers.ContentType.CharSet = "UTF-8";
            var task = Request.Content.ReadAsMultipartAsync(provider).
                ContinueWith<HttpResponseMessage>(t =>
                { 
                    sName = provider.FileData[0].LocalFileName;
                    string GpsImgJson = provider.FormData["GpsImgJson"];
                    GpsImgJson = HttpUtility.UrlDecode(GpsImgJson, Encoding.GetEncoding("UTF-8"));                   
                    GpsImg gpsImg = JsonHelper.JsonDeserialize<GpsImg>(GpsImgJson);
                    nName = gpsImg.FileName;
                    FilePath += nName;                    
                    if (!File.Exists(root + "/" + FilePath))
                    {
                        File.Move(sName, root + "/" + FilePath);
                    }                
                    //保存                    
                    if (true)
                    {
                        return Request.CreateResponse<string>(HttpStatusCode.OK, "上传成功");
                    }
                    else
                    {
                        return Request.CreateResponse<string>(HttpStatusCode.InternalServerError, "保存出错!");
                    }
                    
                });          
            return task;
        }

Android 前台

                            String jsonString = "{\"Title\":\""+myTitleText.getText().toString()+
                                    "\",\"Content\":\""+myContentText.getText().toString()+
                                    "\",\"FileName\":\""+filename+
                                    "\",\"Longitude\":\""+lonString+"\",\"Latitude\":\""+latString+"\"}";
                            Map<String, String> params0 = new HashMap<String, String>();
                            params0.put("GpsImgJson", jsonString);
                            String st= HttpHelper.invokePost("AddImg", mImageUri.getPath(), params0);
    public static String invokePost(String action, String filePath, Map<String, String> params) {
        try {
            String url = API_URL + action + "/";
            Log.d(TAG, "url is" + url);             
            HttpPost httpPost = new HttpPost(url);            
            File file = new File(filePath);                
            MultipartEntity reqEntity = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE,null,Charset.forName("UTF-8"));
            FileBody fb = new FileBody(file);
            reqEntity.addPart("myFile", fb);  
            if(params != null){  
                Iterator<String> it = params.keySet().iterator();  
                while(it.hasNext()){  
                    String name = it.next();  
                    reqEntity.addPart(name, new StringBody(params.get(name),Charset.forName("UTF-8")));  
                }  
            }
            httpPost.setEntity(reqEntity);  
            return invoke(httpPost);
        } catch (Exception e) {
            Log.e(TAG, e.toString());
        }
        return null;
    }

参考网页:

http://encosia.com/using-jquery-to-post-frombody-parameters-to-web-api/

http://www.asp.net/web-api

posted on 2014-02-28 16:08  thegavincheng  阅读(7008)  评论(1编辑  收藏  举报