为什么 GET Request 在 PostMan 上总是给 200 而在 Java App 里给 504?

Why does GET Request always give 200 on PostMan but gives 504 in Java App?

我目前正在与一家公司的 API 集成,我能够在 PostMan 中访问他们的订单检索端点,获得 200OK 状态,但在我的 java 应用程序中,我我尝试使用 OkHttp3、Unirest 甚至我自己的 HttpReq 库访问端点,但无论我使用哪个库,我最终都会得到

<head><title>504 Gateway Time-out</title></head>
<body bgcolor="white">
<center><h1>504 Gateway Time-out</h1></center>
<hr><center>nginx/1.4.6 (Ubuntu)</center>
</body>
</html>

我的 java HttpRequest 和 PostMan 的 headers、params、url 是相同的,因为我从中复制了 URL、params、headers将 Java 中的所有变量打印到 PostMan 中的结果。我什至尝试过使用 PostMan 提供的 Java 片段 (HttpOk3/UniRest),但我仍然收到 504。我也尝试过将超时设置为无限等。我可能做错了什么?

这是我用 Unirest 创建的 java HttpRequest:

         try {
            Unirest.setTimeouts(30000, 100000);
            HttpResponse<String> response = Unirest.get(this.getOrderUrl)
                    .queryString("access_token", config.getAccessToken())
                    .queryString("id", circleGraphicsOrderId)
                    .header("content-type", "application/json")
                    .header("cache-control", "no-cache")
                    .header("authorization", "Basic Og==")
                    .asString();
        } catch (UnirestException e) {
            e.printStackTrace();
        }

这里是 API 凭据,如果你们想和我一起测试的话:

(参数内置于url) URL = https://rest.cgorders.com/api/orders/order?access_token=97484431a4525ed2b294b699a3d2f202&id=15755354

参数是:{access_token:97484431a4525ed2b294b699a3d2f202, id:15755354}

编辑:已解决! 我使用的是古怪的 HttpRequest 库,因为我们公司代码中有大量使用此类库的用例。使用 java 提供的 Markspace 在下面写的解决了这个问题。

以下适合我。您需要更改什么才能使其按您希望的方式运行?

public class GetRequest {

   public static void main( String[] args ) {
      System.out.println( new GetRequest().get( "" ) );
   }

   public String get( String search ) {

      try {
         URL url = new URL( "https://rest.cgorders.com/api/orders/order?access_token=97484431a4525ed2b294b699a3d2f202&id=15755354" );
         HttpURLConnection conn = (HttpURLConnection) url.openConnection();
         conn.setRequestMethod( "GET" );
         conn.setRequestProperty( "Accept", "application/json" );

         conn.connect();

         BufferedReader br = new BufferedReader( new InputStreamReader(
                 conn.getInputStream(), "UTF-8" ) );

         StringBuilder sb = new StringBuilder( 2048 );
         for( String line; (line = br.readLine()) != null; ) {
            sb.append( line );
         }
         conn.disconnect();

         return sb.toString();

      } catch( IOException ex ) {
         Logger.getLogger( Pixabay.class.getName() ).log( Level.SEVERE, null, ex );
         return ex.toString();
      }

   }
}

我使用了 Spring 的 RestTemplate HTTP 客户端,它工作得很好。也许那个客户端可以用。

public static void main(String[] args) {
    RestTemplate restTemplate = new RestTemplate();
    Gson gson = new GsonBuilder().setPrettyPrinting().create();

    HttpHeaders hh = new HttpHeaders();
    hh.setContentType(MediaType.APPLICATION_JSON);
    hh.set(AUTHORIZATION, "Basic Og==");
    hh.setCacheControl("no-cache");
    HttpEntity he = new HttpEntity(hh);

    String url = "https://rest.cgorders.com/api/orders/order?access_token=97484431a4525ed2b294b699a3d2f202&id=15755354";
    Map results = restTemplate.exchange(url, HttpMethod.GET, he, Map.class).getBody();

    //this also worked and is a lot less code
    //Map results = restTemplate.getForObject("https://rest.cgorders.com/api/orders/order?access_token=97484431a4525ed2b294b699a3d2f202&id=15755354", Map.class);
    System.out.println(gson.toJson(results));
}

如果您想复制,这里是导入。

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import java.util.Map;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import static org.springframework.http.HttpHeaders.AUTHORIZATION;
import org.springframework.http.HttpMethod;
import org.springframework.http.MediaType;
import org.springframework.web.client.RestTemplate;