gpt4 book ai didi

java - 在 httpclient : java 中编写的 curl 等效代码

转载 作者:行者123 更新时间:2023-11-29 09:22:48 25 4
gpt4 key购买 nike

有一个在 tomcat 中运行的网络应用程序,基于我的网络应用程序中的某些操作,我需要编写一个 java 代码来触发 curl (http://curl.haxx.se)。然后,Curl 将查询第三方应用程序并返回 XML/JSON。

这必须由我阅读并向用户返回适当的响应。

我知道这可以用 curl 来完成,但是使用命令行工具从 Web 应用程序发出请求并不是最好的方法,因此我用 Java 编写了代码,httpclient API。

curl 代码是

curl -u username:password -d "param1=aaa& param2=bbb" -k http://www.testme.com/api/searches.xml

curl 默认使用 base64 编码。于是我写的对应的Java代码是

import org.apache.commons.codec.binary.Base64;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpStatus;
import org.apache.commons.httpclient.UsernamePasswordCredentials;
import org.apache.commons.httpclient.methods.PostMethod;

import java.io.BufferedReader;
import java.io.ByteArrayOutputStream;
import java.io.InputStreamReader;

public class NCS2
{

public static void main(String args[]) {

String username = "abc";
String password = "xyz";

HttpClient httpclient = new HttpClient();
BufferedReader bufferedreader = null;


PostMethod postmethod = new PostMethod("https://www.testabc.com/api/searches.xml");
postmethod.addParameter("_def_id","8");
postmethod.addParameter("dobday", "6");
postmethod.addParameter("dobmonth","6");
postmethod.addParameter("dobyear", "1960");
postmethod.addParameter("firstname", "Test");
postmethod.addParameter("lastname", "Test");


String username_encoded = new String(Base64.encodeBase64(username.getBytes()));
System.out.println("username_encoded ="+username_encoded);

String password_encoded = new String(Base64.encodeBase64(password.getBytes()));
System.out.println("password_encoded ="+password_encoded);

httpclient.getState().setAuthenticationPreemptive(true);
UsernamePasswordCredentials credentials = new UsernamePasswordCredentials();
credentials.setPassword(username_encoded);
credentials.setUserName(password_encoded);

httpclient.getState().setCredentials("FORM","http://www.testabc.com/api/searches.xml",credentials); // I am not sure which one to use here..

try{
int rCode = httpclient.executeMethod(postmethod);
System.out.println("rCode is" +rCode);

if(rCode == HttpStatus.SC_NOT_IMPLEMENTED)
{
System.err.println("The Post postmethod is not implemented by this URI");
postmethod.getResponseBodyAsString();
}
else if(rCode == HttpStatus.SC_NOT_ACCEPTABLE) {
System.out.println(postmethod.getResponseBodyAsString());
}
else {
bufferedreader = new BufferedReader(new InputStreamReader(postmethod.getResponseBodyAsStream()));
String readLine;
while(((readLine = bufferedreader.readLine()) != null)) {
System.out.println("return value " +readLine);
}
}
} catch (Exception e) {
System.err.println(e);
} finally {
postmethod.releaseConnection();
if(bufferedreader != null) try { bufferedreader.close(); } catch (Exception fe) fe.printStackTrace(); } } }
}

使用它我得到 rCode 的返回值为“406”。为什么我会收到“ Not Acceptable ”的响应 任何可以帮助我更好地调试并解决此问题的内容。

最佳答案

考虑使用记录请求和响应的代理。类似于 VisualProxy会做。我没有使用它,因为当我需要一个时我自己写了一个。我的只是将请求写为页面正文。

关于java - 在 httpclient : java 中编写的 curl 等效代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5173251/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com