使用CURL模拟Java setRequestProperty进行RESTful身份验证

使用CURL模拟Java setRequestProperty进行RESTful身份验证,java,rest,authentication,curl,restful-authentication,Java,Rest,Authentication,Curl,Restful Authentication,我不懂Java,而且我还没有成功地使用Google或试错测试 仅在命令行上使用CURL进行RESTful API身份验证,我将如何编写这篇文章?(php或perl解决方案也可以) 这段代码来自文档,但我不打算使用Java,也不需要翻译它 URL=新URL(“http://www.thingsandstuff.com/resfulness/post"); HttpURLConnection conn=(HttpURLConnection)url.openConnection(); //我不知道这是

我不懂Java,而且我还没有成功地使用Google或试错测试

仅在命令行上使用CURL进行RESTful API身份验证,我将如何编写这篇文章?(php或perl解决方案也可以)

这段代码来自文档,但我不打算使用Java,也不需要翻译它

URL=新URL(“http://www.thingsandstuff.com/resfulness/post");
HttpURLConnection conn=(HttpURLConnection)url.openConnection();
//我不知道这是否与我的问题有关。。。
conn.setRequestMethod(“POST”);
conn.setDoInput(真);
连接设置输出(真);
conn.setRequestProperty(“内容类型”、“应用程序/x-www-form-urlencoded”);
//这就是我认为可能存在的问题。。。
字符串userNamePassword=“myusername:mypassword”;
用户名密码=
新字符串(org.apache.commons.codec.binary.Base64.encodeBase64(用户名密码
.getBytes());
conn.setRequestProperty(“授权”,用户名密码);
我总是犯错误

我只是在玩header参数
-H
。我不知道我所做的是否不起作用,因为我确实没有正确地进行身份验证,或者是其他原因。数据是xml,我正在用一些非常简单/直接的东西进行测试。我假设即使我的data/xml/post不正确,它也会返回一个错误,而不是未经授权的错误

#bxl1c2vybmftztptexbhbc3n3b3jk==myusername:mypassword base64 encoded。。。。
卷曲-H“BXL1C2VYBMFTZTPTEXTBHC3N3B3JK”-d“-X柱http://www.thingsandstuff/restfulness/post 
卷曲-H“BXL1C2VYBMFTZTPTEXTBHC3N3B3JK”-d“-X柱http://www.thingsandstuff/restfulness/post 
#就像这样。。。有编码的东西和没有编码的东西。。。
卷曲-d”“-X柱http://user:password@www.thingsandstuff.com/restfulness/post
curl-u用户:密码-d”“-X POSThttp://www.thingsandstuff.com/restfulness/post
对于这三个,我试着只对密码进行编码,两个都是一起编码,两个都是分开编码,两个都不是。。。我确信我的用户名有一个
\
,密码以一个
结尾是没有帮助的

并且表示
-d
将导致curl使用content-type应用程序/x-www-form-urlencoded
将数据传递到服务器,因此这意味着我不需要传递一个额外的标题来表示内容类型,对吗?基本上。。。我只知道我正在做的事情的一部分,但它不起作用,还有太多的事情我不知道,不足以孤立我的问题,甚至可能纠正它(是的,只是足够危险)

您获得401的原因是授权头需要一个方案前缀,在您的情况下
Basic

因此,目前您正在发送

Authorization: <base64(username:password)>

好吧,这就是我的结局

curl-H“授权:dXNlclxuYW1lOnBhc3N3b3JkIQ==”-X POST-d'数据=%3C%3Fxml+版本….'http://www.stuffandthings.com:8080/restfulness/post
所以
username:password
是base 64编码的。数据由ISO/IEC 8859-1编码,并以“data=”此特定集合restful服务作为前缀

我最终把它放在PHP中,只是因为这样更容易进行连续测试。这就是最终为之工作的原因

$user='user\\name';
$pass='password!';
$userpass=base64_encode($user.':'.$pass);
$url='1http://www.thingsandstuff.com:8080/restfulness/post';  
if($handle=fopen(“foo.csv”,“r”)!==FALSE)
{
while(($data=fgetcsv($handle,1000,“,”)!==FALSE)
{ 
列表($thing1,$thing2)=$data;
$xml=”
$1
$2
";
$datums='data='.utf8_解码($xml);
$result=do_curl($url,$datums);
//现在还没有使用响应
//重点…只是浏览了所有的东西
var_dump($结果);
}
fclose($handle);
} 
函数do_curl($url,$data){
全局$userpass,$user,$pass;
$ch=curl_init();
$header=array('授权:'。$userpass,
'内容类型:application/x-www-form-urlencoded',
'内容长度:'.strlen($data));
//这一行是在它起作用之前最后添加的内容
//我没有重试,删除了$header中的身份验证
//看看这是不是唯一需要的东西。。。
curl_setopt($ch,CURLOPT_USERPWD,$user.':'.$pass);
curl_setopt($ch,CURLOPT_URL,$URL);
curl_setopt($ch,CURLOPT_HEADER,$HEADER);
curl_setopt($ch,CURLINFO_HEADER_OUT,true);
curl_setopt($ch,CURLOPT_NOBODY,true);
curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);
curl_setopt($ch,CURLOPT_POST,true);
curl_setopt($ch,CURLOPT_POSTFIELDS,$data);
$result=curl\u exec($ch);
$status=curl\u getinfo($ch,CURLINFO\u HTTP\u代码);
$hout=curl\u getinfo($ch,CURLINFO\u HEADER\u OUT);
//echo“\n”变量转储($hout);echo“\n”;
卷曲关闭($ch);
返回数组('status'=>$status,'result'=>$result);
} 
如果我从
do\u curl
函数中
var\u dump($hout)
。。。实际发送的标头为:

POST/resfully/POST HTTP/1.1
授权:基本dXNlclxuYW1lOnBhc3N3b3JkIQ==
主持人:www.thingsandstuff.com:8080
接受:*/*
内容长度:409
内容类型:application/x-www-form-urlencoded
价值1
价值2

也许。。。我两个都要做<代码>-u
-H
?这是真的吗?我没有使用Java,所以不能使用
conn.setRequestProperty
Authorization: Basic <base64(username:password)>
conn.setRequestProperty("Authorization", "Basic " + userNamePassword);