【问题标题】:http post not working from code but working from postmanhttp post不是从代码工作,而是从邮递员工作
【发布时间】:2017-06-26 20:54:00
【问题描述】:

这里是代码

public class PostRequestMain {

    private static String ReadFile(String path) {
        String entityBody = new String();
        FileReader file;
        try {
            file = new FileReader(path);
            try {
                entityBody = IOUtils.toString(file);
            } catch (IOException e) {
                e.printStackTrace();
            }
        } catch (FileNotFoundException e1) {
            e1.printStackTrace();
        }
        return entityBody;
    }

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        MultiValueMap<String, String> headers = new LinkedMultiValueMap<String, String>();
        Map map = new HashMap<String, String>();
        map.put("Content-Type", "text/plain");
        map.put("userName", "username");
        map.put("password", "pass");

        String payLoad = ReadFile("src/main/resources/SamplePayload.html");

        headers.setAll(map);
        HttpEntity<String> requestPayload = new HttpEntity<String>(payLoad,headers);
        String url = "http://domain/path";

        ResponseEntity<String> responseEntity = null;

        UriComponentsBuilder uriComponents = UriComponentsBuilder.fromHttpUrl(url)
                .queryParam("param1", "value1");

        try {
            responseEntity = new RestTemplate().postForEntity(uriComponents.build().encode().toUri(), requestPayload, String.class);
        } catch (HttpStatusCodeException ex) {
            System.out.println("Status code = " + ex.getStatusCode());
        }

        String entityResponse = responseEntity.getBody();
        System.out.println(entityResponse);
    }

}

当我运行上面的代码时,它给了我异常

线程“main”中的异常

org.springframework.web.client.ResourceAccessException: I/O error on POST request for "http://domain/path ":Connection reset; nested exception is java.net.SocketException: Connection reset
    at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:503)
    at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:465)
    at org.springframework.web.client.RestTemplate.postForEntity(RestTemplate.java:342)
    at sprinthttp1.PostRequestMain.main(PostRequestMain.java:61)
Caused by: java.net.SocketException: Connection reset
    at java.net.SocketInputStream.read(SocketInputStream.java:209)
    at java.net.SocketInputStream.read(SocketInputStream.java:141)
    at java.io.BufferedInputStream.fill(BufferedInputStream.java:246)
    at java.io.BufferedInputStream.read1(BufferedInputStream.java:286)
    at java.io.BufferedInputStream.read(BufferedInputStream.java:345)
    at sun.net.www.http.HttpClient.parseHTTPHeader(HttpClient.java:704)
    at sun.net.www.http.HttpClient.parseHTTP(HttpClient.java:647)
    at sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1536)
    at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1441)
    at java.net.HttpURLConnection.getResponseCode(HttpURLConnection.java:480)
    at org.springframework.http.client.SimpleClientHttpResponse.getRawStatusCode(SimpleClientHttpResponse.java:47)
    at org.springframework.http.client.AbstractClientHttpResponse.getStatusCode(AbstractClientHttpResponse.java:32)
    at org.springframework.web.client.DefaultResponseErrorHandler.getHttpStatusCode(DefaultResponseErrorHandler.java:55)
    at org.springframework.web.client.DefaultResponseErrorHandler.hasError(DefaultResponseErrorHandler.java:49)
    at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:489)
    ... 3 more

但是当我尝试使用 Postman 向同一 URL 发出发布请求时,我得到了正确的结果。 我尝试了不同的方式来发布请求,但每次都出现同样的错误。 任何想法可能是什么问题?

【问题讨论】:

  • @Scary ..不,我只是更改它以免显示实际网址。
  • 你在 Postman 中指定了什么内容类型?
  • 我通常建议在问题中显示有关如何在 Postman 中构造请求的详细信息。

标签: java http-post postman


【解决方案1】:

我遇到了同样的问题。这是因为我使用的办公室互联网可能使用了一些代理。所以我尝试通过 Hotspot 使用我的移动互联网并且我能够获取结果。

这可能是由于某些代理阻止它获取结果而发生的。

谢谢

【讨论】:

    【解决方案2】:

    如果不查看拒绝您连接的域的具体示例 - 很难确切地说出了什么问题。

    但是,根据我的经验,我遇到了非常相似的问题,而且经常是服务器阻止在 User-Agent 标头中包含“java”关键字的请求,默认情况下来自您的代码(不完全是“java”,但包含它的字符串)。这样做是为了阻止各种机器人。

    所以我建议你添加 User-Agent 标头并将其设置为 Mozilla/5.0 或简单地 Postman emulator ,看看它是如何工作的。

    【讨论】:

    • 尝试将用户代理更改为 Mozilla 和 Postman 模拟器,但出现相同的错误消息。有没有办法调试此问题?
    • 有服务器端消息吗?
    【解决方案3】:

    根据我的经验只是拍摄,可能您在代理背后(尤其是如果您在办公室尝试此操作)。邮递员可以工作,因为代理已经在浏览器中配置。尝试在程序中设置代理信息,如下所示, // HTTP/HTTPS 代理

        System.setProperty("http.proxyHost", proxyhost);
        System.setProperty("http.proxyPort", proxyport;
        System.setProperty("https.proxyHost", proxyhost);
        System.setProperty("https.proxyPort", proxyport);
    

    【讨论】:

    • 您可以将答案中提到的 4 行放在 main 方法的开头。
    猜你喜欢
    • 1970-01-01
    • 2019-08-04
    • 2017-10-03
    • 2020-07-10
    • 2017-03-10
    • 2012-04-06
    • 2020-10-23
    • 2018-07-11
    • 1970-01-01
    相关资源
    最近更新 更多