我被要求移植我正在写Java的PHP模块。我之前使用的是PHP的原生cURL库,现在尝试使用HttpURLConnection实现相同的操作。
这是我想用cURL做的电话:
curl -u 'ExactID:Password' \
-H 'Content-Type: application/json; charset=UTF-8' \
-H 'Accept: application/json' \
-d '{
"transaction_type":"00",
"amount":"15.75",
"cardholder_name":"PaulTest",
"transarmor_token":"3000",
"credit_card_type":"Visa",
"cc_expiry":"0016",
}' \
https://api.demo.globalgatewaye4.firstdata.com/transaction/v11
这是我在Java中的内容,它返回HTTP 400错误。有什么想法吗?
public static void main(String[] args) {
URL url = new URL("https://api.demo.globalgatewaye4.firstdata.com/transaction/v11");
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setDoOutput(true);
conn.setDoInput(true);
conn.setRequestMethod("POST");
conn.setRequestProperty("Content-Type", "application/json; charset=UTF-8");
conn.setRequestProperty("Accept", "application/json");
String userpass = "ExactID" + ":" + "Password";
String basicAuth = "Basic " + new String(new Base64().encode(userpass.getBytes()));
conn.setRequestProperty ("Authorization", basicAuth);
JSONObject obj = new JSONObject();
obj.put("transaction_type", "00");
obj.put("amount", "10");
obj.put("cardholder_name", "PaulTest");
obj.put("transarmor_token", "3000");
obj.put("cc_expiry", "0016");
obj.put("credit_card_type", "Visa");
String input = obj.toString();
System.out.println(input);
OutputStream os = conn.getOutputStream();
os.write(input.getBytes());
os.flush();
if (conn.getResponseCode() != HttpURLConnection.HTTP_CREATED) {
throw new RuntimeException("Failed : HTTP error code : "+ conn.getResponseCode() + conn.getResponseMessage());
}
答案 0 :(得分:0)
java代码中的一个歧义是字符串到字节数组编码。默认情况下,java将使用您的默认平台编码,但明确表达它是一种很好的做法,因为它通常会导致很难跟踪错误
String basicAuth = "Basic " + new String(new Base64().encode(userpass.getBytes("ISO-8859-1")));
还要确保使用
检查java在curl上生成的编码base 64值-H 'Authorization: Basic ....`
而不是-u
此外,我还尝试将创建的URLConnection强制转换为HttpsURLConnection。 Thay可能/没有差异
HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();
答案 1 :(得分:0)
在摆弄后,我犯了两个错误:
对于此POST方法,不需要基本身份验证。用户& pw和其他参数一起进入JSON主体。
另外,我的“transarmor_token”字段需要是16位数。
结论:HttpURLConnection是一个很好的cURL选择。忘掉使用curl-java绑定。
谢谢!