我正在尝试通过 android volley 发送 POST 请求。我在 infinityfree.net 上有一个子域。我在其中上传了一个名为 Check.php 的 php 文件。
检查.php:
<?php
$response=array();
$response['value']="Returned";
echo json_encode($response);
?>
当我试图向这个文件发送 POST 请求时,我收到了一条消息
"this site requires Javascript to work, please enable Javascript in your browser or use a browser with Javascript support"
因此,我尝试在 POST 请求中放置一个 cookie(我从 chrome 获取的)。我像这样重写了 StringRequest 类的 getHeaders() 方法:
@Override
public Map<String, String> getHeaders() throws AuthFailureError {
Map<String, String> headers = super.getHeaders();
headers.put("Cookie","__test=c25bd97d5259049875f9d7f1c990f0ea; expires=Friday, 1 January 2038 at 05:25:55; path=/");
return headers;
}
然后我就可以发送 GET 和 POST 请求并完美地获得所需的响应。问题是,在运行应用程序几天后,这个 cookie 值变得毫无用处。所以,我必须再次转到 chrome,删除旧的 cookie,在 chrome 中打开 url,然后复制新 cookie 的内容并将其粘贴到我的应用程序中的 getHeaders() 方法中,以使其再次运行。几天后问题再次出现并显示相同的错误:
this site requires Javascript to work, please enable Javascript in your browser or use a browser with Javascript support
我怎样才能解决这个问题,这样我就不必在我的应用程序中手动更新 cookie?如果可能,请分享一些代码示例。
最佳答案
我已经为您的问题找到了解决方案。所以,基本思路是这样的:
在您的应用程序的打开屏幕中的所有内容后面放置一个 WebView
(以便它被隐藏)。在您的域中放置一个空白的 php 文件。从此 WebView
访问此 php 文件。接受将从服务器发送的 cookie 并将其存储在 SharedPreferences
中。您可以在应用程序的其余部分使用此 Cookie,因为此 Cookie 是新创建的。
我的示例代码:-
示例.php:
<?php
?>
使用 WebView
和 CookieManager
将 cookie 存储在您应用的 MainActivity
中:
String url="http://your_domain.com/Sample.php";
CookieSyncManager.createInstance(mContext);
cookieManager=CookieManager.getInstance();
webView.getSettings().setJavaScriptEnabled(true);
webView.setWebViewClient(new WebViewClient(){
@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
cookieManager.setAcceptCookie(true);
cookie=cookieManager.getCookie(url);
System.out.println(cookie);
SharedPreferences sharedPreferences=getSharedPreferences("CookieDetails",MODE_PRIVATE);
SharedPreferences.Editor editor=sharedPreferences.edit();
editor.putString("cookieStart",cookie);
editor.apply();
//YOU CAN USE THE COOKIE AFTER THIS
}
});
webView.setWebChromeClient(new WebChromeClient());
webView.loadUrl(url);
webView.clearCache(true);
webView.clearHistory();
cookieManager.removeAllCookie();
cookieManager.removeSessionCookie();
像这样重写 StringRequest
类中的 getHeaders()
方法:
@Override
public Map<String, String> getHeaders() throws AuthFailureError
{
Map<String,String> headers=new HashMap<>();
SharedPreferences sharedPreferences=mContext.getSharedPreferences("CookieDetails",Context.MODE_PRIVATE);
String cookieStart=sharedPreferences.getString("cookieStart","");
headers.put("Cookie",cookieStart+"; expires=Friday, 1 January 2038 at 05:25:55; path=/");
return headers;
}
在此之后,您可以像往常一样发出 volley GET 和 POST 请求。
干杯!
关于android - 如何将有效的 cookie 永久放入 android 中的 volley post 请求中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58143688/