如何像从浏览器发送一样发送获取请求

how to send get request as if sent from browser

我正在尝试测试几个 API 并进行比较。 对于其中一项服务,我只能在输入请求时得到响应 在浏览器中。 当我使用完全相同的 URL 从代码(Java 和 Jersey)发送请求时,我得到 401 未经授权。

作为一种解决方法,也是出于好奇,我想让我的 java 客户端发送 请求就像浏览器一样,因此我可以轻松测试响应。

这纯粹是为了基准测试...我知道这不是一个可靠的解决方案。

我的获取请求代码:

import com.sun.jersey.api.client.Client;
import com.sun.jersey.api.client.ClientResponse;
import com.sun.jersey.api.client.WebResource;

public class ClientTest
{

    @Test
    public void testGisGraphy()
    {

        String url = "http://services.gisgraphy.com/geocoding/geocode?address=89%20Rue%20Champoiseau%2C%20Tours&country=FR&format=JSON&postal=true";
        Client client = Client.create();
        WebResource webResource = client.resource(url);
        ClientResponse response =  webResource.accept("application/json").get(ClientResponse.class);
        String jsonString = response.getEntity(String.class);
        System.out.println(jsonString.toString());
    }
}

您应该指定用户代理 header

以下有效。
两个 headers、"Accept-Encoding",值为 "gzip""Accept-Language" 需要任何仲裁值。接受带有值 gzip 的编码是必须的。 Accept Language 任意值都可以。

public static void main(String[] args) {

String url =
    "http://services.gisgraphy.com/geocoding/geocode?address=89%20Rue%20Champoiseau%2C%20Tours&country=FR&format=JSON&postal=true";
Client client = Client.create();
WebResource webResource = client.resource(url);
ClientResponse response =
    webResource
        .accept("application/json")
        .header("Accept-Encoding","gzip")
        .header("Accept-Language", "arbit text")
        .get(ClientResponse.class);
String jsonString = response.getEntity(String.class);
System.out.println(jsonString.toString());
}

我一直在尝试运行。以下是回复内容:

<html>
<head>
<title>Too much requests</title>
<style>
body { font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body bgcolor="white" text="black">
<table width="100%" height="100%">
<tr>
<td align="center" valigin="middle">
Your request can not be processed :
<ul>
<li>Are you a bot or do you use those webservices in a software ? you can only use the webservice in a browser</li>
<li>Do you reach the maximum number of requests / seconds allowed</li>
</ul>
<br/><br/>
Wait a little bit and resubmit your request
</br></br/>
 If you want to have better QOS and SLA, you can <a href="http://premium.gisgraphy.com/">subscribe to premium webservices</a>
</td>
</tr>
</table>
</body>
</html>

结论:- 在服务器端,他们正在做一些检查,以便只有来自浏览器的请求得到服务,其余的都是未经授权的。

试错了,好像请求headers"Accept-Encoding"和"Accept-Language"是必须的。