【问题标题】:JAVA calling API succeed but Postman failedJAVA调用API成功但邮递员失败
【发布时间】:2021-09-11 11:27:52
【问题描述】:

我有一个调用 API 的 JAVA 程序。 API 需要正文加密并使用 Hmac256 对标头 + 正文进行签名。下面的源代码返回期望的结果。但是,如果我“System.out.print”标头和正文并将其直接从 Java 复制到 Postman 以发出请求,API 在 Postman 中返回“签名验证失败”。有人知道我错过了什么吗?

我在下面包含了代码和邮递员输入。谢谢。

public class HelloWorld{

     public static void main(String []args){
          System.setProperty("java.net.useSystemProxies", "true");
          HttpClient httpClient = HttpClientBuilder.create().useSystemProperties().build();
          
          // header
          long now = System.currentTimeMillis();
          HttpPost httpPost = new HttpPost("https://example/api/v1");
          String timestamp = String.valueOf(now);
          String nonce = getRandomStringByLength(32);
          httpPost.setHeader("Content-type", "application/json");
          httpPost.setHeader("clientID", clientID);
          httpPost.setHeader("timestamp", timestamp);
          httpPost.setHeader("nonce", nonce);
          
          // body
          JSONObject contentJson = new JSONObject();
          contentJson.put("businessID", getRandomStringByLength(36));
          String[] info = new String[] {"name", "phone", "email"};
          contentJson.put("Fields", info);
          
          // encrypting the body
          JSONObject bodyJson = new JSONObject();
          bodyJson.put("content", encrypt(key,contentJson.toString()));
          String body = bodyJson.toString();
          
          // creating a signature
          String signature = signData(secret,clientID + timestamp + nonce + body);
          
          httpPost.setHeader("signature", signature);
          try {
              StringEntity requestEntity = new StringEntity(body);
              httpPost.setEntity(requestEntity);
              HttpResponse httpResponse = httpClient.execute(httpPost);
              if (httpResponse.getStatusLine().getStatusCode() == 200) {
                  String result = EntityUtils.toString(httpResponse.getEntity());
                  System.out.println(result);
                  return result;
              }
              String responseString = new BasicResponseHandler().handleResponse(httpResponse);
              
          } catch (Exception e) {
              System.out.println(e);
              return null;
          }
          return null;
     }
}

邮递员输入:

headers in Postman

body in Postman

【问题讨论】:

    标签: java api postman


    【解决方案1】:

    一些可能性是:

    • 您在 Postman 中粘贴的签名中有一些额外的空格或换行
    • 每个签名只被接受一次,所以如果你在 Java 代码中使用它,你不能再次从 Postman 使用相同的签名

    【讨论】:

    • 非常感谢您的回答:) 我认为间距很好。一个签名确实可能只被接受一次!因此,如果我要在 Postman 中尝试,我尝试不执行 JAVA 中的发布请求,但遗憾的是它仍然无法正常工作。无论如何谢谢:):)
    【解决方案2】:

    在通过剪贴板将数据从 sysout 控制台复制粘贴到 PostMan 时,这看起来像是一些编码问题。当你做一个system.out.println时,如果源字符串编码和sysout控制台识别的编码不同,你可能得不到正确的值。

    【讨论】:

    • 哦,这个很有可能!!!!非常感谢您提供如此有用的解释:)如果是这样,您是否知道无论如何我可以解决由于编码方法的差异而导致的这个问题?非常感谢:):)
    猜你喜欢
    • 2022-01-13
    • 2020-11-04
    • 1970-01-01
    • 2020-07-07
    • 2021-04-15
    • 1970-01-01
    • 1970-01-01
    • 2021-01-27
    • 1970-01-01
    相关资源
    最近更新 更多