HTTP Post Android webview
我正在尝试实现一个函数,它通过HTTPPOST将base64编码的图像从webview传递到我的web应用程序。然后,比方说,这个图像必须立即显示在我的视图中。我使用过这个,但它不能正常工作,所以在谷歌搜索了一点之后,我开始使用AsyncTask:HTTP Post Android webview,android,asp.net-mvc,webview,http-post,http-post-vars,Android,Asp.net Mvc,Webview,Http Post,Http Post Vars,我正在尝试实现一个函数,它通过HTTPPOST将base64编码的图像从webview传递到我的web应用程序。然后,比方说,这个图像必须立即显示在我的视图中。我使用过这个,但它不能正常工作,所以在谷歌搜索了一点之后,我开始使用AsyncTask: public void tryUpload(String url, Context context) { new UploadTask(context).execute(url); } private class UploadTask ex
public void tryUpload(String url, Context context) {
new UploadTask(context).execute(url);
}
private class UploadTask extends AsyncTask<String, Void, HttpResponse> {
private Context context;
public UploadTask(Context ctx) {
context = ctx;
}
@Override
protected HttpResponse doInBackground(String... urls) {
List<NameValuePair> formData = new ArrayList<NameValuePair>(3);
formData.add(new BasicNameValuePair("image", "base64EncodedString"));
HttpPost httpPost = new HttpPost(urls[0]);
try {
httpPost.setEntity(new UrlEncodedFormEntity(formData, HTTP.UTF_8));
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
HttpClient httpClient = new DefaultHttpClient();
HttpResponse response = null;
try {
response = httpClient.execute(httpPost);
WebView browser = (WebView) findViewById(R.id.my_web_engine);
browser.setWebChromeClient(new MyWebChromeClient());
browser.setWebViewClient(new MyWebViewClient());
try{
String data = new BasicResponseHandler().handleResponse(response);
browser.loadDataWithBaseURL(urls[0], data, "text/html", HTTP.UTF_8, null);
} catch (IOException e) {
e.printStackTrace();
}
} catch (IOException e) {
e.printStackTrace();
}
return response;
}
@Override
protected void onPostExecute(HttpResponse response) {
HttpEntity entity = response.getEntity();
if (entity != null) {
String responseBody = null;
try {
responseBody = EntityUtils.toString(response.getEntity());
} catch (IOException e) {
e.printStackTrace();
}
if (responseBody.equalsIgnoreCase("OK"))
Log.w("myApp", "Everything is OK");
else
Log.w("myApp", "Something is wrong");
}
}
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (Intent.ACTION_SEND.equals(action) && type != null) {
if (type.startsWith("image/")) {
// for simplicity skipped image encoding to base64
String url = getResources().getString(R.string.url) + "/MyController/ImageUpload";
Context context = ImageUploadActivity.this;
tryUpload(url, context);
}
}
}
}
而视图
包含以下行:
“/>
当我删除[HttpPost]
时,加载视图时不会出现问题,但不会显示图像
但是当我离开时,我得到了一个例外
org.apache.http.client.HttpResponseException:未找到
在以下行中:
String data=new BasicResponseHandler().handleResponse(响应);
有人知道我做错了什么吗?你只应该在onPostExecute中对你的WebView做些什么。你应该在那里加载响应。请在loadDataWithBaseURL()中显示你提供的源/数据。@greenapps url[0]=”“我不知道“数据”中应该包含什么数据变量,因为它抛出一个错误
org.apache.http.client.HttpResponseException:notfound
。似乎它试图找到一个适当的操作,该操作处理HTTP Post,并且只有一个参数-image,但由于某种原因,它找不到它。可能是因为它不携带参数,并且无法找到没有参数的操作。这只是一个很长的机会。@greenapps只是出于好奇,我又添加了一个同名的动作,但没有任何参数。它成功了。视图毫无例外地打开了。这意味着,出于某种原因,loadDataWithBaseURL()不携带post参数:(另请注意,还删除了操作的[HttpPost]
属性,否则它将不起作用。@greenapps在移动response=httpClient.execute(HttpPost)之后的代码部分;
对于onPostExecute方法,我在String data=new BasicResponseHandler().handleResponse(响应)中获得致命异常:main android.os.NetworkOnMainThreadException
行。有什么建议吗?当然会有例外。String data=new Basi…
应该保留在doon background中。将其更改为data=new Basi…
并将String data;
作为任务的私有变量。
// temporary removed authorization
[HttpPost]
public ActionResult ImageUpload(string image)
{
// skipped some lines
ViewData.Add("imageFromWebView", image);
return View();
}