不登录CSDN就获取需要登陆的JSON数据 (已解决)

通过Fiddler抓取到CSDN的Android客户端的请求接口后,在访问接口时,有些是不用登陆就可以查看的,而有些是需要登陆才能查看的,不需要登陆的接口,直接通过Http链接直接访问便可以拿到数据,如查询我的博客的前20条博文的链接http://ms.csdn.net/api/blog/user_blog_list?SessionId=IhO4aEgYT6HTOI%2FiWRVgl6rHVJHLQUKkQAIzJ1Be1zsXbYiSdAyKLGcjve5x%2BxmTrrN8sBjCE7CLok6tso2z3g%3D%3D&username=zml_2015&page=1&pagesize=20 就可以直接拿到数据,如下图:(在新标签中打开下面图片可查看大图)

但是如果需要登陆才能访问到的接口,如http://ms.csdn.net/api/blog/columnlist?SessionId=IhO4aEgYT6HTOI%2FiWRVgl6rHVJHLQUKkQAIzJ1Be1zsXbYiSdAyKLGcjve5x%2BxmTrrN8sBjCE7CLok6tso2z3g%3D%3D&page=1&size=20&username=zml_2015 直接访问这个Http链接的时候,就会返回:

 

{
code: 4001,
message: "没有登录",
data: null,
sessionId: "",
sessionExpired: "1474449502008"
}


解决方案:

 

在请求头中加两对参数:

                        platform: android
version: 1.9.6

下面给出一个Java的网络请求实例:

 

import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

import com.sun.xml.internal.messaging.saaj.util.ByteOutputStream;

/**
 * @author zml2015
 * @Time:2016年9月19日 下午8:15:11
 * @version 1.0
 */
public class Main {

	public static void main(String[] args) throws Exception {
		URL url = new URL(
				"http://ms.csdn.net/api/blog/columnlist?SessionId=IhO4aEgYT6HTOI%2FiWRVgl6rHVJHLQUKkQAIzJ1Be1zsXbYiSdAyKLGcjve5x%2BxmTrrN8sBjCE7CLok6tso2z3g%3D%3D&page=1&size=20&username=zml_2015");
		HttpURLConnection connection = (HttpURLConnection) url.openConnection();
		connection.setRequestMethod("GET");
		connection.setRequestProperty("platform", "android");
		connection.setRequestProperty("version", "1.9.6");
		// connection.setRequestProperty("User-Agent",
		// "Dalvik/2.1.0 (Linux; U; Android 6.0; H60-L01 Build/HDH60-L01)");
		// connection.setRequestProperty("Host", "ms.csdn.net");
		// connection.setRequestProperty("Connection", "Keep-Alive");
		// connection.setRequestProperty("Accept-Encoding", "gzip");

		InputStream is = connection.getInputStream();

		String string = new String(is2bytes(is), "utf8");
		System.out.println(string);
	}

	public static byte[] is2bytes(InputStream is) throws IOException {
		byte[] buffer = new byte[1024];

		ByteOutputStream bos = new ByteOutputStream();
		@SuppressWarnings("unused")
		int len = 0;
		while ((len = is.read(buffer)) != -1) {
			bos.write(buffer, 0, len);
		}
		bos.flush();

		return bos.getBytes();
	}
}

 

 

 

 

 

得到的数据格式化后的效果图为:

 
要通过HttpServletRequest获取JSON数据,可以使用以下方法之一: 方法一:使用getParameter方法获取JSON字符串,然后将其转换为JSONObject对象。 ```java String jsonString = request.getParameter("jsonString"); JSONObject json = new JSONObject(jsonString); ``` 这将通过getParameter方法获取名为"jsonString"的请求参数,然后将其转换为JSONObject对象。 方法二:使用getInputStream方法获取请求的输入流,然后将其转换为JSON对象。 ```java InputStream inputStream = request.getInputStream(); BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, "UTF-8")); StringBuilder sb = new StringBuilder(); String line; while ((line = reader.readLine()) != null) { sb.append(line); } JSONObject json = new JSONObject(sb.toString()); ``` 这将通过getInputStream方法获取请求的输入流,然后按行读取输入流中的内容并拼接为一个字符串,最后将字符串转换为JSONObject对象。 请注意,以上方法适用于POST请求。对于GET请求,可以使用getQueryString方法获取查询字符串,然后将其转换为JSONObject对象。示例如下: ```java String queryString = request.getQueryString(); JSONObject json = new JSONObject(queryString); ``` 以上是获取JSON数据的几种常见方法,根据具体情况选择适合的方法进行实现。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [HttpServletRequest--获取json数据](https://blog.csdn.net/qq_44691484/article/details/108266679)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] - *2* [HttpServletRequest 接收并解析获取JSON数据](https://blog.csdn.net/weixin_34226182/article/details/89551738)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值