2013-11-24 82 views
1

我被要求移植一个我正在写入Java的PHP模块。我以前使用PHP的本地cURL库,现在试图用HttpURLConnection实现相同的操作。带有HttpURLConnection的Java 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

看起来不错,试试看看更多的信息conn.getErrorStream() –

回答

0

您的java代码中的一个歧义是字符串到字节数组的编码。默认情况下,java会使用默认的平台编码,但它是一个很好的做法,明确地表达它,因为它往往会导致难以跟踪的错误

String basicAuth = "Basic " + new String(new Base64().encode(userpass.getBytes("ISO-8859-1"))); 

可以肯定的同时检查由卷曲的Java产生的base 64编码值通过使用

-H 'Authorization: Basic ....` 

而不是-u

我也想尝试创建的URLConnection强制转换为HttpsURLConnection的。大公可能/不会使差异

HttpsURLConnection conn = (HttpsURLConnection) url.openConnection(); 
0

摆弄身边后,我犯了两个错误:

对于这个POST方法,是不是需要基本身份验证。用户& pw与其他参数一起进入JSON正文。

此外,我的“transarmor_token”字段需要16位数字。

结论:HttpURLConnection是一个很好的cURL替代品。忘记使用curl-java绑定。

谢谢!