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