我正在创建一个Android应用,该应用使用其REST API从WordPress网站获取其数据。但是到目前为止,由于缺乏资源,我无法解决这个问题。
因此,到目前为止,我只是想以JSON格式下载WordPress数据,将其保存在本地,然后使用它来解析并填充应用程序中的内容。是否有一个流程或插件可以帮助我下载JSON格式的WordPress文章?
答案 0 :(得分:0)
您可以下载CSV格式的文章并将其转换为JSON,有在线工具可以做到这一点。或者您可以使用插件以JSON格式下载:https://wordpress.org/plugins/hiweb-export-posts/
答案 1 :(得分:0)
我认为在JSON中检索Wordpress数据的一个好的解决方案是使用REST API。使用API,您将能够检索JSON格式的帖子,类别,标签,评论等。
上查看REST API参考。答案 2 :(得分:0)
默认情况下,WordPress REST API输出JSON,因此您不需要任何插件。
您没有说是在应用程序中使用Java还是Kotlin,因此我在Java中创建了一个有效的示例,只是为了让更多用户使用它。我试图使代码尽可能简单,而不使用任何第三方库进行联网和JSON解析。
具有联网权限的清单文件。需要联网:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="com.example.wordpressfetchdata">
<uses-permission android:name="android.permission.INTERNET"/>
<application
android:allowBackup="false"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme"
tools:ignore="GoogleAppIndexingWarning">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
</application>
</manifest>
主要活动:
public class MainActivity extends AppCompatActivity {
private static final String TAG = MainActivity.class.getSimpleName();
private static final String WORDPRESS_SITE_URL = "http://10.0.2.2/wordpress"; //Use http://10.0.2.2 to access Wordpress running on localhost from emulator on same PC
private static final String WORDPRESS_REST_API_URL = WORDPRESS_SITE_URL + "/wp-json/wp/v2";
private static final String WORDPRESS_REST_API_POSTS_URL = WORDPRESS_REST_API_URL + "/posts";
private static final String NEW_LINE = "\n";
private TextView contentView;
private LoadWordpressPostsTask loadWordpressPostsTask;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
contentView = findViewById(R.id.content);
loadPostsFromWordpress();
}
private void loadPostsFromWordpress() {
//Create a AsyncTask which will load data on a background thread
loadWordpressPostsTask = new LoadWordpressPostsTask();
loadWordpressPostsTask.setListener(new LoadWordpressPostsTask.LoadListener() {
@Override
public void onLoadSuccess(List<WordpressPost> data) {
showPosts(data);
}
@Override
public void onLoadFailure(String errorMessage) {
showLoadError(errorMessage);
}
});
loadWordpressPostsTask.execute(WORDPRESS_REST_API_POSTS_URL);
}
private void showLoadError(String errorMessage) {
if (contentView != null) {
contentView.setText(errorMessage);
}
}
private void showPosts(List<WordpressPost> posts) {
if (contentView != null) {
int numPosts = posts.size();
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append(String.format(Locale.getDefault(), "Loaded %d posts from Wordpress", numPosts));
stringBuilder.append(NEW_LINE);
for (WordpressPost post : posts) {
stringBuilder.append(NEW_LINE);
stringBuilder.append("Title: ");
stringBuilder.append(post.getTitle());
stringBuilder.append(NEW_LINE);
stringBuilder.append("Content: ");
stringBuilder.append(post.getContent());
}
contentView.setText(stringBuilder.toString());
}
}
@Override
protected void onDestroy() {
//Remove listener and AsyncTask to avoid memory leak
if (loadWordpressPostsTask != null) {
loadWordpressPostsTask.setListener(null);
loadWordpressPostsTask = null;
}
super.onDestroy();
}
private static class LoadWordpressPostsTask extends AsyncTask<String, Void, LoadWordpressPostsTask.LoadResult> {
private LoadListener listener;
interface LoadListener {
void onLoadSuccess(List<WordpressPost> result);
void onLoadFailure(String errorMessage);
}
void setListener(LoadListener listener) {
this.listener = listener;
}
class LoadResult {
private List<WordpressPost> posts;
private String errorMessage;
LoadResult(List<WordpressPost> posts) {
this.posts = posts;
}
LoadResult(String errorMessage) {
this.errorMessage = errorMessage;
}
boolean hasError() {
return errorMessage != null;
}
}
@Override
protected LoadResult doInBackground(String... urls) {
LoadResult result = null;
if (!isCancelled() && urls != null && urls.length > 0) {
String urlString = urls[0];
try {
String jsonData = loadJsonDataFromWordpress(urlString);
Log.d(TAG, String.format(Locale.getDefault(), "Got data from %s : %s", urlString, jsonData));
if (!isCancelled()) {
List<WordpressPost> posts = parseJsonData(jsonData);
result = new LoadResult(posts);
}
} catch (IOException | JSONException e) {
result = new LoadResult(e.getMessage());
}
}
return result;
}
private List<WordpressPost> parseJsonData(String jsonData) throws JSONException {
List<WordpressPost> wordpressPosts = new ArrayList<>();
JSONArray posts = new JSONArray(jsonData);
for (int i = 0; i < posts.length(); i++) {
//For response properties see: https://developer.wordpress.org/rest-api/reference/posts/#schema
JSONObject postObject = posts.getJSONObject(i);
JSONObject titleObject = postObject.getJSONObject("title");
String title = titleObject.getString("rendered");
JSONObject contentObject = postObject.getJSONObject("content");
String content = contentObject.getString("rendered");
WordpressPost wordpressPost = new WordpressPost(title, content);
wordpressPosts.add(wordpressPost);
}
return wordpressPosts;
}
@Override
protected void onPostExecute(LoadResult result) {
if (!isCancelled() && listener != null) {
if (result != null) {
if (result.hasError()) {
listener.onLoadFailure(result.errorMessage);
} else {
List<WordpressPost> posts = result.posts;
listener.onLoadSuccess(posts);
}
} else {
listener.onLoadFailure("No result!");
}
}
}
private String loadJsonDataFromWordpress(String urlString) throws IOException {
String jsonData = null;
HttpURLConnection connection = null; //Change this to HttpsURLConnection when using HTTPS, which you should be using!
try {
URL url = new URL(urlString);
connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("GET");
connection.connect();
int responseCode = connection.getResponseCode();
if (responseCode != HttpURLConnection.HTTP_OK) {
throw new IOException("HTTP error code: " + responseCode);
}
try (InputStream stream = connection.getInputStream()) {
if (stream != null) {
Reader inputStreamReader = new InputStreamReader(stream, StandardCharsets.UTF_8);
try (BufferedReader bufferedReader = new BufferedReader(inputStreamReader)) {
StringBuilder buffer = new StringBuilder();
String line;
while ((line = bufferedReader.readLine()) != null) {
buffer.append(line);
}
jsonData = buffer.toString();
}
}
}
} finally {
if (connection != null) {
connection.disconnect();
}
}
return jsonData;
}
}
}
用您的Wordpress网站的URL替换 WORDPRESS_SITE_URL 。
用于保存Wordpress发布数据的POJO类:
public class WordpressPost {
private final String title;
private final String content;
WordpressPost(String title, String content) {
this.title = title;
this.content = content;
}
public String getTitle() {
return title;
}
public String getContent() {
return content;
}
}
MainActivity布局文件:
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<TextView
android:id="@+id/content"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="16dp"/>
</android.support.constraint.ConstraintLayout>