gpt4 book ai didi

java - Redmine/Java 本地 : Update query by script. 克隆 Fiddler 请求

转载 作者:可可西里 更新时间:2023-11-01 17:18:07 30 4
gpt4 key购买 nike

我正在编写一个脚本来更新我们每次部署冲刺时在项目中使用的几个查询。

我正在尝试通过以下方式复制我在 Fiddler 上测试的相同请求,它正在运行:

System.setProperty("sun.net.http.allowRestrictedHeaders", "true");
String host = 'redmine.our-domain.com';
String url = 'http://redmine.our-domain.com/queries/4088';
String REDMINE_SESSION_COOKIE = "_redmine_session=BAh7DkkiDHVzZXJfaWQGOgZFRmkvSSIKY3RpbWUGOwBGbCsHmouFWkkiCmF0aW1lBjsARmwrByk211tJIg9zZXNzaW9uX2lkBjsARkkiJTMzZWJkNmI1MzA4MzZkNmMxNGYwNjY1OWQxMDZjZmU3BjsAVEkiEF9jc3JmX3Rva2VuBjsARkkiMVB3bDlCb0F5NFFCbTd3dmdGWGx0VjdEL05WYjhVRGExdFluQmNMbnFZTHM9BjsARkkiCnF1ZXJ5BjsARnsHOgdpZGkC%2BA86D3Byb2plY3RfaWRpAssBSSIWaXNzdWVzX2luZGV4X3NvcnQGOwBGSSIMaWQ6ZGVzYwY7AEZJIg1wZXJfcGFnZQY7AEZpaUkiFWZqbGVzX2luWGV4X3NvcnQGOwBGSSINZm2sZW5hbWUGOwBG--5c961485290b3c98f38de934b939d25cc01e092f"
String data = "_method=put&authenticity_token=Pwl9BoAy4QBm7wvgFXlsV7D%2FNVb8UDa2tYnBcLnqYLs%3D&query%5Bname%5D=Current+sprint+1.75-test+API+0+0+1&query%5Bvisibility%5D=2query%5Bgroup_by%5D=category&f%5B%5D=status_id&op%5Bstatus_id%5D=o&f%5B%5D6=fixed_version_id&v%5Bfixed_version_id%5D%5B%5D=6030&c%5B%5D=tracker&c%5B%5D=status&c%5B%5D=priority&c%5B%5D=subject&c%5B%5D=assigned_to&c%5B%5D=fixed_version&c%5B%5D=start_date&c%5B%5D=due_date&c%5B%5D=estimated_hours&c%5B%5D=done_ratio&c%5B%5D=parent";
byte[] body = data.getBytes("UTF-8");

HttpURLConnection http = (HttpURLConnection) new URL(url).openConnection();
http.setRequestMethod('POST');
http.setRequestProperty('Cookie', REDMINE_SESSION_COOKIE);
http.setRequestProperty('Content-Type', 'application/x-www-form-urlencoded');
http.setRequestProperty('Host', host);
http.setRequestProperty('Content-Length', "${body.length}");
http.setDoOutput(true);
http.getOutputStream().write(body);

数据的 authenticity_token 和 session cookie 都是假的,但我正在复制粘贴 Fiddler 的那个。我正在添加主机和内容长度,因为 Fiddler 总是添加它们。

Fiddler 返回正确的 302 状态,因为 Redmine 重定向了页面。使用上面的代码,我收到 422 状态(无法处理的实体),正文中包含此消息:无效的表单真实性 token

我花了 3 天时间试图弄清楚我在克隆请求时做错了什么。有什么线索吗?

最佳答案

您应该尝试使用 Redmine 的 API 来实现您的目标,而不是尝试将 html 表单数据发送到 Controller 。

Redmine 登录表单还会创建不可见的表单数据字段,您可以在使用浏览器(通常是 F12)检查时看到这些字段。

其中一个隐藏字段是真实性 token ,它会在每次呈现表单时生成新的。

enter image description here

Fiddler 可能有效,因为它执行基本身份验证,如下所述: http://www.redmine.org/projects/redmine/wiki/Rest_api#Authentication

因此在您的代码中,您必须删除部分试图模仿表单数据的代码,并改用基本身份验证,如下所示:

System.setProperty("sun.net.http.allowRestrictedHeaders", "true");
String host = 'redmine.our-domain.com';
String url = 'http://redmine.our-domain.com/queries/4088';
String auth = Base64.getEncoder().encodeToString((username+":"+password).getBytes(StandardCharsets.UTF_8)); //Java 8 - not sure for 7

HttpURLConnection http = (HttpURLConnection) new URL(url).openConnection();
http.setRequestProperty("Authorization", "Basic "+auth);
http.setRequestMethod('POST');
http.setRequestProperty('Cookie', REDMINE_SESSION_COOKIE);
http.setRequestProperty('Content-Type', 'application/x-www-form-urlencoded');
http.setRequestProperty('Host', host);
http.setRequestProperty('Content-Length', "${body.length}");
http.setDoOutput(true);
http.getOutputStream().write(body);

关于java - Redmine/Java 本地 : Update query by script. 克隆 Fiddler 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53092390/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com