天天看點

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

轉載于:https://www.cnblogs.com/cg6811568/p/3573795.html

繼續閱讀