Retrofit调用和Jsoup连接有什么区别?他们怎么可能 return 不同的反应却有相同的 URL?

What's the difference between Retrofit call and Jsoup connection? How is it possible they return different responses with same URL?

我正在重构我大学的移动应用程序 API。

主要想法是将其从 Jsoup 移至 Retrofit,因为 类 结构更好(并且因为 Google 建议如此)。

我发现以前的版本是围绕这个调用构建的:

Jsoup.connect(url)
     .data(request.getArgs())
     .ignoreContentType(true)
     .method(Connection.Method.POST)
     .timeout(timeout)
     .execute();

其中 .data() args 是 Map<Key, Value>,它正在转换为类似 url?key1=value1&key2=vaule2&...&keyN=valueN 的查询,如 Jsoup 文档中所述。

我已经测试了这个调用,它工作正常——返回一个 JSON 对象。

因此,根据这些信息,我尝试使用 Retrofit2 API 重新创建此类行为。 我创建了一个服务接口:

public interface MyService {
    @POST("url")
    Call<ResponseBody> myRequest(@Query("key1") String value1, @Query("key2") String value2);
}

但是当我尝试调用 this 请求时,作为响应正文,我得到了一个 404 HTML 页面而不是预期的 JSON。

所以这是我的回答:这两种解决方案如何形成它们的请求之间有什么区别吗? 我试图更深入,但一无所获。

好吧,JSoup 是 an HTML parser while Retrofit is an HTTP client,所以一开始看起来您似乎是在用另一个完全不同的目的替换一个用于一个目的的工具。

查看每个调用在做什么的最佳方法是 a) 阅读每个库的文档以了解链中的每个调用在做什么,或者 b) 使用像 Charles Proxy, Proxyman, or Fiddler 这样的工具来拦截每个库完成的调用并比较每个库发出的请求的参数(查询参数,headers,post body,等)。

我只是需要更仔细地阅读 Jsoup 文档。在其中一个 data() 方法重载的描述中有一条注释:对于 POST 请求,所有数据都将发送到请求主体。因此,对于 Retrofit2,我只需要使用 @FieldMap 属性而不是 @Query。