0

当我单击页面上的搜索按钮时,它会发送一个发布请求。我想通过 cli-http 发帖。我怎样才能做到这一点?

(def default-http-opts 
    {:socket-timeout 10000
     :conn-timeout 10000
     :insecure? true
     :throw-entire-message? false})

(clj-http/post initial-url default-http-opts)

可以发布请求,但问题是我想传入一些参数。这些参数(选择的按钮)在页面上是默认的。

他们是:

AdvancedSearchForm:CourseOrSubjectSelection=ALL_ALL
AdvancedSearchForm:GraduateLevelSelection=ALL

AdvancedSearchForm:allStudyAreas=t

AdvancedSearchForm:departmentList=

AdvancedSearchForm:facultyList=

AdvancedSearchForm:keywords=

AdvancedSearchForm:level=ALL

AdvancedSearchForm:semester=ALL

oracle.adf.faces.FORM=AdvancedSearchForm

oracle.adf.faces.STATE_TOKEN=_id21519:_id21520

source=AdvancedSearchForm:searchButton

键 AdvancedSearchForm:semester 包含 ':',所以我使用字符串作为键,例如“AdvancedSearchForm:semester”,在 clj-http 中可以吗?

我这样做:

(spit (file "/tmp" "ts.html") 
    (:body (http/post initial-url 
        {:form-params {"AdvancedSearchForm:CourseOrSubjectSelection" "ALL_ALL",                          "AdvancedSearchForm:GraduateLevelSelection" "ALL"}})))`

实际上它返回的页面确实是“结果”,但没有列出任何课程。只有模板。我想获取所有仅通过手动单击显示的课程链接。有什么帮助吗?

这个是我从 Tamper Data 截取的图像。它显示了我单击“搜索”按钮后会发生什么。似乎客户端被重定向到 searchresult.jsp。我用 curl 来模仿它。我这样做

curl -D "form data..." https://handbook.unimelb.edu.au/faces/htdocs/user/search/AdvancedSearch.jsp

然后快速运行

curl https://handbook.unimelb.edu.au/faces/htdocs/user/search/SearchResults.jsp

尽管页面已下载,但未显示任何结果内容。

4

2 回答 2

2

看起来服务器不理解您发送给它的参数。

使用中的转义是percent-encoding。尝试使用 clj-https README.md 中的调试功能检查它是否正在使用:

;; print request info to *out*, including request body:
(client/post "http://example.org" {:debug true :debug-body true :body "..."})

或者尝试使用终端中的 curl 命令或方便的Firefox restclient 插件手动运行请求。

于 2013-09-08T10:09:20.110 回答
1

从他们的 GitHub 页面(https://github.com/dakrone/clj-http):

;; Send form params as a urlencoded body (POST or PUT)
(client/post "http//site.com" {:form-params {:foo "bar"}})
于 2013-09-07T13:22:25.687 回答