Redirect 使用React native在获取请求中禁用重定向

Redirect 使用React native在获取请求中禁用重定向,redirect,react-native,fetch,Redirect,React Native,Fetch,我正在尝试使用没有API的React Native爬网。它是用PHP编写的 要记录用户,必须发送POST请求。响应返回一个带有PHPSessid cookie的cookie,我必须捕获该cookie以在后续请求中使用 我想捕获cookie值,购买POST响应是302,重定向会自动跟随,所以我看不到cookie。在node中,我可以使用重定向:manual,但在react native中不起作用 cookie会在后续请求中自动发送,我正在尝试使用react native cookie手动管理coo

我正在尝试使用没有API的React Native爬网。它是用PHP编写的

要记录用户,必须发送POST请求。响应返回一个带有PHPSessid cookie的cookie,我必须捕获该cookie以在后续请求中使用

我想捕获cookie值,购买POST响应是302,重定向会自动跟随,所以我看不到cookie。在node中,我可以使用
重定向:manual
,但在react native中不起作用

cookie会在后续请求中自动发送,我正在尝试使用react native cookie手动管理cookie,我想知道这是否可行


您知道停止重定向的方法吗?

我一直在检查代码,我所做的是:

  • 清除所有cookies
  • 启动一个空的登录请求
  • 抓捕PHPSessID coookie
  • 使用该PHPSessID启动登录请求
  • 之后,后续的获取请求将自动具有一个PHPSessID cookie,其中包含一个有效的登录用户,因此我们可以使用该站点进行简单的获取
下面是一些代码,但重要的是您首先执行一个空的登录请求,捕获PHPSessid并使用该PHPSessid启动真正的登录请求

这将是主要功能:

从“react native Cookie”导入Cookie;
//我想这只是用来清理饼干的
功能登录(用户,通过){
//清除所有域的所有cookie
//我们需要在没有授权令牌的情况下开始
Cookie.clear();
const makeLoginRequest=(sessiond)=>
makeLoginRequestForUserAndPass(用户、过程、会话ID);
返回makeInitialRequest()
.then(GetSessiondFromResponse)
.然后(makeLoginRequest)
。然后(检查ifLoggedGetSessionID);
}
初始请求是对登录脚本的请求。请注意,我使用GET是因为它与我的站点协同工作,可能需要一篇空帖子:

函数makeInitialRequest(){
const INIT_PATH='/index.php?r=site/login';
const INIT_URL=site+INIT_路径;
const request=新请求(初始化URL,选项…);
返回获取(请求);
}
我们在响应中有会话ID。我使用了一个简单的正则表达式来提取它。请注意,我们没有登录;PHP创建了一个会话,这就是我们在这里看到的:

函数getSessionIDFromResponse(响应){ 返回getPHPSessIdFromCookie(response.headers.get('set-cookie'); } 函数getPHPSessIdFromCookie(标头){ 常量regex=/PHPSESSID=(\w*)/; const match=regex.exec(头); 返回匹配?匹配[1]:“”; } 现在是登录请求。注意,我不能在这里停止重定向,但我不必这样做,因为我们可以稍后使用PHPSessid。在POST请求中,重定向必须设置为手动:

函数makeLoginRequestForUserAndPass(用户、过程、会话ID){
const request=buildLoginRequest(用户、通行证、会话ID);
返回获取(请求);
}
//这就是我们构建真正登录请求的地方
函数buildLoginRequest(用户、过程、会话){
const LOGIN_PATH='/index.php?r=site/LOGIN';
const LOGIN\u URL=站点+登录路径;
常量字段=[
{name:'LoginForm[username]',值:user},
{name:'LoginForm[password]',值:pass},
等
];
常量数据=translateFieldsToURLEncodedData(字段);
常量头={
“内容类型”:“应用程序/x-www-form-urlencoded”,
Cookie:`PHPSESSID=${sessiond}`,//这里是您放置数据的地方
};
const options={method:'POST',
标题:标题,
模式:“cors”,
缓存:“默认值”,
代理人:代理人,
正文:数据,
重定向:“手动”//非常重要:如果不这样做,cookie将丢失
};
返回新请求(登录URL、选项);
}
//简单效用函数
函数translateFieldsToURLEncodedData(字段){
让pairs=fields.map((field)=>{
返回encodeURIComponent(field.name)+'='+encodeURIComponent(field.value);
});
返回pairs.join('&');
}
这是最后一部分。为了查看是否已登录,我检查了响应是否包含属于登录错误页面的文本。我还得到了PHPSessid(我想它在登录后发生了变化,不确定,那是一年前),但我不知道我是否使用了它,我相信它会自动包含在后续请求中。我认为这一部分可以简化和改进:

函数checkiLoggedGetSessionId(响应){
返回(
CheckiLoggeDok(响应)
.然后(()=>GetSessiondFromResponse(响应))
);
}
函数checkiLoggeDok(响应){
返回getTextFromResponse(响应)
.然后(投手Rorifnotlogedok);
}
函数getTextFromResponse(response){
返回response.text();
}
功能投掷器RorIfNotLogeDok(第页){
如果(isErrorPage(page))抛出新错误(“登录失败”);
}
功能页(文本){
const ERROR_MESSAGE='出现在站点登录失败页面中的内容';
设n=text.search(错误消息);
返回n!==-1;
}

希望这会有用。

你解决了这个问题吗?@Alvaro-你找到解决方案了吗?我刚刚发布了我所做的