我是 Magento 的新手。我想在 Android 上使用 Magento Rest API。我得到了 oAuth_token 和 oauth_verifier。传递 oAuth_token 和 oauth_verifier 后,我收到错误。无效的身份验证/错误请求(收到 400,预期 HTTP/1.1 20X 或重定向)
<br/>oauth_problem=parameter_absent&oauth_parameters_absent=oauth_verifier.
这是我的代码:
<?php
ini_set('display_errors', '1');
$callbackUrl_1 = "http://demo.com/magento.com/admin123.php";
$callbackUrl = "http://demo.com/magento.com/sendToken.php";
$temporaryCredentialsRequestUrl = "http://demo.com/magento.com/oauth/initiate?oauth_callback=" . urlencode($callbackUrl);
//$adminAuthorizationUrl = 'http://demo.com/magento.com/admin123/oAuth_authorize';
$adminAuthorizationUrl = 'http://demo.com/magento.com/oauth/authorize';
$accessTokenRequestUrl = 'http://demo.com/magento.com/oauth/token';
$apiUrl = 'http://demo.com/magento.com/api/rest';
$consumerKey = '88a6142021c1cdfed92b0954a94fc066';
$consumerSecret = 'bedc0ede692fe06d4b12821bb21f7c3b';
session_start();
//echo "SESSION state".$_SESSION['state'];
if (!isset($_GET['oauth_token']) && isset($_SESSION['state']) && $_SESSION['state'] == 1) {
$_SESSION['state'] = 0;
}
try {
$authType = ($_SESSION['state'] == 2) ? OAUTH_AUTH_TYPE_AUTHORIZATION : OAUTH_AUTH_TYPE_URI;
$oauthClient = new OAuth($consumerKey, $consumerSecret, OAUTH_SIG_METHOD_HMACSHA1, $authType);
$oauthClient->enableDebug();
if (!isset($_GET['oauth_token']) && !$_SESSION['state']) {
$requestToken = $oauthClient->getRequestToken($temporaryCredentialsRequestUrl);
$_SESSION['secret'] = $requestToken['oauth_token_secret'];
$_SESSION['state'] = 1;
//echo "oauth_token ".$requestToken['oauth_token']."<br>";
//echo "oauth_token_secret ".$requestToken['oauth_token_secret'];die;
header('Location: ' . $adminAuthorizationUrl . '?oauth_token=' . $requestToken['oauth_token']."&oauth_token_secret=".$requestToken['oauth_token_secret']);
exit;
} else if ($_SESSION['state'] == 1) {
// echo "oauth_token ".$_GET['oauth_token'];die;
$oauthClient->setToken($_GET['oauth_token'],$_SESSION['oauth_verifier']);
$accessToken = $oauthClient->getAccessToken($accessTokenRequestUrl);
$_SESSION['state'] = 2;
$_SESSION['token'] = $accessToken['oauth_token'];
$_SESSION['secret'] = $accessToken['oauth_token_secret'];
$_SESSION['example'] = $accessToken['oauth_token'];
header('Location: ' . $callbackUrl);
exit;
} else {
$_SESSION['state'] = 0;
$oauthClient->setToken($_SESSION['token'], $_SESSION['secret']);
$resourceUrl = "$apiUrl/products";
$oauthClient->fetch($resourceUrl,array(), 'GET', array('Content-Type' => 'application/json', 'Accept' => 'application/json'));
$productsList = json_decode($oauthClient->getLastResponse());
print_r($productsList);
}
} catch (OAuthException $e) {
print_r($e->getMessage());
echo "<br/>";
print_r($e->lastResponse);
}
?>
调用restful webservice的完整示例 RestFulWebservice.java这个活动类
public class RestFulWebservice extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.rest_ful_webservice);
final Button GetServerData = (Button) findViewById(R.id.GetServerData);
GetServerData.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
// WebServer url change it accordingly
String serverURL = "http://androidexample.com/media/webservice/JsonReturn.php";
// Use AsyncTask execute Method To Prevent ANR Problem
new LongOperation().execute(serverURL);
}
});
}
// Class with extends AsyncTask class
private class LongOperation extends AsyncTask<String, Void, Void> {
// Required initialization
private final HttpClient Client = new DefaultHttpClient();
private String Content;
private String Error = null;
private ProgressDialog Dialog = new ProgressDialog(RestFulWebservice.this);
String data ="";
TextView uiUpdate = (TextView) findViewById(R.id.output);
TextView jsonParsed = (TextView) findViewById(R.id.jsonParsed);
int sizeData = 0;
EditText serverText = (EditText) findViewById(R.id.serverText);
protected void onPreExecute() {
// NOTE: You can call UI Element here.
//Start Progress Dialog (Message)
Dialog.setMessage("Please wait..");
Dialog.show();
try{
// Set Request parameter
data +="&" + URLEncoder.encode("data", "UTF-8") + "="+serverText.getText();
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
// Call after onPreExecute method
protected Void doInBackground(String... urls) {
/************ Make Post Call To Web Server ***********/
BufferedReader reader=null;
// Send data
try
{
// Defined URL where to send data
URL url = new URL(urls[0]);
// Send POST data request
URLConnection conn = url.openConnection();
conn.setDoOutput(true);
OutputStreamWriter wr = new OutputStreamWriter(conn.getOutputStream());
wr.write( data );
wr.flush();
// Get the server response
reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));
StringBuilder sb = new StringBuilder();
String line = null;
// Read Server Response
while((line = reader.readLine()) != null)
{
// Append server response in string
sb.append(line + "
");
}
// Append Server Response To Content String
Content = sb.toString();
}
catch(Exception ex)
{
Error = ex.getMessage();
}
finally
{
try
{
reader.close();
}
catch(Exception ex) {}
}
/*****************************************************/
return null;
}
protected void onPostExecute(Void unused) {
// NOTE: You can call UI Element here.
// Close progress dialog
Dialog.dismiss();
if (Error != null) {
uiUpdate.setText("Output : "+Error);
} else {
// Show Response Json On Screen (activity)
uiUpdate.setText( Content );
/****************** Start Parse Response JSON Data *************/
String OutputData = "";
JSONObject jsonResponse;
try {
/****** Creates a new JSONObject with name/value mappings from the JSON string. ********/
jsonResponse = new JSONObject(Content);
/***** Returns the value mapped by name if it exists and is a JSONArray. ***/
/******* Returns null otherwise. *******/
JSONArray jsonMainNode = jsonResponse.optJSONArray("Android");
/*********** Process each JSON Node ************/
int lengthJsonArr = jsonMainNode.length();
for(int i=0; i < lengthJsonArr; i++)
{
/****** Get Object for each JSON node.***********/
JSONObject jsonChildNode = jsonMainNode.getJSONObject(i);
/******* Fetch node values **********/
String name = jsonChildNode.optString("name").toString();
String number = jsonChildNode.optString("number").toString();
String date_added = jsonChildNode.optString("date_added").toString();
OutputData += " Name : "+ name +"
"
+ "Number : "+ number +"
"
+ "Time : "+ date_added +"
"
+"--------------------------------------------------
";
}
/****************** End Parse Response JSON Data *************/
//Show Parsed Output on screen (activity)
jsonParsed.setText( OutputData );
} catch (JSONException e) {
e.printStackTrace();
}
}
}
}
}
rest_full_webservice.xml
<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:fillViewport="true"
android:background="#FFFFFF"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<EditText
android:paddingTop="20px"
android:id="@+id/serverText"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="" />
<Button
android:paddingTop="10px"
android:id="@+id/GetServerData"
android:text="Restful Webservice Call"
android:cursorVisible="true"
android:clickable="true"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
/>
<TextView
android:paddingTop="20px"
android:textStyle="bold"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Server Response (JSON): " />
<TextView
android:paddingTop="16px"
android:id="@+id/output"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Output : Click on button to get server data." />
<TextView
android:paddingTop="20px"
android:textStyle="bold"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Parsed JSON : " />
<TextView
android:paddingTop="16px"
android:id="@+id/jsonParsed"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
/>
</LinearLayout>
</ScrollView>
manifest.xml 不要忘记添加互联网权限
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
我认为您需要 OAUth 2.0, 您可以从 https://github.com/cbitstech/xsi-android 获取示例 抄写员库是做到这一点的最佳方法。
有关信息,请访问以下网址:-