草庐IT

Android Studio——Android网络请求之GET与POST

小徐加油 2023-06-07 原文

1.URI与URL

  • URI(Uniform Resource Identifier,统一资源标志符),表示web上的每一种可用资源,具体的东西例如HTML文档,图像、视频、程序等。
  • URL(Uniform Resource Locator,统一资源定位器),也就是网络地址。
  • URL是URI的一种。
  • URI是对网络资源更宽泛的一种标识。
  • URL通常指的是网络连接,更多以http://www开头。

2.申请一个天气的免费API

  • 网址:https://www.yiketianqi.com/index/doc,登陆后会自动生成属于自己的appid和appsecret

2.GET请求

  • 主要目的:从服务端获取符合条件的数据。
  • 会向服务端发送少量数据,携带的参数会拼接在URL后面,参数是少量而有限的
  • GET请求的URL举例:https://www.tianqiapi.com/free/day?cityid=10010&cityname=北京&data=20220728
  • 协议(https://)域名及端口(www.tianqiapi.com:80) 路径(/free/day)条件(cityid=10010&cityname=北京&data=20220728)

NetUtil程序如下:

public class NetUtil{
	public static String BASE_URL="https://v0.yiketianqi.com/free/day";
	public static String APP_ID="14846972";
	public static String APP_SECRET="Guya4Gz2";

	public static String doGet(String url){ 
		BufferedReader reader = null;
		String bookHSONString = null;
		try{
			//1.HttpURLConnection建立连接
			HttpURLConnection httpURLConnection = null;
			URL requestUrl = new URL(url);
			httpURLConnection = (HttpURLConnection)requestUrl.openconnection();//打开连接
			httpURLConnection.setRequestMethod("GET");//两种方法GET/POST
			httpURLConnection.setConnectionTimeout(5000);//设置超时连接时间
			httpURLConnection.connect();
			
			//2.InputStream获取二进制流
			InputStream inputstream = httpURLConnection.getInputStream();
			
			//3.InputStreamReader将二进制流进行包装成BufferedReader
			reader = new BufferedReader(new InputStreamReader(inputStream));
		
			//4.从BufferedReader中读取String字符串,用StringBulider接收
			StringBulider bulider = new StringBulider();
			
			String line;
			while((line=reader.readLine())!=null){
				bulider.append(line);
				bulider.append("\n");
				}
			
			if(bulider.length()==0)
			{
				return null;
			}
			
			//5.StringBulider将字符串进行拼接
			bookJSONString = bulider.toString();
			
			}catch(MalformedURLException e){
			e.printStackTrace();
			}finally {
            // 关闭连接
            if (urlConnection != null) {
                urlConnection.disconnect();
            }
            if (reader != null) {
                try {
                    reader.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
		return bookJSONString;
		}

	public static String getWeatherOfCity(String city){
		//拼接处get请求的url
		String weatherUrl = BASE_URL+"?"+"appid="+APP_ID+"&"+"appsecret="+APP_SECRET+"&"+"city="+city;
		//打印上面的url
		Log.d("fan","-----weatherUrl----"+weatherUrl);

		//调用上文所写的doGet方法,传参
		String weatherResult = doGet(weatherUrl);
		return decodeUnicode(weatherResult);
	}
	
	//解码Unicode,将其转化为我们认识的汉字
	public static String decodeUnicode(String unicodeStr) {
        if (unicodeStr == null) {
            return null;
        }
        StringBuffer retBuf = new StringBuffer();
        int maxLoop = unicodeStr.length();
        for (int i = 0; i < maxLoop; i++) {
            if (unicodeStr.charAt(i) == '\\') {
                if ((i < maxLoop - 5) && ((unicodeStr.charAt(i + 1) == 'u') || (unicodeStr.charAt(i + 1) == 'U')))
                    try {
                        retBuf.append((char) Integer.parseInt(unicodeStr.substring(i + 2, i + 6), 16));
                        i += 5;
                    } catch (NumberFormatException localNumberFormatException) {
                        retBuf.append(unicodeStr.charAt(i));
                    }
                else
                    retBuf.append(unicodeStr.charAt(i));
            } else {
                retBuf.append(unicodeStr.charAt(i));
            }
        }
        return retBuf.toString();
    }
}

MainActivity.java程序如下:

public class MainActivity extends AppCompatActivity{
	private TextView tvContent;
	
	//此处写一个handler程序
	private Handler mHandler = new Handler(Looper.myLooper()){
		@Override
		public void handleMessage(@NonNull Message msg){
		super.handlerMessage(msg);

		if(msg.what==0){
			String strData = (String)msg.obj;
			tvContent.setText(strData);
			Toast.makeText(MainActivity.this,"主线程收到网络消息啦!",Toast.LENGTH_SHORT).show();
			}
		}
	};
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        tvContent = findViewById(R.id.tv_content);
    }
    
    public void start(View view){
    	//做一个耗时任务
    	new Thread(new Runnable(){
    		@Override
    		public void run(){
    			String stringFormNet = getStringFormNet();
    			
    			//使用handler来发送消息
				Message message = new Message();
				message.what = 0;//用于区分是谁发的消息
    			message.obj = stringFormNet;
    			mHandler.sendMessage(meaasge);
    			
    			}
    		}).start();
    		Toast.makeText(MainActivity.this,"开启子线程请求网络!",Toast.LENGTH_SHORT).show();
    		}
    		
    private String getStringFormNet(){
		//从网络上获取字符串
		return NetUtil.getWeatherofCity("深圳");
	}
}

运行结果:

3.POST请求

  • 主要目的:向服务端提交数据
  • 也会接收少量服务端的响应数据,携带的参数会单独放到map中,参数是大量的。
  • POST请求的URL举例: https://www.tianqiapi.com/free/day+Map<String,String><city_id,1010><city_name,北京><date,20220728>

有关Android Studio——Android网络请求之GET与POST的更多相关文章

  1. ruby - Facter::Util::Uptime:Module 的未定义方法 get_uptime (NoMethodError) - 2

    我正在尝试设置一个puppet节点,但ruby​​gems似乎不正常。如果我通过它自己的二进制文件(/usr/lib/ruby/gems/1.8/gems/facter-1.5.8/bin/facter)在cli上运行facter,它工作正常,但如果我通过由ruby​​gems(/usr/bin/facter)安装的二进制文件,它抛出:/usr/lib/ruby/1.8/facter/uptime.rb:11:undefinedmethod`get_uptime'forFacter::Util::Uptime:Module(NoMethodError)from/usr/lib/ruby

  2. ruby - 如何模拟 Net::HTTP::Post? - 2

    是的,我知道最好使用webmock,但我想知道如何在RSpec中模拟此方法:defmethod_to_testurl=URI.parseurireq=Net::HTTP::Post.newurl.pathres=Net::HTTP.start(url.host,url.port)do|http|http.requestreq,foo:1endresend这是RSpec:let(:uri){'http://example.com'}specify'HTTPcall'dohttp=mock:httpNet::HTTP.stub!(:start).and_yieldhttphttp.shou

  3. ruby-on-rails - rails : How to make a form post to another controller action - 2

    我知道您通常应该在Rails中使用新建/创建和编辑/更新之间的链接,但我有一个情况需要其他东西。无论如何我可以实现同样的连接吗?我有一个模型表单,我希望它发布数据(类似于新View如何发布到创建操作)。这是我的表格prohibitedthisjobfrombeingsaved: 最佳答案 使用:url选项。=form_for@job,:url=>company_path,:html=>{:method=>:post/:put} 关于ruby-on-rails-rails:Howtomak

  4. ruby-on-rails - Rails HTML 请求渲染 JSON - 2

    在我的Controller中,我通过以下方式在我的index方法中支持HTML和JSON:respond_todo|format|format.htmlformat.json{renderjson:@user}end在浏览器中拉起它时,它会自然地以HTML呈现。但是,当我对/user资源进行内容类型为application/json的curl调用时(因为它是索引方法),我仍然将HTML作为响应。如何获取JSON作为响应?我还需要说明什么? 最佳答案 您应该将.json附加到请求的url,提供的格式在routes.rb的路径中定义。这

  5. ruby - 有人可以帮助解释类创建的 post_initialize 回调吗 (Sandi Metz) - 2

    我正在阅读SandiMetz的POODR,并且遇到了一个我不太了解的编码原则。这是代码:classBicycleattr_reader:size,:chain,:tire_sizedefinitialize(args={})@size=args[:size]||1@chain=args[:chain]||2@tire_size=args[:tire_size]||3post_initialize(args)endendclassMountainBike此代码将为其各自的属性输出1,2,3,4,5。我不明白的是查找方法。当一辆山地自行车被实例化时,因为它没有自己的initialize方法

  6. ruby - 用 Ruby 编写一个简单的网络服务器 - 2

    我想在Ruby中创建一个用于开发目的的极其简单的Web服务器(不,不想使用现成的解决方案)。代码如下:#!/usr/bin/rubyrequire'socket'server=TCPServer.new('127.0.0.1',8080)whileconnection=server.acceptheaders=[]length=0whileline=connection.getsheaders想法是从命令行运行这个脚本,提供另一个脚本,它将在其标准输入上获取请求,并在其标准输出上返回完整的响应。到目前为止一切顺利,但事实证明这真的很脆弱,因为它在第二个请求上中断并出现错误:/usr/b

  7. jquery - 我的 jquery AJAX POST 请求无需发送 Authenticity Token (Rails) - 2

    rails中是否有任何规定允许站点的所有AJAXPOST请求在没有authenticity_token的情况下通过?我有一个调用Controller方法的JqueryPOSTajax调用,但我没有在其中放置任何真实性代码,但调用成功。我的ApplicationController确实有'request_forgery_protection'并且我已经改变了config.action_controller.consider_all_requests_local在我的environments/development.rb中为false我还搜索了我的代码以确保我没有重载ajaxSend来发送

  8. ruby - 我如何添加二进制数据来遏制 POST - 2

    我正在尝试使用Curbgem执行以下POST以解析云curl-XPOST\-H"X-Parse-Application-Id:PARSE_APP_ID"\-H"X-Parse-REST-API-Key:PARSE_API_KEY"\-H"Content-Type:image/jpeg"\--data-binary'@myPicture.jpg'\https://api.parse.com/1/files/pic.jpg用这个:curl=Curl::Easy.new("https://api.parse.com/1/files/lion.jpg")curl.multipart_form_

  9. Get https://registry-1.docker.io/v2/: net/http: request canceled while waiting - 2

    1.错误信息:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:requestcanceledwhilewaitingforconnection(Client.Timeoutexceededwhileawaitingheaders)或者:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:TLShandshaketimeout2.报错原因:docker使用的镜像网址默认为国外,下载容易超时,需要修改成国内镜像地址(首先阿里

  10. 网络编程套接字 - 2

    网络编程套接字网络编程基础知识理解源`IP`地址和目的`IP`地址理解源MAC地址和目的MAC地址认识端口号理解端口号和进程ID理解源端口号和目的端口号认识`TCP`协议认识`UDP`协议网络字节序socket编程接口`sockaddr``UDP`网络程序服务器端代码逻辑:需要用到的接口服务器端代码`udp`客户端代码逻辑`udp`客户端代码`TCP`网络程序服务器代码逻辑多个版本服务器单进程版本多进程版本多线程版本线程池版本服务器端代码客户端代码逻辑客户端代码TCP协议通讯流程TCP协议的客户端/服务器程序流程三次握手(建立连接)数据传输四次挥手(断开连接)TCP和UDP对比网络编程基础知识

随机推荐