我的应用中有以下情况:
首次启动时,用户可以注册一个帐户。然后,应用程序从我的网络服务器获取一对(int user_id,string session_id),并将该数据存储在应用程序中。
在我的应用程序中,我使用WebView,让用户查看我网站的某些内容。使用user_id和session_id,他自动登录(之后,创建服务器端会话和cookie)。
我不想使用像http://mobile.mysite.com/?user_id=int&session_id=string这样的网址方案,因此我决定使用http post发送user_id和session_id。
在iOS中非常简单:
// Post the user data and load the website in the webview
NSString *startUrl = @"http://mobile.mysite.com/";
NSString *post = [NSString stringWithFormat:@"user_id=%@&session_id=%@, [user uid], [user sessionId]];
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:startUrl]];
[request setHTTPMethod:@"POST"];
[request setHTTPBody:[post dataUsingEncoding: NSUTF8StringEncoding]];
[webView loadRequest:request];
所以我在这里,在C#中的Windows 8商店应用程序中完成了相同的结构。不幸的是,WebView不允许我将用户信息发布到服务器。
你知道如何解决我的问题吗?
一个想法是创建一个http请求并与WebView共享cookie。但这对我来说并不是很优雅......
答案 0 :(得分:7)
甚至更好,请使用WebView.NavigateWithHttpRequestMessage(HttpRequestMessage requestMessage)
。
您可以使用Windows.Web.Http.HttpRequestMessage
来设置HTTP方法和请求内容等。
E.g:
HttpRequestMessage request = new HttpRequestMessage(
HttpMethod.Post,
new Uri("http://localhost"));
request.Content = new HttpStringContent(
String.Format("user_id={0}&session_id={1}", "Chinese", "food"));
webView.NavigateWithHttpRequestMessage(request);
这相当于以下HTTP请求:
POST / HTTP/1.1
Accept: text/html, application/xhtml+xml, */*
Accept-Language: en-US,en;q=0.5
User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; Touch; MASAJS; WebView/2.0; rv:11.0) like Gecko
Accept-Encoding: gzip, deflate
Host: localhost
Content-Length: 31
Connection: Keep-Alive
Cache-Control: no-cache
user_id=Chinese&session_id=food
对于Windows 8,使用JavaScript执行此操作!
<form>
,将action
设置为目标URI,并将method
设置为POST。<input>
并使用您想要的名称命名,在这种情况下为user_id
和session_id
。E.g:
protected override void OnNavigatedTo(NavigationEventArgs e)
{
webView.NavigateToString(@"<html>
<head>
<script type='text/javascript'>
function doSomething(userIdValue, sessionIdValue)
{
document.getElementById('user_id').value = userIdValue;
document.getElementById('session_id').value = sessionIdValue;
document.getElementById('myForm').submit();
return 'Hello World!';
}
</script>
</head>
<body>
<form id='myForm' action='http://localhost' method='post'>
<input type='hidden' id='user_id' name='user_id' />
<input type='hidden' id='session_id' name='session_id' />
</form>
</body>
</html>");
}
private void Button_Click(object sender, RoutedEventArgs e)
{
string result = webView.InvokeScript("doSomething", new string[] { "Chinese", "food" });
}
那将发送这样的请求:
POST / HTTP/1.1
Accept: text/html, application/xhtml+xml, */*
Accept-Language: en-US,en;q=0.5
User-Agent: Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; WOW64; Trident/6.0; Touch; MASAJS; WebView/1.0)
Content-Type: application/x-www-form-urlencoded
Accept-Encoding: gzip, deflate
Host: localhost
Content-Length: 31
Connection: Keep-Alive
Cache-Control: no-cache
user_id=Chinese&session_id=food
答案 1 :(得分:2)
您可以做的是发出http请求并将您获得的响应作为字符串。完成后,您可以拨打webView.NavigateToString(responseString)
。如果你需要css,那么你总是可以将CSS添加到html字符串中。
我认为这种情况通常是如何处理的。
stackoverflow答案作为参考:https://stackoverflow.com/a/13862424/329928
关于css的另一个stackoverflow答案:https://stackoverflow.com/a/14608917/329928