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


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com